在Symfony 2.1抽象类型中访问当前用户

时间:2012-10-02 08:32:53

标签: symfony symfony-2.1

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

Gremo:[{3}}

已经回答了类似的问题

我的问题是:在没有使用Access currently logged in user in EntityRepository的情况下,是否有一种Symfony 2本地方式来访问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 个答案:

答案 0 :(得分: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(....);
}

答案 1 :(得分: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>

答案 2 :(得分:2)

为什么不将User注入ConstructorArgument:

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

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

答案 3 :(得分:-2)

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

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