【问题标题】:Access current user in Symfony 2.1 Abstract Type在 Symfony 2.1 抽象类型中访问当前用户
【发布时间】:2012-10-02 08:32:53
【问题描述】:

我对如何在 Symfony 2 中访问当前用户有点困惑。目前我正在尝试根据当前用户的角色显示表单的变体 (AbstractType)。

Gremo已经回答了类似的问题:Access currently logged in user in EntityRepository

我的问题是:是否有一种 Symfony 2 本地方式可以在不使用 JMSDiExtraBundle 的情况下访问我的 AbstractType 类中的用户?谢谢!

这是我当前的代码:

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class Comment extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        //somehow access the current user here

        $builder
            ->add('name')
            ->add('comment_text')
            ->add('comment_email')

        // Add more fields depending on user role

                ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\Comment'
        ));
    }

    public function getName()
    {
        return 'acme_demobundle_comment';
    }
}

编辑:我正在寻找当前登录的用户(security.context)

【问题讨论】:

    标签: symfony symfony-2.1


    【解决方案1】:

    进入你的控制器,做这样的事情

    $form = $this->createForm(new CommentType($this->get('security.context')
                                               ->isGranted('ROLE_ADMIN')), $comment);
    

    ROLE_ADMIN 是您要区分的角色。

    现在,在您的Type 中,您必须通过以下方式检索它

    private $isGranted;
    
    public function __construct($roleFlag)
    {
      $this->isGranted = $roleFlag;
    }
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder
        ->add('name')
        ->add('comment_text')
        ->add('comment_email');
    
        if($this->isGranted) {
          $builder
            ->add(....)
            ->add(....)
            [....]
            ->add(....);
    }
    

    【讨论】:

    • 这正是我在看到 user1326721 的回复后实现的代码 ;-) private $roleFlag; 应该是 private $isGranted; 虽然
    【解决方案2】:

    JMSDiExtraBundle 提供(除其他外)注释和快捷方式以定义服务,例如表单类型和原则侦听器,这只是常规服务,但带有特定标签。如果我没记错的话,该捆绑包包含在标准 Symfony 2.1 版本中,那么为什么不使用它呢?

    无论如何要以“旧方式”注入用户,例如使用构造函数注入:

    class Comment extends AbstractType
    {
        private $context;
    
        public function __construct(SecurityContext $context)
        {
            $this->context = $context;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $loggedUser = $this->context->getToken()->getUser();
    
            /* ... */
        }
    }
    

    并将其定义为带有form.type标签的服务:

    <service id="form.type.comment" class="Acme\DemoBundle\Form\Comment">
        <argument type="service" id="security.context" />
        <tag name="form.type" alias="comment" />
    </service>
    

    【讨论】:

    • $this-&gt;securityContext 应该是 $this-&gt;context
    【解决方案3】:

    为什么不将 User 作为 ConstructorArgument 注入:

    $form = $this->createForm(new CommentType($user), $comment);
    

    我是 Symphony 的新手,所以我希望这不是完全错误的:-S

    【讨论】:

    • 这不是完全错误的,但是当你的类型变成service 时效果不好,在我看来,这是对可重用类型正确的方法。无论如何,你的答案是有效的:)
    • @Matt:从技术上讲,他的解决方案是最好的。代码是可重用的(因为 CommentType 是一个类)并且在这里定义一个服务并不重要。那是因为,服务,只有在两种情况下才有用。第一个是,当该服务对特定任务执行“很多事情”时。构建表单不是其中之一(formBuilder 和其他人已经这样做了)。此外,服务只会在请求时间生命周期内“存活”,所以得出你的结论
    • 我同意代码仍然可以按原样重用。但我不同意你的另外两个cmets。服务比这更有用。它们有助于减少您需要传递给每个表单类型的选项,因为您可以将依赖项直接注入到类型中,例如security.context 服务。它们还简化了在嵌入子类型(如 CollectionType)的其他类型中的类型重用,并且它们更快,因为它们可以被缓存。最后,实例化类型可能会在 Symfony 2.2 中被移除。请参阅此PR 了解更多信息。
    • 谢谢,我是这样实现的。
    【解决方案4】:

    如果 UserObject 是您正在使用表单处理的评论模型的一部分,您将能够通过以下方式访问它:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $builder->getData()->getUser();
        ....
    

    【讨论】:

    • 这会给我一个用户对象,它已经被一个现有的评论持久化了,不是吗?我正在尝试从安全上下文访问当前登录的用户,以便在显示 for 添加 new 评论之前使用该信息。我已经更新了问题。
    • 在创建表单以添加新评论时,您会将登录用户从安全上下文注入到表单中。无需从 FormType 中访问安全上下文,您只需从控制器中注入用户对象,在其中创建表单的新实例
    猜你喜欢
    • 2023-03-27
    • 2011-05-14
    • 2015-10-21
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多