0

我正在按照此处描述的步骤在 Slim https://github.com/slimphp/Twig-View/tree/3.1.0#usage中使用 twig-view但是当我尝试时屏幕上出现以下错误使用 TwigExtension 中使用的任何模板函数

Fatal error: Uncaught Twig\Error\SyntaxError: Unknown "url_for" function.

我已经$ composer require slim/twig-view:^3.0成功运行了,我的 composer.json 文件是这样的

"require": {
        "slim/slim": "4.*",
        "slim/psr7": "^1.2",
        "league/container": "^3.3",
        "slim/twig-view": "^3.0"
    },

这是我的代码

require_once __DIR__ . '/../vendor/autoload.php';

$container = new \Slim\Factory\Container();
\Slim\Factory\AppFactory::setContainer($container);

$container->add('view', function () {
    return \Slim\Views\Twig::create(__DIR__ . '/views', [
        'cache' => false,
    ]);
});

$app = \Slim\Factory\AppFactory::create();
$app->add(\Slim\Views\TwigMiddleware::createFromContainer($app));

require_once __DIR__ . '/../routes.php';


// routes.php
$app->get('/', function ($request, $response, $args) use ($container) {
    return $container->get('view')->render($response, 'home.twig', ['foo' => 'test']);
})->setName('home');

// home.twig
...
<body>
    Home {{ foo }}
    <br>
    <a href="{{ url_for('about') }}">About</a>
</body>
...

如果我url_for从树枝模板中删除 ,则页面在浏览器上加载正常。我试图在我的代码库和供应商文件夹中搜索 TwigExtension,但找不到任何类似的文件。我在这里做错了吗?

4

1 回答 1

0

看起来是因为联盟容器。每次调用函数时似乎都在创建一个新的 Twig 实例,每次都$container->get('view')返回一个新实例,而不是引用同一个实例。所以解决方法是

$twig = \Slim\Views\Twig::create(__DIR__ . '/views', [
    'cache' => false,
]);

$container->add('view', function () use (&$twig) {
    return $twig;
});

// Or this instead
$container->add(
    'view', 
    \Slim\Views\Twig::create(__DIR__ . '/views', [
        'cache' => false,
    ])
);
于 2020-08-28T09:07:40.783 回答