1

我想创建一个简单的博客示例,其中用户有一个最喜欢的类别附加到那里的帐户。这意味着只能为该类别撰写文章。(其中一些 - 主要是管理员 - 将有机会切换类别,但这不是问题......现在^^)

所以我首先创建了 User- 和 Category 实体之间的关系。一切正常。现在每个用户都选择了一个主要类别。

唯一困扰我的是,我无法在 EntityType (formbuilder) 和 EntityRepository 类中获取当前登录的用户。

在我的“新帖子”表单中,存在与其他实体的关系(例如标签)。我使用 EntityType 类中的“实体”表单类型来生成这些表单元素。现在我不想过滤标签,只允许选择与当前登录的用户类别具有相同类别关系的标签。

我尝试使用实体表单类型中的 query_builder 选项。但是由于我无法获取当前的用户对象,所以我不知道他选择了哪个类别。EntityRepository 也有同样的问题。

现在我可以过滤 PostController 中已经存在的标签,但问题是,我将一遍又一遍地需要它。因此,我不想每次添加新内容时都编写代码。

我认为最好将此过滤器放在 EntityRepository 中。所以我总是可以访问 findAllByCategory。但我需要那里的用户对象。

实现这一目标的最佳方法是什么?搜索了很多,但要么我搜索了错误的术语,要么没有人有这个问题:)

4

3 回答 3

2

您可以从中获取用户对象Security Context

$user = $serviceContainer->get('security.context')->getToken()->getUser();

小提示:如果用户未登录 - 你将有字符串 in $user,否则 - 用户对象。

干杯;)

于 2012-07-29T13:24:29.323 回答
1

您可以在定义为服务的表单类型中注入安全上下文。然后在您的标签字段中使用带有$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-29T16:12:49.703 回答
1

尝试使用实体表单类型中的 query_builder 选项。但是由于我无法获取当前的用户对象,我不知道他选择了哪个类别。EntityRepository 也有同样的问题。

只要类别与用户有关系,您就应该能够在那里获得用户。

例如:

控制器

$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;
}

这不完全是您的用例,但与它非常相似。也许它可以帮助你。

于 2012-11-21T11:24:43.010 回答