我对如何访问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)
答案 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();
....