我正在使用symfony框架处理Web应用程序。 我的数据库设计预先存在并不是'经典' - 也就是说,'hstore'和'json'的字段类型正在使用中。
到目前为止,我遇到了两个问题:
让我们假设我能够通过源代码更改来修复这些问题。
这里的问题是由不同的问题和我想到的替代方案组成的,我猜他们中的任何一个都会有好的答案。
我希望(但是怀疑)我可以从composer.json中删除相应包的require并保留新的vendor / files和我的src /但这不是我正在寻找的解决方案。
注意我是使用作曲家进行所有这种依赖和包导入/管理的新手。
答案 0 :(得分:2)
首先,Doctrine非常具有可扩展性。肯定应该有一种方法可以使用捆绑代码扩展它,而无需修改vendor/
中的任何内容。
Doctrine的文档指出已经支持json
类型:http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html#mapping-matrix。根据文档,hstore
不是,但如果你能实现它,那就值得合并到Doctrine项目中。
在Forking Composer提供的库上:您可以在Github上分叉Doctrine并在repositories
中添加composer.json
块,指向您的分叉:
{
...
"repositories": [
{
"type": "vcs",
"url": "http://github.com/**your/fork**"
}
]
}
使用Composer更新Doctrine包(应该是php composer.phar update doctrine/orm
,或者doctrine/dbal
,doctrine/common
或者doctrine/doctrine-bundle
如果您要分发捆绑包),它应该是拉你的fork代码而不是原始的Doctrine代码。观看您所要求的库中"name"
的{{1}}值。
以下是关于分叉的更详细的教程:http://mnapoli.fr/overriding-dependencies-with-composer/
答案 1 :(得分:0)
经过一些研究后,可以扩展关于symfony的Doctrine(DoctrineBundle)以了解自定义类型。
json DBAL类型实际上称为json_array而不是json(doono为什么),hstore和inet需要实现为新类型(可能不需要inet,也许可以将其别名为字符串)。
我们需要以下两个步骤才能使一切正常工作(如果你只做其中一个,那么映射导入失败,或者缓存:清除失败)。
将全新类型注册为Doctrine类型
# config.yaml
doctrine:
types:
hstore: vendor\MyBundle\Types\Hstore
inet: vendor\MyBundle\Types\Inet
事实证明bootstrap code
是bundle的boot()方法;我们现在需要告诉ORM将数据库链接到这些类,如下所示:
class MyBundle extends Bundle
{
public function boot()
{
$em = $this->container->get('doctrine')->getEntityManager();
$platform = $em->getConnection()->getDatabasePlatform();
//for some reason, Doctrine DBAL calls a json type json_array, we rename it / alias it here.
$platform->registerDoctrineTypeMapping('Json', 'json_array');
$platform->registerDoctrineTypeMapping('Hstore', 'hstore');
$platform->registerDoctrineTypeMapping('Inet', 'inet');
}
}
一些试验和错误的混合+这两个文档: http://symfony.com/doc/current/cookbook/doctrine/dbal.html#registering-custom-mapping-types http://doctrine-orm.readthedocs.org/en/latest/cookbook/custom-mapping-types.html
我还没有测试所有这些的实现,但至少现在app / console上没有任何例外。一旦我确定我的实现是正确的,我将使用类型来源进行更新。