SonataAdminBundle使用事件订阅服务器

Mar*_*hli 0 symfony symfony-2.1 sonata-admin

我尝试在SonataAdminBundle表单中设置当前经过身份验证的用户:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
    ->add('title')
    ->add('content')
    ->add('slug')
    //->add('user')
    ;
}
Run Code Online (Sandbox Code Playgroud)

由于我不希望用户选择/选择自己的用户,因此我想在用户发送表单(没有任何用户对象)的过程中设置用户名。(注意:我想以几种形式使用它,所以我需要一个通用的解决方案。)

我现在做的是在阅读以下内容后设置EventListener:http : //symfony.com/doc/current/cookbook/service_container/event_listener.html

class PostListener
{
    protected $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }


    public function prePersist(LifeCycleEventArgs $args)
    {
        $entity = $args->getEntity();

        //Get user
        $securityContext = $this->container->get('security.context');
        $user = $securityContext->getToken()->getUser();

        //Set authenticated user as autor
        $entity->setUser($user);
    }
}
Run Code Online (Sandbox Code Playgroud)

包括服务:

post.listener:
  class: Backender\BlogBundle\Listener\PostListener
  calls:
    - [ setContainer, [ @service_container ] ]
  tags:
    - { name: doctrine.event_listener, event: prePersist }
Run Code Online (Sandbox Code Playgroud)

现在不确定这是否正确,因为我不想在要设置用户的地方指定表单。(这个人想在每个表格上设置用户吗?)

经过更多研究,似乎我必须使用这样的事件订阅服务器:http ://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html在此示例中,他们使用FormEvents :: PRE_SET_DATA我的情况下,我必须使用POST_SET_DATA。

这里有一些问题!:

1:我是SonataAdminBundle的新手,在那里我们使用了受保护的函数configureFormFields(FormMapper $ formMapper)...在哪里->addEventSubscriber()不可用?

2:这是正确的方法吗?,我真的没有找到像我在此进行奏鸣曲管理所需要的示例。

感谢您的帮助!最好的祝福...

Mun*_*Das 5

试试看 $formMapper->getFormBuilder()->addEventSubscriber($subscriber);

  • 好吧,我认为没有必要注入整个容器或创建事件订阅者服务。您可以在管理服务中注入“ security.context”服务,然后将其传递给新的AddUserFieldSubscriber实例,然后再将其添加到表单中。 (2认同)