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



我目前正试图使用模型类与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 => 'GPBundleGoodsBundleModel',
);
$ormCompilerClass = 'DoctrineBundleDoctrineBundleDependencyInjectionCompilerDoctrineOrmMappingsPass';
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"下,它们的映射存储在"GPS\Bundle\WoodsBundle\Resources\config\doctrine\Model"下

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

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

谢谢你的帮助!

这是我的一个模型类:

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="GPBundleGoodsBundleModelGood" 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>

当您在任何捆绑包之外有实体,或者位置不是通常的位置时,您必须从更改config.yml中的条令部分

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: PrefixNamespace # replace with your actual namespace
alias: Model # replace with the desired alias
is_bundle: false

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

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

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

此外,在我的问题中,我写道,我更改了Bundle类中的一些内容,但它没有用处,因为Bundle不会被其他项目重用。所以我把所有东西都拿走了。


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

感谢埃尔努尔·阿卜杜拉希莫夫!

相关内容

  • 没有找到相关文章

最新更新