2012-05-11 47 views
1

有什么方法可以以某种方式预处理控制器数据。我将从会话中获取param,验证它并将其指定为控制器属性,并将其用作$ this-> myVar在某些控制器的操作中,或者在可能的情况下全部使用它们。使用控制器的构造函数什么也不给我,我无法访问请求和会话数据。谢谢!将定制属性添加到所有symfony2控制器

UPD: 谢谢,jkucharovic,非常好的解决方案。 此外还有一个更肮脏的解决方案,没有注入:setContainer()方法,它已被直接调用$ controller = new Controller();

use Symfony\Component\DependencyInjection\ContainerAwareInterface, 
    Symfony\Component\DependencyInjection\ContainerInterface; 

class AppServiceController extends Controller { 
private $my_property; 

/** 
    * Used as constructor 
    */ 
public function setContainer(ContainerInterface $container = null) 
{ 
    parent::setContainer($container); 
    $this->my_property = 'foo'; 
    // your controller code 
} 
} 

回答

1

如果要使用__construct方法中的服务,则必须首先使用inject that services。那么你可以在任何其他方法之前使用它们。例如:

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Session; 

public function __construct(Request $request, Session $session) 
{ 
    … 
} 
+0

我可以得到一些细节吗? – Tauquir

+0

当然:-_)_ – jkucharovic

+0

嗨。我正在使用Symfony2.5并且很新。当我实现你的答案时,我得到以下错误:可捕获的致命错误:传递给Fried \ FrameworkBundle \ Controller \ SectionController :: __ construct()的参数1必须是Symfony \ Component \ HttpFoundation \ Request的实例,没有给出。我相信我可能不得不通过这些路线。我可能错了。你能指导我怎么能通过控制器中的这两个变量?谢谢。 – Nis

4

我不知道你想做什么是非常有用的。每次调用控制器时都会创建一个控制器实例。每次调用控制器时,会话和请求都会有所不同。

我认为你应该创建一个BaseController类延伸Controller类与快捷方式来访问您的会话MyVar值。

class BaseController extends Controller 
{ 
    public function getMyVar() 
    { 
     return $this->get('session')->get('MyVarSessionKey'); 
    } 
} 

所有其他控制器将延长从这个BaseController

要获取请求,只需使用Controller类提供的快捷方法,即Controller::getRequest()

相关问题