2012-05-07 1 views
1

Я использую symfony 2 для проекта. У меня есть контроллер, где я делаю несколько проверок перед каждой функцией, а то, что я хочу, - это сделать огонь symfony, который работает по каждому запросу этого контроллера. Напримерчто-то похожее на конструктор в конструкторе 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/cookbook/event_dispatcher/index.html) в кулинарной книге и [Компонент диспетчера событий] (http://symfony.com/doc/current/components /event_dispatcher/index.html). – hakre

ответ

2

Есть по крайней мере два идиоматических пути достижения этой цели:

  1. Event listeners и
  2. AOP - использование JMSAopBundle в Symfony2.

Использование конструкторов для этого варианта использования - это плохая идея. Взлом в конструктор или сеттер для проверок, не связанных с созданием объекта или установкой значения, - это просто взлом. В любом смысле это не логично, ни идиоматично. Это похоже на то, как нанести гвоздь своей головой, но лучшие варианты существуют.

+0

почему это плохая идея, plz do tell – Mythriel

+0

Существует не быстрый ответ о том, почему это плохо. Но как только вы заработаете несколько контроллеров, вы, вероятно, обнаружите, что вам действительно не нужно или хотите всегда выполнять функции. Вы можете использовать мой голосовой ответ, чтобы начать. После чего, вероятно, станет понятнее, почему это не нужно. – Cerad

+0

Обновлен мой ответ с объяснением. –

-2

Вы можете переопределить setContainer, и он будет служить той же цели, что и конструкция.

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

    // Your stuff 
} 

Но вам, вероятно, не нужно это делать. Я думаю, что по мере развития вашего дизайна вам действительно не понадобятся проверки или что функциональность лучше всего делать с прослушивателем событий. Но это может заставить вас начать.

+0

Мне просто нравится, когда люди голосуют за фактические ответы без каких-либо указаний. – Cerad

Смежные вопросы