2

特にデータベースからロールをロードしようとしたときに、Symfony2 セキュリティ システムで問題が発生しました。先に進む前に、私は FOSUserBundle を認識していますが、現時点では、Symfony2 フレームワークをよりよく理解するために、Symfony2 コンポーネントのみを使用してバンドルを機能させたいと考えています。TL;DR -> FOSUserBundle だけを使用するように言わないでください。:-)

私のバンドルには、Accounts、AccountsRoles、および AccountsRepository の 3 つのエンティティが構成されています。

src\RedK\Core\IndexBundle\Entity\Accounts.php
http://pastebin.com/0VgXvtJp

src\RedK\Core\IndexBundle\Entity\AccountsRoles.php
http://pastebin.com/GiKNnYg3

src\RedK\Core\IndexBundle\Entity\AccountsRepository.php
http://pastebin.com/SVuMVdpN

MySQL demo_template.accounts テーブル
http://pastebin.com/YzmjD9e4

MySQL demo_template.accounts_roles テーブル
http://pastebin.com/Ybwr4f7y

データベースからのユーザー ロールのロードを追加しようとする前は、バンドルのすべての側面 (登録、確認、パスワードのリセット、およびログイン) が正しく機能していました。getRoles() { return array('ROLE_USER') } を介して単にロールを array('ROLE_USER') に設定すると、認証が機能し、ユーザーはサイトに正常にログインしました。

ただし、データベースからロールを統合しようとすると、次のエラーが表示されます。これは、AuthenticationException のインスタンスであると理解しています。

Notice: Undefined index: id in /home/humplebert/Websites/www/template/vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php line 804 

スタック トレース
http://pastebin.com/Sr5RvZaY

例外は、AccountsRepository のクエリを変更し
、"->select()" および "->leftJoin()" コンポーネントを削除した場合にのみ生成されます。スタック トレースを見ると、pastebin.com リンクの 16 行目あたりで、BasicEntityPersister の多対多マッピングに関して、あらゆる種類の「クレイジー」な現象が発生しているように見えます。

プレーンな「id」への参照について、エンティティクラスの高低を検索しましたが、何も見つかりません。エンティティの「ID」列の名前を単に「id」に変更すると (つまり、src\RedK\Core\IndexBundle\Entity\Accounts で「AccountsID」を「id」に置き換える)、エラーが発生することに気付きました。離れています(別のエラーに置き換えられます。これについては後で詳しく説明します)。

質問 1)
私のエンティティが「未定義のインデックス: id」エラーを生成しているという露骨な問題がありますか? そうでない場合、Symfony2/Doctrine2 は自動インクリメント列に「id」というラベルを付ける必要がありますか?

いじり続けたので、テーブル ID 列の名前を「id」に変更してみることにしました。したがって、src\RedK\Core\IndexBundle\Accounts は AccountsID を単に「id」に置き換えます。同様に、src\RedK\Core\IndexBundle\AccountsRoles は RolesID を単に「id」に置き換えます。そうすると、「未定義のインデックス: id」エラーがなくなります。ただし、新しいエラーが表示されます: "table or view demo_template.accounts_accountsroles does not exist". もちろん存在しません。accounts_accountsroles として定義されたテーブルはありません。accounts と accounts_roles という 2 つのテーブルがあります。

質問 2)
データベースからユーザーロールをインポートするために Symfony2/Doctrine2 ツールを使用するには、テーブルの命名に関してどのような規則がありますか? 私が受け取ったエラーに基づいて、何らかの連結が行われているようです。それとも、単にどこかで注釈を台無しにしてしまったのでしょうか?

どんな助けでも大歓迎です。

4

2 に答える 2

0

質問1)については、簡単な答えはノーです!長い答えについては、 DoctrineAssociationMappingドキュメントのセクション5.3MappingDefaultsを参照してください。

この短い注釈を使用すると、次のようになります。

/** @ManyToMany(targetEntity="Group") */
private $groups;

「その場合、結合テーブルの名前は、デフォルトで、参加クラスの単純な非修飾クラス名をアンダースコア文字で区切った組み合わせになります。結合列の名前は、デフォルトで、ターゲットの単純な非修飾クラス名になります。クラスの後に「_id」が続きます。referencedColumnNameは、1対1または多対1のマッピングの場合と同様に、常にデフォルトで「id」になります。」

より詳細な多対多の注釈を提供することでデフォルトをオーバーライドでき(上記のリンクを参照)、したがってidエラーを回避できます。

質問2)に関しては、連結は正しいです。多対多の関係には、3番目の「ジャンクション」テーブルが必要です。上記の教義の段落は、このテーブルの名前がどのように生成されるかを説明しています。

注釈が問題ないように見えるため、ジャンクションテーブルで「テーブル...が存在しない」エラーが発生している理由がわかりません。データベーススキーマがアノテーションと何らかの形で同期していないように見えます。

于 2012-07-17T20:49:53.403 に答える
0

FOSUserBundleの上にソリューションを実装し、ここで説明しました

Doctrine を介して Role アクセスを実装した後でも、RoleHierarchy サービスにそれを認識させる必要があります。

于 2014-07-10T14:18:12.847 に答える