我有
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在控制器中初始化,但不想每次都调用此方法。请注意,这是旧代码,我试图让它变得更好。任何想法都会有所帮助。
答案 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
答案 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
}
}