【问题标题】:Making changes to source files on a composer-managed 3rd party packages on symfony project在 symfony 项目中对 composer 管理的 3rd 方包中的源文件进行更改
【发布时间】:2014-05-20 09:48:12
【问题描述】:

我正在使用 symfony 框架开发一个 Web 应用程序。 我的数据库设计是预先存在的,不是“经典”的 - 也就是说,“hstore”和“json”的字段类型正在使用中。

到目前为止,我遇到了两个问题:

  1. Doctrine 不支持 PgSQL 上的 hstore 或 json 字段格式 - 我已设法更改 DBAL 驱动程序和 ORM 的供应商/准则的来源以执行此操作。
  2. Doctrine 也有一个 BUG(使用了最新版本的 symfony),据说在早期版本中已解决,该错误与 pg 时间戳转换回 PHP 时间戳有关,时间格式不包括微秒('u' ) 而 Pg 确实以 HH:mm:ss.uuuuuu (http://www.doctrine-project.org/jira/browse/DBAL-33) 返回它

假设我能够通过更改包的源代码来解决这些问题。

这里的问题由不同的问题和我想到的替代方案组成,我猜对其中一个问题的任何好的答案都可以。

  • 如果文件由作曲家管理,我如何保持更新?
  • 如果我更改了源,如何将其部署到另一个环境中?
  • 是否有其他解决方案/hakcs 可以在不更改 3rd 方包的情况下解决上述问题?
  • 有没有一种方法可以在作曲家中部署自定义提交(不介意分叉 DoctorineBundle)?
  • 供应商安装后是否有“修补”源的好方法? (也许以某种方式使用安装后脚本)

我希望(但对此表示怀疑)我可以从 composer.json 中删除对相应包的要求,并将新的 vendor/ 文件与我的 src/ 一起保留,但这不是我正在寻找的解决方案。

注意我不熟悉使用 composer 进行所有此类依赖和包导入/管理。

【问题讨论】:

标签: symfony doctrine-orm composer-php packages require


【解决方案1】:

经过一些研究,可以将 Doctrine on symfony (DoctrineBundle) 扩展到了解自定义类型。

json DBAL 类型实际上称为 json_array 而不是 json(doono 为什么),hstore 和 inet 需要实现为新类型(inet 可能不需要,也许可以将其别名为字符串)。

为了让一切正常工作,我们需要执行这两个后续步骤(如果您只执行其中一个,则映射导入失败或缓存:清除失败)。

  1. 将全新的类型注册为 Doctrine 类型

    # config.yaml
    doctrine:
            types:
                hstore:  vendor\MyBundle\Types\Hstore
                inet:  vendor\MyBundle\Types\Inet
    
  2. 原来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

我还没有测试所有这些的实现,但至少现在在应用程序/控制台上没有任何例外。一旦我确定我的实现是正确的,我会更新类型来源。

【讨论】:

    【解决方案2】:

    首先,Doctrine 是可扩展的。绝对应该有一种方法可以使用您的捆绑代码扩展它,而无需修改 vendor/ 中的任何内容。

    Doctrine 的文档指出 json 类型已经被支持:http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html#mapping-matrixhstore 不是,根据文档,但如果你能实现它,那是值得合并到 Doctrine 项目中的东西。

    日期时间问题也是已知的:http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/known-vendor-issues.html#postgresql

    关于 fork Composer 提供的库:您可以在 Github 上 fork Doctrine 并将 repositories 块添加到您的 composer.json 中,指向您的 fork:

    {
    ...
    "repositories": [
             {
                 "type": "vcs",
                 "url": "http://github.com/**your/fork**"
             } 
        ]
    }
    

    使用 Composer 更新 Doctrine 包(应该是 php composer.phar update doctrine/orm,或 doctrine/dbaldoctrine/commondoctrine/doctrine-bundle,如果您要分叉捆绑包),它应该拉取您的分叉代码而不是原始代码教义代码。观察你正在分叉的库的composer.json 中的"name" 值。

    这里有一个更详细的分叉教程:http://mnapoli.fr/overriding-dependencies-with-composer/

    【讨论】:

    • 好吧,我使用php app/console doctrine:generate:entities <bundlename> 对数据库进行逆向工程,它给我带来了关于 json 和 hstore 的错误(更不用说我需要从文件名和地图中删除模式前缀)文件)。
    • 检查你正在使用的 Doctrine 版本,如果可能的话尝试更新到 dev/feature 分支。或者文档有问题。
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2013-01-16
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多