首页 > 解决方案 > 将 Injector 别名从 Mustache_Engine 切换到 Twig

问题描述

我目前正在使用一个教程来学习如何在没有框架的情况下制作一个 php 项目,以便我可以更多地理解框架。我已经解决了这个问题,但我被困在一个点上,我要将喷油器从 Mustache_Engine 切换到 Twig

/**
 * Mustache Renderer
 */
/*$injector->alias('Todo\Template\Renderer', 'Todo\Template\MustacheRenderer');
$injector->define('Mustache_Engine', [
    ':options' => [
        'loader' => new Mustache_Loader_FilesystemLoader(dirname(__DIR__) . '/templates', [
            'extension' => '.html',
        ]),
    ],
]);*/

/**
 * Twig Environment
 */
$injector->alias('Todo\Template\Renderer', 'Todo\Template\TwigRenderer');
$injector->delegate('Twig_Environment', function () use ($injector) {
    $loader = new Twig_Loader_Filesystem(dirname(__DIR__) . '/templates');
    return new Twig_Environment($loader);
});

但我得到的只是以下错误

逻辑异常

您必须先设置加载程序。

我不知道如何解决这个问题,但我觉得我在这里做错了,因为很多人都看过这个教程。

为清晰起见编辑添加屏幕截图

我得到的错误截图

标签: phpframeworkstwigcomposer-phpmustache

解决方案


您可以通过 2 种不同的方式修复此错误。

第一种方式,只需替换Twig_Environment\Twig\Environment,这里是完整的示例代码:

/**
 * Twig Environment
 */
$injector->alias('Todo\Template\Renderer', 'Todo\Template\TwigRenderer');
$injector->delegate('\Twig\Environment', function () use ($injector) {
    $loader = new Twig_Loader_Filesystem(dirname(__DIR__) . '/templates');
    return new Twig_Environment($loader);
});

第二种方式,添加 alias $injector->alias(\Twig\Environment::class, 'Twig_Environment');,这里是完整的示例代码:

/**
 * Twig Environment
 */
$injector->alias('Todo\Template\Renderer', 'Todo\Template\TwigRenderer');
$injector->delegate('Twig_Environment', function () use ($injector) {
    $loader = new Twig_Loader_Filesystem(dirname(__DIR__) . '/templates');
    return new Twig_Environment($loader);
});
$injector->alias(\Twig\Environment::class, 'Twig_Environment');

您可以在此处找到有关此错误的更多信息:https ://github.com/twigphp/Twig/issues/2907

简而言之,关于错误:从版本 1.38.0 Twig 包开始使用命名空间类作为默认类(PSR-0 是别名)。您可以在此处找到更多详细信息https://github.com/twigphp/Twig/pull/2862以及更改日志https://github.com/twigphp/Twig/blob/3.x/CHANGELOG#L447


推荐阅读