Symfony2 “class not found in the chain” in two bundle relationship

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

In an attempt to define a one-to-many relationship across bundles the following occurs:

The class 'Mana\ClientBundle\Entity\Member' was not found in the chain configured namespaces Mana\SplitBundle\Entity

Update 3:

I've now seen conflicting answers that the relationship can and cannot be accomplished. On the assumption that it can (because others here at stackoverflow seem to have done it), what configuration is required other than registering the bundles in AppKernel.php and entering the annotations in the entities? The resolve_target_entity_listener did not appear to make a difference.

Update 2:

Well, I know I'm way out of my depth here, but this is what I observed while stepping through the code when trying to show a Client entity.

The error message in the profiler

The target entity 'Mana\ClientBundle\Entity\Member' specified on Mana\SplitBundle\Entity\Client#members is unknown or not an entity.

occurs because SchemaValidator evaluates $cmf->isTransient($assoc['targetEntity']) to true, where the targetEntity in the Member entity. The PHPdoc comment suggests that this entity's metadata is not loaded. If I understand this correctly, that means that the annotation regarding the relationship is not loaded. But observing variable values suggests that the annotations have been read.

Am I totally missing something that should be painfully obvious? Or am I too far out in left field?

Update 1:

I have confirmed that doctrine:mapping:info will detect improper FQCN. The data fixtures are correct. Use of entity managers and database-connection for both default and split connections are correct. The error persists and can occur for any of the relationships defined in the Client entity, either OneToMany or ManyToOne.

config.yml:

doctrine:     dbal:         default_connection: default         connections:           default:             driver:   "%database_driver%"             host:     "%database_host%"             port:     "%database_port%"             dbname:   "%database_name%"             user:     "%database_user%"             password: "%database_password%"             charset:  UTF8             mapping_types:                  enum:       string           split:             driver:   "%database_driver2%"             host:     "%database_host2%"             port:     "%database_port2%"             dbname:   "%database_name2%"             user:     "%database_user2%"             password: "%database_password2%"             charset:  UTF8             mapping_types:                  enum:       string     entity_managers:       default:         connection: default         mappings:           ManaClientBundle: ~       split:         connection: split         mappings:           ManaSplitBundle: ~ 

Client entity:

/**  * @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Member", mappedBy="client")  * @ORM\OrderBy({"dob" = "ASC"})  */ protected $members; 

Member entity:

 /**  * @ORM\ManyToOne(targetEntity="Mana\SplitBundle\Entity\Client",inversedBy="members",cascade={"remove", "persist"})  * @ORM\JoinColumn(name="cid", referencedColumnName="id")  *   */  protected $client; 

Doctrine mapping:

$ php app/console doctrine:mapping:info Found 12 mapped entities: [OK]   Mana\ClientBundle\Entity\Agency [OK]   Mana\ClientBundle\Entity\Center [OK]   Mana\ClientBundle\Entity\Contact [OK]   Mana\ClientBundle\Entity\Contactdesc [OK]   Mana\ClientBundle\Entity\Counties [OK]   Mana\ClientBundle\Entity\Ethnicity [OK]   Mana\ClientBundle\Entity\Incomehistory [OK]   Mana\ClientBundle\Entity\Incomesrc [OK]   Mana\ClientBundle\Entity\Member [OK]   Mana\ClientBundle\Entity\Note [OK]   Mana\ClientBundle\Entity\Referral [OK]   Mana\ClientBundle\Entity\User  $ php app/console doctrine:mapping:info --em=split Found 1 mapped entities: [OK]   Mana\SplitBundle\Entity\Client 

回答1:

You should see Using Relationships with Multiple Entity Managers

A cross-bundle relationship cannot be managed by Doctrine if you have separate databases with separate connections and entity managers. Instead, in this case, the Client entity would have to reside in the same schema/bundle and be periodically refreshed from the external source.

But if you have only one connection to the database and one entity manager for it you can manage cross-bundle relationships. (Described here: OneToMany Relation on cross project entities (Symfony2/Doctrine))



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!