且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在 EntityRepository 中访问当前登录的用户

更新时间:2023-12-01 17:12:04

您可以在定义为服务的表单类型中注入安全上下文.然后在您的标签字段中使用带有 $user(当前登录的用户)的查询构建器来过滤与当前登录的具有相同类别关系的标签:

You can inject security context in your form type defined as a service. Then in your tags field use the query builder with $user (current logged user) to filter tags which have the same category relation as the currently logged:

/** @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,
    }
}

将标签过滤到您的存储库中:

Filter tags into your repository:

class TagRepository extends EntityRepository
{
    public function getAllSuitableForUserChoiceQueryBuilder(User $user)
    {
        // Filter tags that can be selected by a given user
    }
}