我在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代码。我想通过控制器处理这个问题。
答案 0 :(得分:2)
请阅读有关using global variables的官方文档。
离开我的头顶 - 你可以注射......
或者您可以编写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的帮助。但这只是假设。如果您真的需要帮助,您应该向我们提供有关您任务背景的更多信息。