2012-05-07 26 views
1

我使用的symfony 2爲一個項目類似構造函數的東西。我有一個控制器,我每個功能之前進行多次檢查什麼,我要的是讓symfony的大火,在該控制器每個請求的功能。例如使得在constroller Symfony的2

class ChatController extends Controller 
{ 
    public function put() 
    { 
     $user = $this->getUser(); 
     $this->checkSomething(); //just a custom function 
     $this->checkSomethingElse(); //another custom function 
     // do something 
    } 

    public function get() 
    { 
     $user = $this->getUser(); 
     $this->checkSomething(); //just a custom function 
     $this->checkSomethingElse(); //another custom function 
     // do something 
    } 
}` 

我想達到同樣的事情:

class ChatController extends Controller 
{ 
    private $user; 

    public function init() 
    { 
     $this->user = $this->getUser(); 
     $this->checkSomething(); //just a custom function 
     $this->checkSomethingElse(); //another custom function 
    } 

    public function put() 
    { 
     //here i can access $this->user   
     // do something 
    } 

    public function get() 
    { 
     //here i can access $this->user 
     // do something 
    } 
}` 

所以基本上我想要的是讓一個函數像一個構造函數。這可以在Symfony2中完成嗎?

+1

這應該是可能的,檢查內核和掛鉤,但你可能需要改變你的設計了一下。請參閱食譜和[事件調度程序組件](http://symfony.com/doc/current/components)中的[Event Dispatcher](http://symfony.com/doc/current/cookbook/event_dispatcher/index.html) /event_dispatcher/index.html)。 – hakre

回答

2

有實現這一目標的至少兩個慣用方式:

  1. Event listeners
  2. AOP - 在Symfony2中使用JMSAopBundle

使用構造函數用於該用途的情況下,是一個壞主意™。黑客進入構造函數或setter中進行與實例化對象或設置值無關的檢查就是 - 黑客攻擊。這在任何意義上都不符合邏輯也不符合慣用。這就像打你的頭釘 - 可行,但更好的選擇存在。

+0

爲什麼它是一個糟糕的主意,PLZ不要告訴 – Mythriel

+0

有沒有快速的答案,爲什麼它是壞的。但是,一旦你寫了幾個控制器,那麼你可能會發現你並不需要或者不想總是執行函數。你可以用我的投票答案開始。之後,它可能會變得更清楚,爲什麼它不需要。 – Cerad

+0

更新了我的答案和解釋。 –

-2

您可以覆蓋setContainer,它將服務於同一目的的結構。

public function setContainer(ContainerInterface $container = null) 
{ 
    parent::setContainer($container); 

    // Your stuff 
} 

但是你可能並不真的需要這樣做。我認爲,隨着設計的發展,您真的不需要檢查,或者最好用事件偵聽器完成功能。但這可以讓你開始。

+0

我只是喜歡它時,人們投票的實際答案,沒有任何跡象表明爲什麼。 – Cerad