在Twig中使用Symfony PHP的组件级控制器。

问题描述 投票:0回答:1

我使用的是Symfony 4.x,目前在Twig模板中包含了这样的组件。

my-template.twig

{%  include '/components/my-component.twig'
    with {
        data1 : some_array,
        data2 : some_string
    }
%}

在上面的例子中。my-component.twig 需要 data1data2 要传入其中。这意味着,这两个数据项需要提供给 my-template.twig......这意味着我需要在控制器中提供它 负载 my-template.twig.

class MyController extends Controller {

   // ... 

   $data = [
       'data1' = [ /* some array data */ ];
       'data2' = 'a string';
   ];

    $res = $this->renderView('my-template.twig', $data);

    return new Response($res);
}

我遇到的问题是,我可能会使用 my-component.twig 在几十个不同的模板中,每个模板都有自己独立的控制器。我需要包括 data1data2 在这些控制器中的每一个单独的,只是为了。my-component.twig.

我已经通过在一个服务中包含通用数据对象,并在所有需要特定数据的控制器中包含该服务来解决这个问题,但这也不是很理想。

哪些 最理想的是,如果一个特定的Twig组件是完全自我封装的--这意味着我可以自由地将它包含在一个模板中,并且它可以自动抓取它自己的所有数据。也就是说,这个组件有自己的专用 "控制器",也就是PHP代码,当某个特定的Twig模板(组件)被渲染时,它就会自动运行,而不需要明确说明。

在Symfony中可以实现这样的功能吗?

php symfony twig
1个回答
3
投票

如果我没理解错的话,你想在twig中使用#render()方法。

你在你的控制器中创建一个方法,即myComponentRender(),然后你可以这样做,而不是做 include

{{ render(controller(
    'App\\Controller\\MyController::myComponentRender',
    { 'foo': 'bar' }
)) }}

我包含了foo参数,只是为了告诉你,如果你需要的话,你可以传递一个paremeter(例如,如果你想区分哪个页面在调用它),但从你的例子来看,你可能不需要传递任何东西。

澄清一下,在你的myComponentRender()方法中,你需要返回$this->render(...)

其实这里有一个链接https:/symfony.comdoc4.1templatingembedding_controllers.html。

© www.soinside.com 2019 - 2024. All rights reserved.