将 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
我目前正在使用 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