Symfony2 - 学说:模式:更新失败,实体在包之外(解耦)

Posted

技术标签:

【中文标题】Symfony2 - 学说:模式:更新失败,实体在包之外(解耦)【英文标题】:Symfony2 - doctrine:schema:update fails with entity outside of a bundle ( decoupled ) 【发布时间】:2013-10-19 10:19:52 【问题描述】:

我正在阅读这篇文章:

http://danielribeiro.org/yes-you-can-have-low-coupling-in-a-symfony-standard-edition-application/

作者提到这个项目可以有这样的艺术品:

src/
└── Vendor/
    └── Product/
        └── Bundle
            └── BlogBundle/
            └── ForumBundle/
            └── SiteBundle/
                └── Controller/
                    └── IndexController.php
                └── Resources/
                    └── views/
                        └── index.html.twig
                └── ProductSiteBundle.php
        └── Entity
            └── User.php
        └── Repository
            └── UserRepository.php
        └── Service
            └── UserPasswordRetrievalService.php

所以我按照这篇文章结束了这样的事情:

src/
└── Product/
    └── Bundle
        └── SiteBundle/
            └── Controller/
                └── IndexController.php
            └── Resources/
                └── views/
                    └── index.html.twig
            └── ProductSiteBundle.php
    └── Entity
        └── User.php

现在 Symfony 看不到我的 User.php,作者没有提到我是否必须添加任何额外的代码才能使其正常工作,现在我收到了这个错误:

MappingException: The class 'Product\Entity\User' was not found in the chain configured namespaces OtherNameSpaces

更新

所以我删除了我现有的代码。并做了这样的事情:

src/
└── Product/
    └── Bundle
        └── SiteBundle/
            └── Controller/
                └── IndexController.php
            └── Resources/
                └── views/
                    └── index.html.twig
            └── ProductSiteBundle.php
    └── Entity
        └── User.php

用户.php

namespace Product\Entity;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    
        parent::__construct();

    

然后

php app/console doctrine:schema:update --force //No Metadata Classes to process.

似乎 Symfony 根本不知道该文件夹。有什么地方可以让 symfony 查看那个文件夹吗?

【问题讨论】:

你在 User.php 中的命名空间是什么? namespace Product\Entity@Tib @nifr 答案就在上面。我的文章是您第一次听说这种做法的地方,但没有(故意)解释您在内部是如何做到的。 @DanielRibeiro 喜欢您的文章——我们绝对应该提高对良好应用程序设计的认识。保持良好的工作! :) @DanielRibeiro 确实很棒的文章!感谢您检查我的问题 【参考方案1】:

Jakub Zalas 的good blog article 描述了如何映射存在于包之外的实体。

您需要手动添加学说应在哪里查找映射信息,如下所示。

这使得doctrine:schema:update 命令也可以使用映射信息。配置更改后不要忘记清除缓存。

# app/config/config.php
doctrine:
    orm:
        # ...
        mappings:
            Acme:
                type: annotation
                is_bundle: false
                dir: %kernel.root_dir%/../src/Acme/Entity
                prefix: Acme\Entity
                alias: Acme

您现在可以像这样访问存储库(因为别名定义):

$entityManager->getRepository('Acme:YourEntity');

【讨论】:

以上是关于Symfony2 - 学说:模式:更新失败,实体在包之外(解耦)的主要内容,如果未能解决你的问题,请参考以下文章

学说 Symfony2 坚持与现有的关联实体

使用 symfony2 缓存 ReadOnly 学说 2 实体的结果

Symfony 2 实体连接或学说查询连接

Symfony2:学说“找不到驱动程序”

未定义索引:joinColumns 学说 + symfony2

使用连接表返回结果的学说不起作用 Symfony2