将 Injector 别名从 Mustache_Engine 切换到 Twig

Switching Injector alias from Mustache_Engine to Twig

我目前正在使用 a tutorial to learn how to make a php project without a framework,这样我可以对框架有更多的了解。我已经研究过这个,但我被困在将注射器从 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);
});

但我得到的只是以下错误

LogicException

You must set a loader first.

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

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

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

第一种方式,只需将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);
});

第二种方式,添加别名$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 and also in changelog https://github.com/twigphp/Twig/blob/3.x/CHANGELOG#L447