我目前正在尝试使用模型类创建一个可重复使用的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>
答案 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!