将自定义属性添加到所有symfony2控制器

时间:2012-05-11 08:12:21

标签: symfony

有什么办法以某种方式预处理控制器数据。我将从会话中获取参数,验证它并将其指定为控制器属性,并将其用作$ this-> myVar内部某些控制器的操作或其中所有控制器(如果可能)。使用控制器的构造函数没有给我任何东西,我无法访问请求和会话数据。谢谢!

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
 }
}

2 个答案:

答案 0 :(得分:4)

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

我认为您应该使用快捷方式创建一个BaseController类扩展Controller类,以便在会话中访问您的MyVar值。

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

所有其他控制器都将从此BaseController扩展。

要获取请求,只需使用ControllerController::getRequest()提供的快捷方式。

答案 1 :(得分:1)

如果您想在__construct方法中使用服务,则必须先inject that services。然后你可以在任何其他方法之前使用它们。例如:

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

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