3

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

Gremo已经回答了一个类似的问题:Access current 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)

4

4 回答 4

14

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

$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(....);
}
于 2012-10-02T13:17:06.883 回答
6

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>
于 2012-10-03T06:19:06.290 回答
2

为什么不将用户作为 ConstructorArgument 注入:

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

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

于 2012-10-02T08:41:59.487 回答
-2

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

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $user = $builder->getData()->getUser();
    ....
于 2012-10-02T11:37:33.473 回答