2016-06-22 29 views
0

在SF3中,我想知道如何执行一些逻辑,这些逻辑对我网站中的任何页面都是通用的。从任何树枝模板访问的公共逻辑

FOSUserBundle, global arguments/function before templating是一个开始的答案,但它谈到了SF2,我不确定OP是否真的期待与我一样的事情。

目前,我定义了一个自定义基类(BasePageController),任何控制器从中继承我的项目。 公共逻辑写在那里,每个控制器调用一个通用的方法来检索一些自定义变量发送到树枝模板。

这里是如何看(我试图使最小的例子越好):

我的基本控制器类:

<?php 
// src/AppBundle/Controller/BasePageController.php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class BasePageController extends Controller 
{ 
    public function getCommonParams() 
    { 
     // This assignement may be replaced by a complex logic, 
     // evolving user-specific data, session variables... : 
     $val = 1234; 

     return [ 'important_val' => $val ]; 
    } 
} 

从我的基类继承的控制器,例如:

<?php 
// src/AppBundle/Controller/HomeController.php 

namespace AppBundle\Controller; 

use AppBundle\Controller\BasePageController; 

class HomeController extends BasePageController 
{ 
    public function homeAction() 
    { 
     $params = $this->getCommonParams(); 
     return $this->render('home.html.twig', $params); 
    } 
} 

基础基本模板:

{# app/Resources/views/base.html.twig #} 

<!doctype html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>SO example</title> 
    </head> 
    <body> 
     {% block body %}{% endblock %} 
    </body> 
</html> 

我的控制器示例中使用的模板:

{# app/Resources/views/home.html.twig #} 

{% extends 'base.html.twig' %} 

{% block body %} 
<h1>Welcome</h1> 
<p> 
    Important value : {{ important_val }} 
</P> 
{% endblock %} 

我真的不知道,如果它处理的SF网站共同逻辑的常用方式(建议,欢迎它)。

但可以肯定的是,当我尝试在此方案上使用FOSUserBundle时,问题开始出现。

事实上,FOSUserBundle中的每个控制器显然不会继承自我自定义的 控制器类。因此,即使重新定义了FOSUserBundle模板,我的公共逻辑 也无法从登录/注册/ ...页面访问。

唯一的解决方法种的我现在能想象有:

  • 包括与{% render %}整个控制器(从我的自定义类继承)在模板中,其中 共同的逻辑将是可访问的;但 主模板(即login.html.twig ......内)仍然不可用通用逻辑;
  • 重新定义所有FOSUserBundle控制器,通过我自己的自定义控制器类替换它们的标准继承(Controller) ;但我确定这是一年中最糟糕的主意(我想 会减少作曲家升级系统提供的所有灵活性)。

    {# app/Resources/views/base.html.twig #} 
    
    {% import_my_variables_from('AppBundle:BasePageController:getCommonParams()') %} 
    
    <!doctype html> 
    <html> 
    .... 
    

    那么怎么可能做出一些常用的逻辑:

,如果有一个神奇的树枝标签,将导入变量 从PHP方法,这样的事情有可能是一个完美的解决方案即使是像FOSUserBundle这样的外部软件包也可以访问?

回答

1

我总是有点怀疑你确实需要每个页面的公共参数。随着应用程序设计的细化,这项要求通常会消失。

但是假设你真的需要这个,然后将通用参数功能移到它自己的服务中。

class CommonParameters { 
    public function getParams() { 
     return [whatever]; 

电线它作为一项服务:http://symfony.com/doc/current/book/service_container.html

services: 
    common_parameters: 
     class: AppBundle\Common\CommonParameters 

从控制器内,与访问参数:

$params = $this->get('common_parameters')->getParams(); 

你甚至可以定义一个特点把它添加到您的控制器,并摆脱你的定制基础控制器类,这恰好是那些听起来很不错的想法中的另一个,但在实践中往往会变得更加痛苦,他们是工作的日。

但是枝条呢?这是枝条延伸可以进来的地方:http://symfony.com/doc/current/cookbook/templating/twig_extension.html。你可以将你的参数服务注入到你的树枝扩展中,并且树枝可以访问这些变量而不涉及控制器。插入你自己的FOSUserBundle模板,然后离开你。

当然,您也可以将这些东西注入任何其他可能需要的服务中。想想服务。不是全局变量。

最后说明:Symfony是一个世俗的框架。神奇的想法不会让你走得很远。

+0

真正有用的答案,tx;我相信你对常用参数的需要(或不需要)是正确的;但我真的需要清楚地回答这个问题,深入了解我对SF的理解。我用'神奇'这个词来帮助读者看到我是一个初学者,所以他们给我简单的信息,就像你的! tx再次 – yolenoyer