繁体   English   中英

从父级Twig模板调用PHP业务逻辑

[英]calling PHP business logic from parent Twig templates

在我的Symfony2项目中,我使用Twig模板来呈现HTML,并且需要一个“应用程序栏”来包含网站的每个页面。 该栏的内容取决于用户的身份,用户拥有的特权等(换句话说,需要在后台执行一些业务逻辑)。 显而易见的解决方案似乎是在基础模板中添加应用栏(因为它需要出现在每个页面上)。 但是,这样做的问题在于,尚不清楚如何从基本(父)Twig模板执行业务逻辑。

@Flukey在此问题中有一个类似的问题,其中他的解决方案是从树枝模板中render子控制器,从而强制执行辅助控制器。 明确地说,他的解决方案如下所示:

{# ::base:html.twig #}
<!DOCTYPE html>
<html>
    <head>
        <title>blah</title>
        {% block stylesheets %}{# default styles #}{% endblock %}
    </head>
    <body>
        {# Question: is there a way to do add the app-bar without "render"? #}
        {% render url('app_bar_route') %} 
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

和孩子:

{# AcmeDemoBundle:userpage.html.twig #}
{% extends '::base.html.twig' %}
{% block body %}user content here; Twig file rendered from "primary" PHP Controller.{% endblock %}

为了使render工作,我们还需要定义路径:

# routing.yml
app_bar_route:
    pattern:  /sitestructure/appbar
    defaults: { _controller: SiteManagerBundle:AppBar:index }

但是由于以下原因,这个解决方案对我来说很不舒服:

  • 首先,此解决方案意味着您必须为网站上的每个导航栏管理单独的新URL
  • 其次, 对于在网站上每一个导航栏单独的URL( http://mysite/sitestructure/appbar在上面的例子),这似乎只是很凌乱
  • 第三,我也非常关注性能 ,这是我对性能的关注。 我不明白为什么每个用户对HTML页的请求都应该导致将两个(或三个或四个)物理请求发送到服务器-网站上每个导航栏都需要一个额外的render请求(更多nav-随着网站变得越来越复杂,可能会添加条形图)。

那么,有没有更好的方法呢? 是否可以使用Twig的{% include %}功能代替{% render %} ,如果可以,基本模板的业务逻辑如何执行?

编辑 :为澄清起见,我所指的“业务逻辑”类型将需要进行数据库调用-这不是我要编码到模板中的逻辑类型,因此我需要以某种方式返回到PHP类/函数。

EDIT2 :我真的应该担心打电话给子控制器吗? 也许我误解了render引擎的工作方式。 我以为这将向Web服务器生成第二个HTTP请求(显然不是从Web浏览器,而是从服务器本身的内部HTTP请求)。 对我来说,这似乎意味着相当大的开销,更不用说增加产生某种响应错误的机会了。 但是,也许我误解了该框架,在这种情况下,请教育我!

我不确定我是否理解您的所有观点。

您当然可以制作一个app_bar模板并将其包含在基本模板中:

<body>
    {{ include('@MyBundle/app_bar.html.twig') }}
    {% block body %}{% endblock %}
</body>

您当然可以根据用户在app_bar中显示不同的项目

{% if is_granted('ROLE_ADMINx') %}
    <li><a href="{{ path('zayso_natgames_admin') }}">Admin</a></li>
{% endif %}

尚不清楚您需要什么其他类型的“业务逻辑”。 如果超出简单的条件,则可以将代码放在树枝扩展中。

我有点觉得您需要更多吗? 可能是多种类型的app_bar? 我不了解有关“每个导航栏”的内容需要一些特殊的东西。

您可能对子控制器的实现方式有误解。 子控制器的请求在内部完成。 无需往返浏览器。 对性能的影响很小。 不需要多个网址,只需一个route_app_bar。

当然,除非我完全误解了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM