2017-05-29 32 views
0

我會在那裏我處理的用戶ID,當用戶身份登錄。獲得每個控制器的功能相同的數據

在每個控制器功能。如果用戶已登錄,我必須對用戶下載(從DB)的數據並將其發送到視圖。

效果: 在每個函數中,我至少有~4行相同的代碼。

問題:是否有另一種更簡單的方法來做到這一點? (無碼溢出)

//編輯

我用這樣的事情在每個控制器:

$variables = array(); 
$defaultModel = new DefaultModel($em->getRepository('AppBundle:Users'), new Session()); 
$variables['user'] = $defaultModel->getUserHandle()->getBaseUserData(); 
//... 
return $this->render('UbBundle:Account:Logout.html.twig', $variables); 
+0

題外話,但新的Session()在Symfony的控制器,該控制器過程可能不是做你的期望。在任何情況下,設置每一個控制器聽衆:http://symfony.com/doc/3.2/event_dispatcher/before_after_filters.html – Cerad

回答

-1

你可以把這4行代碼的方法,將在控制器上被稱爲構造函數。

+2

你有沒有試過這樣做呢?你可能會驚訝,使用標準架構控制器,當你沒有訪問容器在構造函數中。 – Cerad

0

只需擁有一個私人方法或服務,爲您執行邏輯,然後從4個地方調用它。

0

你爲什麼不創建一個樹枝延伸,有一個函數來做到這一點?您可以在視圖圖層中調用它,而不用重複代碼並更改所有控制器。

1

有不同的方法來解決這個問題。只要您不再提供有關控制器功能的更多信息,例如如何創建響應或渲染視圖,我只能猜測。

簡單的解決辦法是使用your own base controller

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class BaseController extends Controller 
{ 
    // override render method 
    protected function render($template, $data) 
    { 
     // get your user data from db 
     $userData = []; 

     parent::render($template, array_merge($userData, $data); 
    } 
} 

,讓你的控制器從BaseController擴展:

class MyController extends BaseController 
{ 
    public function fooAction() { 

     // call the render function in your BaseController which adds user data to the view params  
     return $this->render('AppBundle:Bar:bar.html.twig', array('bar' => 'Hello World!')); 

    } 
} 

如果你不喜歡這種方法,你也可以創建自己的事件聽衆/訂閱者掛鉤進程,例如聽爲kernel.viewkernel.response事件或kernel.controller 事件來操作使用before or after filters

+0

可不可以給例子,如何做使用事件一樣嗎?然後,我就不用覆蓋每個控制器 –

+0

是的,我可以給你一個例子渲染方法,但我需要一些更多的信息,一個典型的行動,他們的反應在你的控制器的樣子。你使用render()的RenderView(),或使用@View()註釋等 – lordrhodos

+0

我編輯我的問題 - >在每個控制器我需要會話和學說然後推動它從DB和推動獲取數據的功能渲染視圖。 我只是想知道如何獲得教義和會話句柄在這種情況下,例如推送數據來呈現,其餘的我將獨自做 –

相關問題