我需要一些提示来解决我的问题。我想为每个请求创建类似初始控制器的东西。或者mayby是更好的方式?
这是我的base.html.twig
<html>
<head>
<meta charset="UTF-8" />
<title>{% block title %}W2 Symfony2{% endblock %}</title>
{% block stylesheets %}
<link href="{{ asset('css/base.css') }}" rel="stylesheet" />
{% endblock %}
{% block javascripts %}{% endblock %}
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
</head>
<body>
<div id="page_wrapper">
{% block body %}
<div id="header">
{% block header %}
{{ user }}
{% endblock %}
</div>
<div id="menu">
{% block menu %}
{{ item1 }}
{{ item2 }}
{{ item3 }}
{% endblock %}
</div>
<div id="content">
{% block content %}
{% endblock %}
</div>
<div id="footer">
{% block footer %}
{% endblock %}
</div>
{% endblock %}
</div>
</body>
</html>
现在我想使用一个初始控制器来使用blocks header, menu and footer
和src\Comflex\W2Bundle\Models\User.php
中的方法设置src\Comflex\W2Bundle\Models\Menu.php
。
class InitialController extends Controller
{
public funtsion __construct()
{
// code generates data for $user, $locales and others
return $this->render(
'::base.html.twig',
array(
'user' => $user,
'locale' => $locale,
'menu' => array(
'item1', 'item2', 'item3',
)
)
);
}
}
www.site.com/web/app.php/home
之类的请求会调用src\Comflex\W2Bundle\Controller\HomeController.php
,但只会更改block content
的内容。这在Symfony2中可能吗?
答案 0 :(得分:1)
它并不完全清楚你想要实现的目标,也不是你已经尝试过的目标。 在寻求帮助之前,您应该阅读更多文档并亲自尝试。
尽管如此,这里有一些提示。
嵌入控制器
您可以使用以下内容在视图中呈现控制器:
{% block menu %}
{{ render(controller(
'AppBundle:Menu:mainMenu',
{ 'max': 3 }
)) }}
{% endblock %}
如果您将其嵌入块中,则可以在模板中覆盖它。
在&#34; Embedding controllers&#34;。
中阅读更多内容在每个控制器之前调用代码
如&#34; How to Set Up Before and After Filters&#34;中所述,您可以利用事件侦听器在调用控制器之前或之后调用代码。
树枝功能
Twig功能也可以帮到你。在twig docs中查看Functions。
至于菜单,您可以查看KnpMenuBundle中的解决方法。
Twig globals
查看&#34; How to Inject Variables into all Templates (i.e. global Variables)&#34;。
答案 1 :(得分:0)
你混淆了控制器和模板引擎。您可以重复使用大量正面代码,而无需使用相同的控制器。
你可以阅读这个模板哲学:Three level inheritance with twig
如果您想要处理所有请求,您可以(但要非常谨慎)也使用web /目录中的正面控制器symfony