2

Doctrine 2を使用して、Symfony 2.1.3でユーザー認証部分を持つWebサイトを構築しています。各ユーザーは「ユーザーグループ」のメンバーになることができ、各ユーザーグループには多くのユーザーを含めることができます。

したがって、これは多対多の関係です。

セキュリティ チュートリアルに従ってユーザーを認証しましたが、完全に機能しています。 http://symfony.com/doc/current/cookbook/security/entity_provider.html

パスワードはエンコードされています。データベース関係は正常に機能します。

「LoginSuccess」イベントを処理し、ユーザーをセッションに追加するサービスがあります。ユーザーのプロパティが親のフロントコントローラーにあるため、正しく機能すると思います。

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $session = $request->getSession();

    $session->set('_user', $token->getUser());

    if ($session->has('referer')) {
        if (($session->get('referer') !== null) && ($session->get('referer') !== '')) {
            $response = new RedirectResponse($session->get('referer'));
        } else {
            $response = new RedirectResponse($request->getBaseUrl() . '/');
        }
    } else {
        // if no referer then go to homepage
        $response = new RedirectResponse($request->getBaseUrl() . '/');
    }

    return $response;
}

しかし今、認証された現在のユーザーのグループを取得したいのですが、空の配列が得られます...

// Somewhere in a controller action.
$session = $this->getRequest()->getSession();
$current_user = $session->get('_user');
echo '<pre>';
exit(var_dump($current_user));
object(Me\MyProject\CoreBundle\Entity\User)#38 (16) {
    [...]
    ["groups":"Me\MyProject\CoreBundle\Entity\User":private] => object(Doctrine\ORM\PersistentCollection)#34 (9) {
        ["snapshot":"Doctrine\ORM\PersistentCollection":private] => array(0) {

        }
        ["owner":"Doctrine\ORM\PersistentCollection":private] => NULL
        ["association":"Doctrine\ORM\PersistentCollection":private] => NULL
        ["em":"Doctrine\ORM\PersistentCollection":private] => NULL
        ["backRefFieldName":"Doctrine\ORM\PersistentCollection":private] => NULL
        ["typeClass":"Doctrine\ORM\PersistentCollection":private] => NULL
        ["isDirty":"Doctrine\ORM\PersistentCollection":private] => bool(false)
        ["initialized":"Doctrine\ORM\PersistentCollection":private] => bool(false)
        ["coll":"Doctrine\ORM\PersistentCollection":private] => object(Doctrine\Common\Collections\ArrayCollection)#33 (1) {
            ["_elements":"Doctrine\Common\Collections\ArrayCollection":private] => array(0) {

            }
        }
    }
}

ユーザーが自分のグループに応じていくつかの機能にアクセスできるようにしたいので、これらのグループを取得できないのは本当に悪いことです。何か案が ?

私のymlモデル構成ファイル:

Me\MyProject\CoreBundle\Entity\User:
type: entity
repositoryClass: FSB\Intranet\CoreBundle\Repository\UserRepository
table: users
fields:
    id:
        id: true
        type: integer
        unsigned: false
        nullable: false
        generator:
            strategy: IDENTITY
[...]
manyToMany:
    groups:
        targetEntity: Usergroup
        inversedBy: users
        joinTable:
            name: usergroups_for_user
            joinColumns:
                user_id:
                    referencedColumnName: id
            inverseJoinColumns:
                usergroup_id:
                    referencedColumnName: id
lifecycleCallbacks: {  }
4

1 に答える 1

2

デフォルトでは EAGER モードが非アクティブであるため、Doctrine は関数 getGroups を呼び出した場合にのみ ArrayCollection _elements をロードします。getGroups() 関数の結果は何ですか?

モード EAGER (例 : @ManyToOne(targetEntity="\My\Model\User\User", fetch="EAGER")) は、doctrine2 にすべてのデータをロードさせます。

于 2012-11-19T16:21:38.607 に答える