2016-06-22 53 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