Symfony2 / Doctrine2模型类可重用捆绑的映射

时间:2013-12-28 16:08:44

标签: php symfony orm doctrine-orm doctrine

我目前正在尝试使用模型类创建一个可重复使用的Symfony2包,但我无法注册它们的映射,因此Doctrine会识别它​​们。

我读到使用编译器传递可能是解决方案,所以我按照Symfony Cookbook(http://symfony.com/doc/current/cookbook/doctrine/mapping_model_classes.html)中的指南进行操作,并且我还查看了FOSUserBundle中的源代码以获得一些灵感。

这就是我到目前为止所做的:

class GPGoodsBundle extends Bundle{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $this->addRegisterMappingsPass($container);
    }

    /**
     * @param ContainerBuilder $container
     */
    private function addRegisterMappingsPass(ContainerBuilder $container)
    {
        $modelDir = realpath(__DIR__.'/Resources/config/doctrine/model');
        $mappings = array(
            $modelDir => 'GP\Bundle\GoodsBundle\Model',
        );
        $ormCompilerClass = 'Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass';
        if (class_exists($ormCompilerClass)) {
            $container->addCompilerPass(
                DoctrineOrmMappingsPass::createXmlMappingDriver(
                    $mappings,
                array('gp_goods.model_manager_name'),
                'gp_goods.backend_type_orm'
                )
            );
        }
    }
}

但是在尝试迁移我的实体时(只是为了查看它是否正常),结果如下:

$php app/console doctrine:migrations:diff
No mapping information to process.

我的实体存储在“GP \ Bundle \ GoodsBundle \ Model”下,其映射位于“GP \ Bundle \ GoodsBundle \ Resources \ config \ doctrine \ model”下

所以我的问题是:创建可重用bundle的好方法是什么,以及如何注册模型类的映射?

如果您需要任何其他信息,请不要犹豫!

感谢您的帮助!

这是我的一个模型类:

class Good implements GoodInterface{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    protected $serial;

    /**
     * @var \DateTime
     */
    protected $manufacturedAt;

    /**
     * @var \DateTime
     */
    protected $deliveredAt;

    /**
     * @var \DateTime
     */
    protected $expiredAt;

    /**
     * @var string
     */
    protected $checkInterval;

    /**
     * @var string
     */
    protected $status;

    /**
     * @var string
     */
    protected $slug;

    /**
     * @var \DateTime
     */

    protected $createdAt;

    /**
     * @var \DateTime
     */

    protected $updatedAt;

    /**
     * @var \DateTime
     */

    protected $deletedAt;

    public function __construct(){
        $this->createdAt = new \DateTime("now");
        $this->status = 'good';
    }

    .... getters/setters .....
}

和映射:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping   xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-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="GP\Bundle\GoodsBundle\Model\Good" table="good">

        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>

        <field name="serial" type="string" column="serial" length="255"/>

        <field name="manufacturedAt" type="date" column="manufactured_at"/>

        <field name="deliveredAt" type="date" column="delivered_at"/>

        <field name="expiredAt" type="date" column="expired_at"/>

        <field name="checkInterval" type="string" column="check_interval" length="255" nullable="true"/>

        <field name="status" type="string" column="status" length="255"/>

        <field name="slug" type="string" column="slug" length="255">
            <gedmo:slug fields="serial" unique="true" />
        </field>

        <field name="createdAt" type="datetime" column="created_at">
            <gedmo:timestampable on="create"/>
        </field>

        <field name="updatedAt" type="datetime" column="updated_at" nullable="true">
            <gedmo:timestampable on="update"/>
        </field>

        <field name="deletedAt" type="datetime" column="removed_at" nullable="true">
            <gedmo:soft-deleteable field-name="deletedAt"/>
        </field>

    </entity>
</doctrine-mapping>

1 个答案:

答案 0 :(得分:3)

当您拥有任何捆绑包之外的实体或该位置不是通常的实体时,您必须从

更改config.yml中的doctrine部分
doctrine:
    # ...
    orm:
        # ...
        auto_mapping: true

doctrine:
    # ...
    orm:
        # ...
        mappings:
            model: # replace `model` with whatever you want
                type: annotation # could be xml, yml, ...
                dir: %kernel.root_dir%/../path/to/your/model/directory
                prefix: Prefix\Namespace # replace with your actual namespace
                alias: Model # replace with the desired alias
                is_bundle: false

dir参数通知Doctrine在哪里查找映射定义。如果您正在使用注释,它将是您的模型目录。否则,它将是您的xml / yml文件的目录。

实体的名称 - 从Doctrine存储库访问 - 在本例中以Model开头,例如Model:User。它对应于参数alias

编辑配置文件时,不要忘记清除缓存。

此外,在我的问题中,我写道我在Bundle类中更改了一些内容,但它没有用,因为bundle不会被另一个项目重用。所以我删除了所有内容。


有关详细信息,请参阅此答案: https://stackoverflow.com/a/10001019/2720307

感谢Elnur Abdurrakhimov!