在控制器中的每个操作之前运行init()

时间:2016-10-18 21:05:38

标签: symfony

我有

defaultController extends Controllers
{ 
   public function init( ){
   $myReq = $this->get('request');
   $this->sess = $this->myReq->getSession();
     ..other class variables
   }
   public function indexAction(){ $this->init(); }
   public function showAction(){ $this->init(); }
}

我正在寻找一种优化方法。我希望class var在控制器中初始化,但不想每次都调用此方法。请注意,这是旧代码,我试图让它变得更好。任何想法都会有所帮助。

3 个答案:

答案 0 :(得分:1)

我知道在sf1中你可以使用一个名为preExecute的函数,该函数是在控制器中的每个操作之前启动的

我搜索了一下,看看是否有一个等效的sf2方法,我发现了一些技术,人们使用eventListeners在每个动作之前调用一个方法

以下是教程:

http://wickass.co.za/2013/04/01/adding-a-preexecute-method-to-symfony2-controllers/

http://symfony2.ylly.fr/symfony2-simulate-preexecute-postexecute-filters-actions-jordscream/

eventListeners的Symfony2 doc: http://symfony.com/doc/current/reference/events.html#events

重复主题: Execute code before controller's action

答案 1 :(得分:1)

您可以向Symfony的kernel.controller事件添加事件监听器。在调用控制器之前,Symfony将触发该事件。

事件监听器的方法将获得FilterControllerEvent类的实例,您可以使用它确定,将调用哪个控制器(如果您不想调用init所有控制器之前的方法。)

有关详细信息,请参阅here

答案 2 :(得分:0)

在symfony 2中,您正在扩展的控制器实现ContainerAware特征,您可以从中覆盖setContainer方法,基本上可以执行您在类__construct中通常执行的操作。类似的东西:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\DependencyInjection\ContainerInterface;
... Other Use Statements ...

class YourController extends Controller
{
    protected $sess;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->sess = $container->get('session');
        return $this->container;
    }

    public function indexAction(){ 
        $this->sess->get('some_key'); // This now works
   }
}