Symfony2控制器中的构造函数

Symfony2控制器中的构造函数,symfony,controller,Symfony,Controller,如何在Symfony2控制器中定义构造函数。我想在我的控制器的所有方法中获得可用的登录用户数据,目前我在控制器的每个操作中都执行类似的操作来获取登录用户 $em = $this->getDoctrine()->getEntityManager("pp_userdata"); $user = $this->get("security.context")->getToken()->getUser(); 我想在构造函数中执行一次,并使此登录用户在我的所有操作中可用。对于

如何在Symfony2控制器中定义构造函数。我想在我的控制器的所有方法中获得可用的登录用户数据,目前我在控制器的每个操作中都执行类似的操作来获取登录用户

$em = $this->getDoctrine()->getEntityManager("pp_userdata");
$user = $this->get("security.context")->getToken()->getUser();

我想在构造函数中执行一次,并使此登录用户在我的所有操作中可用。对于在每个控制器操作之前执行代码的通用解决方案,您可以将事件侦听器附加到
内核。控制器
事件如下:

<service id="your_app.listener.before_controller" class="App\CoreBundle\EventListener\BeforeControllerListener" scope="request">
    <tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/>
    <argument type="service" id="security.context"/>
</service>
然后,任何希望用户始终可用的控制器,您只需实现该界面并将用户设置为:

use App\CoreBundle\Model\InitializableControllerInterface;

class DefaultController implements InitializableControllerInterface
{
    /**
     * Current user.
     *
     * @var User
     */
    private $user;

    /**
     * {@inheritdoc}
     */
    public function initialize(Request $request, SecurityContextInterface $security_context)
    {
        $this->user = $security_context->getToken()->getUser();
    }
// ....
}
界面只不过是

namespace App\CoreBundle\Model;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContextInterface;

interface InitializableControllerInterface
{
    public function initialize(Request $request, SecurityContextInterface $security_context);
}

我的做法是:

  • 创建一个空接口InitializableControllerInterface
  • 使事件侦听器
  • 名称空间ACMEBundle\Event; 使用Symfony\Component\HttpKernel\Event\FilterControllerEvent; 类控制器构造函数 { 内核控制器上的公共函数(FilterControllerEvent$事件) { $controller=$event->getController(); 如果(!is_数组($controller)){ //不是一个对象,而是另一种可调用的。什么都不做 返回; } $controllerObject=$controller[0]; if($controllerObject instanceof InitializableControllerInterface){ $controllerObject->uu init($event->getRequest()); } } }
  • 在控制器中添加:
  • 类ProfileController扩展控制器实现 初始化控制器接口 { 公共函数_uinit() { $this->user=$security\u context->getToken()->getUser(); } 您将能够在每个操作中获得$this->user


    关于

    我有点晚了,但在控制器中,您可以访问用户:

    $this->getUser();
    

    从2.1开始就应该工作了

    有人知道用yaml编写配置的方法吗?我们使用yaml,但我不知道如何添加
    参数
    。我读到:也没有帮助obviously@Toskan您只需执行以下操作:
    参数:[“@em”,“@some_service”]
    app.listener.constructor\u listener:class:AppBundle\EventListener\ConstructorListener作用域:请求参数:-{type:service,id:security.context}标记:-{name:kernel.event\u listener,event:kernel.controller,method:onKernelController} namespace ACMEBundle\Event; use Symfony\Component\HttpKernel\Event\FilterControllerEvent; class ControllerConstructor { public function onKernelController(FilterControllerEvent $event) { $controller = $event->getController(); if (!is_array($controller)) { // not a object but a different kind of callable. Do nothing return; } $controllerObject = $controller[0]; if ($controllerObject instanceof InitializableControllerInterface) { $controllerObject->__init($event->getRequest()); } } } class ProfileController extends Controller implements InitializableControllerInterface { public function __init() { $this->user = $security_context->getToken()->getUser(); }
    $this->getUser();