更改symfony项目上composer管理的第三方软件包上的源文件

更改symfony项目上composer管理的第三方软件包上的源文件,symfony,doctrine-orm,composer-php,packages,require,Symfony,Doctrine Orm,Composer Php,Packages,Require,我正在使用symfony框架开发一个Web应用程序。 我的数据库设计是预先存在的,不是“经典的”——也就是说,使用的是“hstore”和“json”字段类型 到目前为止,我遇到了两个问题: Doctrine不支持PgSQL上的hstore或json字段格式-I'v设法更改了DBAL驱动程序和ORM的供应商/Doctrine的来源以实现这一点 Doctrine还有一个BUG(使用symfony的最新版本),该BUG可能在早期版本中已解决,该BUG与将pg时间戳转换回PHP时间戳有关,时间格式不包括

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

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

  • Doctrine不支持PgSQL上的hstore或json字段格式-I'v设法更改了DBAL驱动程序和ORM的供应商/Doctrine的来源以实现这一点
  • Doctrine还有一个BUG(使用symfony的最新版本),该BUG可能在早期版本中已解决,该BUG与将pg时间戳转换回PHP时间戳有关,时间格式不包括微秒('u'),而pg返回时会返回HH:mm:ss.uuu()
  • 让我们假设我能够通过对包进行源代码更改来解决这些问题

    这里的问题是由不同的问题组成的,我有不同的选择,我想任何一个好的答案都可以

    • 如果文件由编写器管理,如何保持更新
    • 如果我更改了源代码,如何将其部署到另一个环境中
    • 是否有替代解决方案/HAKC在不更改第三方软件包的情况下解决上述问题
    • 是否有一种方法可以在composer中部署自定义提交(不介意分叉DoctorineBundle)
    • 在供应商安装之后,是否有一种好的方法来“修补”源代码?(可能以某种方式使用安装后脚本)
    我希望(但对此表示怀疑)我可以从composer.json中删除对相应包的要求,并将新的供应商/文件与我的src/一起保留,但这不是我要寻找的解决方案


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

    首先,原则是非常可扩展的。当然,应该有一种方法可以使用捆绑包代码扩展它,而无需修改
    vendor/
    中的任何内容

    条令的文档声明已支持
    json
    类型:<根据doc,code>hstore不是,但是如果你能实现它,这是值得合并到doctor项目中的东西

    日期时间问题也是众所周知的:

    在forking Composer提供的库上:您可以在Github上fork原则,并将
    存储库
    块添加到
    Composer.json
    ,指向您的fork:

    {
    ...
    "repositories": [
             {
                 "type": "vcs",
                 "url": "http://github.com/**your/fork**"
             } 
        ]
    }
    
    使用Composer更新条令包(应该是
    php Composer.phar Update Doctrine/orm
    ,或者
    Doctrine/dbal
    Doctrine/common
    或者
    Doctrine/Doctrine bundle
    ,如果您正在分叉该捆绑包),并且它应该拉动您的分叉代码,而不是原始的条令代码。查看正在分叉的库的
    composer.json
    中的
    “name”


    这里有一个更详细的关于分叉的教程:

    经过一些研究,似乎关于symfony(DoctrineBundle)的学说可以扩展到了解自定义类型

    json DBAL类型实际上称为json_数组,而不是json(doono why),hstore和inet需要作为新类型实现(inet可能不需要,可以将其别名为string)

    为了使一切正常工作,我们需要完成以下两个步骤(如果只执行其中一个步骤,则映射导入失败,或者cache:clear失败)

  • 将全新类型注册为条令类型

    # 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');
        }
    }
    
  • 一些尝试和错误的混合+这两个文档:


    我还没有测试所有这些的实现,但至少现在在应用程序/控制台上没有任何异常。一旦我确定我的实现是正确的,我将使用类型源代码进行更新。

    当然,另一个选择是尝试不同的ORM,我也会尝试。找到相关问题,也有一些有用的答案,我使用了
    php应用程序/控制台原则:generate:entities
    对数据库进行反向工程,它在json和hstore方面给我带来了一个错误(更不用说我需要从文件名和映射文件中删除模式前缀了)。请检查您正在使用的原则版本,并尽可能尝试更新到开发/功能分支。或者医生有问题。