如何将通用模型添加到Twig和Slim4

如何将通用模型添加到Twig和Slim4,twig,slim-4,Twig,Slim 4,我将Twig和Slim4与DI容器一起使用(与本教程相同:)。 我想知道如何将公共模型添加到我的所有细枝视图中,例如用户对象、常规选项等 这是容器细枝初始化: TwigMiddleware::class => function (ContainerInterface $container) { return TwigMiddleware::createFromContainer($container->get(App::class), Twig::class); }, //

我将Twig和Slim4与DI容器一起使用(与本教程相同:)。 我想知道如何将公共模型添加到我的所有细枝视图中,例如用户对象、常规选项等

这是容器细枝初始化:

TwigMiddleware::class => function (ContainerInterface $container) {
    return TwigMiddleware::createFromContainer($container->get(App::class), Twig::class);
},

// Twig templates
Twig::class => function (ContainerInterface $container) {
    $config = $container->get(Configuration::class);
    $twigSettings = $config->getArray('twig');        
    $twig = Twig::create($twigSettings['path'], $twigSettings['settings']);
    return $twig;
},

twig中间件是Slim标准中间件:Slim\Views\TwigMiddleware

您可以将全局变量添加到twig环境中,以便在所有模板文件中都可以访问它们:

(为了能够提供一个示例代码,我假设您已经定义了一个像
user authentication service
这样的服务,它能够解析当前用户)

//细枝模板
Twig::class=>函数(ContainerInterface$container){
//...        
$twig=twig::create($twigSettings['path'],$twigSettings['settings']);
$twig->getEnvironment()->addGlobal(
“常规设置”,
[
“站点名称”=>“我的个人网站”,
'联系人信息'=>'me@example.com'
]);
$twig->getEnvironment()->addGlobal(
“当前用户”,
//假设它返回当前用户
$container->get('user-authentication-service')->getCurrentUser()
);
返回$twig;
},

现在您可以在所有模板文件中访问
常规设置
当前用户

谢谢您的解释!但是这个代码什么时候被计算?在th route dispatch之前?只要DI需要解析
Twig
的实例,就会对其进行评估。看看你问题中的代码,我想说的是,当你想将
TwigMiddleware
添加到你的应用程序时。这个例子只演示了如何将一个全局可访问的变量添加到Twig环境中,但如果您的评论是关于将代码放在何处,我可能会说是在中间件中。这使您能够更好地控制处理每个请求的中间件的顺序,因此,例如,您可以确保在尝试将用户对象定义为全局变量之前,
用户对象实际可用。是否将全局对象放在模板呈现之前,而不是放在中间件内部?(据我所知,中间件顺序是由中间件插入顺序定义的)。可能路由的业务逻辑可以修改全局对象(用户数据、选项等)。是的,中间件的执行顺序与它们添加到路由的顺序有关。您可以选择使用中间件,并为不同的路由为这些变量分配适当的值,但是如果路由的业务逻辑影响变量的值,那么它们可能真的不是常见的变量?