このテーマには他にもいくつかの質問がありますが、どれも本当に役に立ちませんでした。私はSymfonyが初めてなので、頭を悩ませるのはかなり難しいです。
私はファイルClient\IntranetBundle\LDAP\LDAPAuthenticationProvider.phpにあり、このコードはエラーを引き起こしています:
$user = new LDAPUser($username);
名前空間を追加しました:
use Client\IntranetBundle\LDAP\LDAPUser;
LDAPUserはUserInterfaceを実装します
私が得るエラーは
The class 'Client\IntranetBundle\LDAP\LDAPUser' was not found in the chain
configured namespaces Client\ClientBundle\Entity
それはどういう意味ですか?私が読んだことから、それはマッピングに関係しています。
Config.yml内のMy Doctrine ormは次のように設定されます:
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
うまくいけば、私を助けることができます。
編集#1:
実際、そうではないことがわかりました
$user = new LDAPUser($username);
それがエラーの原因ですが、このエンティティを永続化しようとしているときです:
$entityManager->persist($user);
編集#2:
マッピングの何が問題なのか混乱しています。
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Client\IntranetBundle\LDAP\LDAPUser" table="users" repository-class="Client\ClientBundle\Repository\UserRepository">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<field name="username" column="username" type="string" length="100" />
</entity>
たぶん、2つのバンドル間をジャンプしているからでしょうか?
デフォルトでは、auto_mapping
機能はEntity
名前空間の下でエンティティを探します。したがって、エンティティが存在しない場合、Doctrineはそれについて何も知りません。
エンティティをEntity
名前空間の下に配置するか、手動でカスタムエンティティ名前空間を追加するためにDoctrine=を構成する必要があります。このようにすると、auto_mapping
機能。したがって、すべてのバンドルを手動で登録する必要があります。
orm:
auto_generate_proxy_classes: %kernel.debug%
entity_managers:
default:
mappings:
MyBundle:
type: annotation
custom_mapping:
type: annotation
prefix: Client\IntranetBundle\LDAP\
dir: "%kernel.root_dir%/src/Client/IntranetBundle/LDAP/"
is_bundle: false
ご覧のように、バンドルのEntity
名前空間の下にすべてを入れて、Doctrineに苦労させてください。
バンドルは、config/packages/doctrine.yaml
(Symfony4)構成ファイルのservice/command/apiに使用している正しいエンティティマネージャーにマップする必要があります。
たとえば、次のdoctrine config、BundleName
はdefault
エンティティマネージャとマッピングされるため、default
エンティティマネージャを使用するコードdoctrine接続はBundleName
のエンティティとリポジトリにアクセスして使用できます。
orm:
entity_managers:
default:
mappings:
BundleName:
あなたの多くを助けるためだけに。私は自分のプロジェクトでこのエラーを修正する場所を探していました。
私の間違いは、AppKernelファイル内の「ベンダー」に遠くのバンドル/バンドルを追加するのを忘れたことでした。
それらは「registerBundles」関数に登録されていません。
これが皆さんのお役に立てば幸いです!