Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从父分支模板调用PHP业务逻辑_Php_Symfony_Twig - Fatal编程技术网

从父分支模板调用PHP业务逻辑

从父分支模板调用PHP业务逻辑,php,symfony,twig,Php,Symfony,Twig,在我的Symfony2项目中,我使用细枝模板来呈现HTML,并且我需要在网站的每个页面中都包含一个应用程序栏。此栏的内容取决于用户是谁、她拥有什么特权等。换句话说,需要在幕后执行一些业务逻辑。显而易见的解决方案似乎是在基本模板中添加应用程序栏,因为它需要出现在每个页面上。然而,问题是不清楚如何从基本父分支模板执行业务逻辑 @Flukey在中也有类似的问题,他的解决方案是从细枝模板中渲染子控制器,从而强制执行辅助控制器。明确地说,他的解决方案如下所示: {# ::base:html.twig #}

在我的Symfony2项目中,我使用细枝模板来呈现HTML,并且我需要在网站的每个页面中都包含一个应用程序栏。此栏的内容取决于用户是谁、她拥有什么特权等。换句话说,需要在幕后执行一些业务逻辑。显而易见的解决方案似乎是在基本模板中添加应用程序栏,因为它需要出现在每个页面上。然而,问题是不清楚如何从基本父分支模板执行业务逻辑

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

{# ::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>
为了使渲染正常工作,我们还需要定义路由:

# routing.yml
app_bar_route:
    pattern:  /sitestructure/appbar
    defaults: { _controller: SiteManagerBundle:AppBar:index }
但由于以下原因,我对这个解决方案感到非常不安:

首先,这个解决方案意味着您必须为站点上的每个导航栏管理单独的新URL 其次,网站上的每个导航栏都有一个单独的URLhttp://mysite/sitestructure/appbar 在上面的例子中,这看起来很混乱 第三,还有一个问题,我感到非常关切。我不明白为什么每个用户对HTML页面的请求都会导致向服务器发送两个、三个或四个物理请求——对站点上每个导航栏的额外呈现请求随着站点变得更复杂,可能会添加更多导航栏。 那么,有没有更好的方法?可以使用Twig的{%include%}功能而不是{%render%}吗?如果可以,基本模板的业务逻辑是如何执行的

编辑: 为了澄清,我提到的“业务逻辑”类型需要进行数据库调用——这不是我想要编码到模板中的逻辑类型,因此我需要以某种方式回到PHP类/函数中

编辑2:
我真的应该担心打电话给副控制员吗?也许我误解了渲染引擎的工作方式。我假设这将生成对web服务器的第二个HTTP请求,显然不是来自web浏览器,而是来自服务器本身的内部请求。对我来说,这似乎意味着相当大的开销,更不用说产生某种响应错误的机会增加了。但是,也许我误解了框架,在这种情况下,请教育我

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

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

<body>
    {{ include('@MyBundle/app_bar.html.twig') }}
    {% block body %}{% endblock %}
</body>
您当然可以根据用户在app_栏中显示不同的项目

{% if is_granted('ROLE_ADMINx') %}
    <li><a href="{{ path('zayso_natgames_admin') }}">Admin</a></li>
{% endif %}
不清楚您还需要什么样的业务逻辑。如果它超出了简单的条件,那么您可以将代码放在一个细枝扩展中

我有点觉得你需要更多?可能有多种类型的应用程序吧?我不明白每个导航栏需要什么特别的东西

您可能对子控制器的实现方式有误解。子控制器请求在内部完成。没有到浏览器的往返。性能影响很小。不需要多个url,只需要一个路由应用程序条


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

我谈到的业务逻辑可能包括数据库调用,但我真的不想用太多的细节把这个问题难住。真正重要的一点是,我需要回到一个PHP类来做一些额外的逻辑。我知道如何在Smarty中实现这一点,但Twig的理念似乎有点不同。你可能是对的,我不了解子控制器是如何实现的。如果这一切都是内部完成的,那么就没有我想的那么糟糕了。我只需要接受这样一个事实:Twig和Smarty是不同的。使用了这两种方法后,我投了小树枝的票。您可以在细枝扩展中进行数据库调用,但几乎可以肯定,您希望使用子控制器。这:可能有点让人不知所措,但如果向下滚动到接近底部的位置,就会解释子请求。
{% if is_granted('ROLE_ADMINx') %}
    <li><a href="{{ path('zayso_natgames_admin') }}">Admin</a></li>
{% endif %}