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