猿问

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

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


我的模板.twig


{%  include '/components/my-component.twig'

    with {

        data1 : some_array,

        data2 : some_string

    }

%}

在上面的示例中,my-component.twig需要data1将data2其传递给它。这意味着这两个数据项需要对...可用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在许多不同的模板中使用,每个模板都有自己独立的控制器。为了data1. data2_ my-component.twig_


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


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


在 Symfony 中有这样的可能吗?


慕盖茨4494581
浏览 120回答 1
1回答

GCT1015

如果我理解正确,您想在树枝中使用#render() 方法。您在控制器中创建一个方法,即 myComponentRender() 然后您可以执行此操作而不是执行 include{{ render(controller(    'App\\Controller\\MyController::myComponentRender',    { 'foo': 'bar' })) }}我已经包含了 foo 参数只是为了向您展示如果需要可以传递一个参数(例如如果您想区分哪个页面正在调用它),但是根据您的示例判断您可能不需要传递任何东西澄清一下,在您的 myComponentRender() 方法中,您需要返回 $this->render(...)
随时随地看视频慕课网APP
我要回答