向所有渲染添加变量

时间:2017-09-05 10:16:12

标签: symfony model-view-controller

我在symfony应用程序上运行,我想从所有控制器设置一个新变量到所有渲染。

原因是我的页脚中的某些内容已经变得动态,并且符合MVC模式,我希望将这些新数据的处理放在我的控制器中。

使用symfony执行此操作的好方法是什么?

修改

我没有将symfony用作REST API,Symfony服务器仅将twig呈现的模板作为HTML提供。

有关我案例的详细信息

当前的twig模板具有表单的硬编码标题:

<div>
    <h2>Today</h2>
    <!-- today's inputs .... -->
</div>
<div>
    <h2>Tomorrow</h2>
    <!-- tomorrow's inputs .... -->
</div>

我想将变量提供给我的观点:$today$tomorrow。 通过这种方式,我可以呈现日期名称,而不是今天或明天。

<div>
    <h2>{{ today }}</h2>
    <!-- today's inputs .... -->
</div>
<div>
    <h2>{{ tomorrow }}</h2>
    <!-- tomorrow's inputs .... -->
</div>

例如,如果今天是星期二,则必须以这种方式分配变量: $today = "Tuesday"$tomorrow = "Wednesday"

还有什么

这不是关于这个具体案例的问题。我现在想要在不编辑所有控制器的情况下将变量传递给所有视图。在我看来,我将一个父动作放到所有控制器来生成这个变量。我只是想知道这是否是通常的方式。

我不想使用ajax调用,而且我不想在我的模板中放入复杂的twig代码。我想通过控制器处理这个问题。

2 个答案:

答案 0 :(得分:2)

请阅读有关using global variables的官方文档。

离开我的头顶 - 你可以注射......

  1. ...来自全局twig配置的标量值
  2. ...来自服务容器参数的标量值
  3. ...服务(阅读php对象)
  4. 或者您可以编写Twig扩展名,例如:

        chromeOptions = Options()
        chromeOptions.add_argument("--use-fake-ui-for-media-stream")
        chromeOptions.add_argument("--kiosk")
        chromeOptions.add_argument("--disable-notifications")
        chromeOptions.add_argument("--disable-infobars")
        driver = webdriver.Chrome(chrome_options=chromeOptions,executable_path="C:/Python36/Chrome Webdriver/chromedriver.exe")
    

    然后在任何模板中使用它只需:

    class DateExtension extends \Twig_Extension
    {
        public function getFunctions()
        {
            return [
                new \Twig_SimpleFunction('get_date', array($this, 'getDate'))
            ];
        }
    
    
        public function getDate($date)
        {
            // format it how you want
            return (new \DateTime($date))->format('Y-m-d H:i:s');
        }
    }
    

答案 1 :(得分:0)

关于什么样的&#34;动态&#34;你会说?如果这种动态来自于更改存储在应用程序数据存储中的某些值,那么我相信,您可以定义控制器操作以从例如数据库中检索此数据,然后在每个页面加载时通过AJAX调用它。在客户端获得这些价值。或者甚至可以使用WebSocket的帮助。但这只是假设。如果您真的需要帮助,您应该向我们提供有关您任务背景的更多信息。