我试图提高我们自己的CMS系统的灵活性。这个CMS系统的功能可以通过插件来扩展。这种“核心”CMS系统有几个实例。目前还不可能禁用这样的插件,因此每个实例都激活了所有插件,尽管并不是每个实例都使用每个插件。不幸的是,新创建的插件可能正在破坏CMS的某种基本功能。我的目标是使插件结构更加灵活。一项任务是只激活将由实例使用的插件。我的问题是,理论映射是由XML文件处理的,其中为每个表定义了每个关系。
例如,:假设我们有基类文件,这将是一个“核心”功能。有一天,我们添加了一个标签插件,在这里我们添加标签到文件。例如,我们上传了一个“莱昂内尔·梅西”的图片,并给它贴上标签:"Primera分部,足球,阿根廷,.“。可能的XML映射可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping
xmlns="http://doctrine-project.org/schemas/orm/doctrine-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="Db\File" table="file">
<!-- identical for all tables -->
<unique-constraints>
<unique-constraint columns="id"/>
</unique-constraints>
<id name="uid" type="integer" column="uid">
<generator strategy="AUTO"/>
</id>
<field name="id" type="integer" column="id" nullable="true"/>
<field name="title" type="string" column="title" length="255" nullable="true"/>
<one-to-many field="fileTags" target-entity="Tag" mapped-by="file">
</one-to-many>
</entity>
</doctrine-mapping>"file“表与"tag”有一对多的关系。这个关系将为每个CMS实例创建,尽管“标记”插件可能没有被激活。只有当“标记”插件处于活动状态时,才应该创建与“标记”的关系,否则不应该执行特定于插件的映射。
如何用教条来处理这样的任务是最好的方法?谢谢你的帮忙!
发布于 2017-03-28 01:58:24
您可以使用动态映射。
尝试使用原则loadClassMetadata事件向要添加标记的实体添加其他映射。以及你的标签实体本身。
$mapping['fieldName'] = 'tag';
$mapping['targetEntity'] = '<your entity>';
$mapping['sourceEntity'] = '<your tag class>';
$mapping['sourceToTargetKeyColumns'] = array('tag_id' => 'id');
$mapping['targetToSourceKeyColumns'] = array('id' => 'tag_id');
$mapping['fetch'] = 2;
$mapping['joinColumns'] = array(
array(
'name' => 'tag_id',
'unique' => false,
'nullable' => false,
'onDelete' => null,
'columnDefinition' => null,
'referencedColumnName' => 'id',
)
);
$mapping['mappedBy'] = 'tag_id';
$mapping['inversedBy'] = null;
$mapping['orphanRemoval'] = false;
$mapping['isOwningSide'] = true;
$mapping['type'] = ClassMetadataInfo::MANY_TO_ONE;
$vm = $this->em->getClassMetadata('<your tag class>');
$vm->associationMappings["tagId"] = $mapping;这是没有测试,几乎肯定是有一点错误,但它可能会给你一些想法,让你开始。
您可以使用XML创建所需的映射。然后使用调试器检查结果元数据。然后使用事件侦听器动态添加元数据。最后,删除XML映射并重新测试。
如果要从标记和实体引用实体,则可能希望检查标记和目标实体上的映射。
https://stackoverflow.com/questions/40997459
复制相似问题