1

ユーザーがお気に入りのカテゴリをアカウントに関連付けている簡単なブログの例を作成したいと思います。つまり、はこのカテゴリの記事しか書くことができません。(そのうちのいくつか(ほとんどは管理者)はカテゴリを切り替える機会を得ますが、それは問題ではありません...今のところ^^)

そこで、最初にUser-エンティティとCategoryエンティティの間に関係を作成しました。すべてが正常に動作します。これで、各ユーザーのメインカテゴリが選択されました。

気になるのは、EntityType(formbuilder)クラスとEntityRepositoryクラスで現在ログインしているユーザーを取得できないことだけです。

私の「新しい投稿」フォームには、他のエンティティ(タグなど)との関係があります。EntityTypeクラスの「entity」フォームタイプを使用して、これらのフォーム要素を生成します。ここで、タグをフィルタリングせずに、現在ログインしているユーザーカテゴリと同じカテゴリ関係を持つタグのみを選択できるようにします。

エンティティフォームタイプからquery_builderオプションを使用しようとしました。しかし、現在のユーザーオブジェクトを取得できないため、彼がどのカテゴリを選択したかわかりません。EntityRepositoryでも同じ問題が発生します。

これで、PostControllerにすでにあるタグをフィルタリングできましたが、問題は、これが何度も必要になることです。したがって、新しいものを追加するたびにこれをコーディングする必要はありません。

このフィルターをEntityRepositoryに配置するのが最善だと思いました。したがって、いつでもfindAllByCategoryにアクセスできます。しかし、そこにユーザーオブジェクトが必要です。

これを達成するための最良の方法は何ですか?たくさん検索しましたが、間違った用語を検索したか、誰もこの問題を抱えていません:)

4

3 に答える 3

2

ユーザーオブジェクトを取得できますSecurity Context

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

小さなヒント: ユーザーがログインしていない場合 - string in $user、それ以外の場合 - User オブジェクト。

乾杯 ;)

于 2012-07-29T13:24:29.323 に答える
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 に答える
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 に答える