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

以Symfony 2.1抽象类型访问当前用户,symfony,symfony-2.1,Symfony,Symfony 2.1,我对如何访问Symfony 2中的当前用户感到有点困惑。目前,我正试图根据当前用户的角色显示表单(AbstractType)的变体 以下人士已回答了一个类似的问题: 我的问题是:有没有一种Symfony 2本机方式可以访问AbstractType类中的用户而不使用?谢谢 以下是我当前的代码: namespace Acme\DemoBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Fo

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

以下人士已回答了一个类似的问题:

我的问题是:有没有一种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)

为什么不将该用户作为构造函数参数注入:

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

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

如果用户对象是您正在使用表单处理的注释模型的一部分,您可以通过以下方式访问它:

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

在控制器中,执行以下操作

$form = $this->createForm(new CommentType($this->get('security.context')
                                           ->isGranted('ROLE_ADMIN')), $comment);
其中
ROLE\u ADMIN
是您想要区分的角色

现在,在您的
类型中
必须按以下方式检索它

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(....);
}
JMSDiExtraBundle(除其他外)提供注释和快捷方式,以便定义服务,例如表单类型和条令侦听器,这只是常规服务,但带有特定标记。如果我没记错的话,该捆绑包包含在标准Symfony 2.1版本中,那么为什么不使用它呢

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

类注释扩展了AbstractType
{
私人背景;
公共函数构造(SecurityContext$context)
{
$this->context=$context;
}
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$loggedUser=$this->context->getToken()->getUser();
/* ... */
}
}
并将其定义为带有
表单的服务。键入
标记:



这并不是完全错误,但当您的类型成为一个可重用类型时,它不会起到很好的作用,在我看来,这是正确处理可重用类型的方法。不管怎样,你的答案是正确的:)@Matt:从技术上讲,他的解决方案是最好的。代码是可重用的(因为CommentType是一个类),在这里定义服务并不重要。这是因为,服务只有在两种情况下才有用。第一个是,当该服务对特定任务执行“很多事情”时。构建表单不是其中之一(formBuilder和其他人总是这样做)。此外,一个服务将只在请求的时间期限内“生存”,所以得出您的结论我同意代码仍然是可重用的。但我不同意你另外两个评论。服务比这更有用。它们有助于减少需要传递给每个表单类型的选项,因为您可以将依赖项直接注入到该类型中,如
security.context
服务。它们还简化了嵌入子类型(如CollectionType)的其他类型内部类型的重用,而且速度更快,因为它们可以缓存。最后,在Symfony 2.2中可能会删除实例化类型。有关更多信息,请参阅此。谢谢,我是这样实现的。这将为我提供已使用现有注释持久化的用户对象,不是吗?我正在尝试从安全上下文访问当前登录的用户,以便在显示用于添加新注释的信息之前使用该信息。我已经更新了问题。在创建表单以添加新注释时,应将安全上下文中登录的用户注入表单。与从FormType中访问安全上下文不同,您只需从控制器中注入user对象,在控制器中创建FormType的新实例。这正是我在看到user1326721的回复后实现的代码;-)<代码>私有$roleFlag应该是
私有$isgrant
虽然
$this->securityContext
应该是
$this->context