带有 Symfony 的 Twig 中的组件级控制器 PHP

Component-level controller in Twig with Symfony PHP

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

我的-template.twig

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

在上面的例子中,my-component.twig需要传入data1data2。这意味着这两个数据项需要对 my-template.twig...可用,这意味着我需要使其在 loads 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,每个模板都有自己独立的控制器。为了 my-component.twig,我需要在每个控制器中分别包含 data1data2

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

理想的情况是,如果一个特定的 Twig 组件是完全自封装的——这意味着我可以自由地将它包含在一个模板中,它会自动获取它自己的所有组件数据。也就是说,该组件有它自己的专用 "controller" 即 PHP 代码,它在渲染特定 Twig 模板(组件)时自动运行,而无需明确指出。

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

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

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

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

我包含 foo 参数只是为了向您展示如果需要可以传递参数(例如,如果您想区分哪个页面正在调用它),但您可能不需要传递任何判断以你为榜样

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

实际上是 link https://symfony.com/doc/4.1/templating/embedding_controllers.html