我想创建一个简单的博客示例,其中用户有一个最喜欢的类别附加到那里的帐户。这意味着只能为这个类别写文章。(他们中的一些人-主要是管理员-will有机会切换类别,但这不是问题……目前^^)
所以我首先在User和Category实体之间创建了一个关系。一切都很好。现在,每个用户都有一个选定的主类别。
唯一困扰我的是,我不能在EntityType (formbuilder)和EntityRepository类中获得当前登录的用户。
在我的“新帖子”表单中,有与其他实体的关系(例如标签)。我在EntityType类中使用'entity‘表单类型来生成这些表单元素。现在我不想过滤标签,只允许与当前登录的用户类别具有相同类别关系的标签可选。
我尝试在实体表单类型中使用query_builder选项。但是由于我无法获取当前的user对象,所以我不知道他选择了哪个类别。EntityRepository也有同样的问题。
现在我可以过滤PostController中已经存在的标签,但问题是,我需要一遍又一遍地使用它。因此,我不想在每次添加新内容时都对此进行编码。
我认为把这个过滤器放在EntityRepository中是最好的。这样我就可以随时访问findAllByCategory。但我需要那里的user-object。
实现这一目标的最佳方法是什么?我已经搜索了很多次,但要么我搜索了错误的术语,要么没有人有这个问题:)
发布于 2012-07-30 00:12:50
您可以在定义为服务的表单类型中注入安全上下文。然后在tags字段中,使用带有$user (当前登录用户)的查询构建器来过滤与当前登录用户具有相同类别关系的标签:
/** @DI\Service("form.type.post") */
class PostType extends \Symfony\Component\Form\AbstractType
{
/**
* @var \Symfony\Component\Security\Core\SecurityContext
*/
protected $securityContext;
/**
* @DI\InjectParams({"securityContext" = @DI\Inject("security.context")})
*
* @param \Symfony\Component\Security\Core\SecurityContext $context
*/
public function __construct(SecurityContext $securityContext)
{
$this->securityContext = $securityContext;
}
public function buildForm(FormBuilder $builder, array $options)
{
$user = $this->securityContext()->getToken()->getUser();
$builder->add('tags', 'entity', array(
'label' => 'Tags',
'class' => 'Acme\HelloBundle\Entity\Tag',
'property' => 'name',
'query_builder' => function(EntityRepository $er) use($user) {
return $er->getAllSuitableForUserChoiceQueryBuilder($user);
},
'multiple' => true,
'expanded' => true,
}
}将标签过滤到存储库中:
class TagRepository extends EntityRepository
{
public function getAllSuitableForUserChoiceQueryBuilder(User $user)
{
// Filter tags that can be selected by a given user
}
}发布于 2012-07-29 21:24:29
您可以从Security Context获取用户对象
$user = $serviceContainer->get('security.context')->getToken()->getUser();小提示:如果用户没有登录-你将在$user中有字符串,否则-用户对象。
干杯;)
发布于 2012-11-21 19:24:43
尝试使用实体表单类型中的query_builder选项。但是由于我无法获取当前的user对象,所以我不知道他选择了哪个类别。EntityRepository也有同样的问题。
只要Category与用户有关系,您就应该能够将用户带到那里。
例如:
控制器
$someThing = new SomeThing();
$someThing->setUser($user);
$form = $this->createForm(new someThingType(), $someThing);表格
$someThing = $options['data'];
$user = $someThing->getUser();
$builder->add('category', null, array(
'class' => 'MyBundle:Cateogry',
'query_builder' =>
function(EntityRepository $er) use ($user) {
return $er->getCategoriesForUser($user);
}
));存储库
public function getCategoriesForUser($user)
{
$qb = $this->createQueryBuilder('c');
$qb->leftJoin('c.user', 'u', 'with', 'u.user = :user');
$qb->setParameter('user', $user)
;
return $qb;
}这不完全是你的用例,但和你的用例很相似。也许这对你有帮助。
https://stackoverflow.com/questions/11709246
复制相似问题