Doctrine自定义MariaDB Platform无法识别为MariaDb1027Platform如何解决
可行方案(无需自定义SchemaManager)
方案1:使用类别名伪装(推荐,操作成本最低)
PHP原生的class_alias函数可以给自定义类创建别名,且别名和原类的instanceof判断完全等效,刚好可以解决你的需求:
- 在Symfony 4.4项目的
config/bootstrap.php文件最开头添加如下代码,替换为你自己的自定义平台类命名空间:
use Doctrine\DBAL\Platforms\MariaDb1027Platform; use App\DBAL\Platform\CustomDbPlatform; if (!class_exists(MariaDb1027Platform::class, false)) { class_alias(CustomDbPlatform::class, MariaDb1027Platform::class, true); }
- 确认你项目的
config/packages/doctrine.yaml中已经指定了自定义平台类:
doctrine: dbal: platform_service: App\DBAL\Platform\CustomDbPlatform
配置完成后,所有$platform instanceof MariaDb1027Platform的判断都会返回true,MySqlSchemaManager会自动走MariaDB的默认值处理逻辑,不会再触发全量表字段更新。
方案2:自动加载优先级覆盖
如果不想用类别名,也可以通过调整composer自动加载优先级,让你自定义的同名类覆盖Doctrine原生类:
- 在项目src目录下创建和Doctrine原生
MariaDb1027Platform类完全一致的路径:src/Doctrine/DBAL/Platforms/MariaDb1027Platform.php - 编写该类内容,继承你自己的
CustomDbPlatform:
<?php namespace Doctrine\DBAL\Platforms; class MariaDb1027Platform extends \App\DBAL\Platform\CustomDbPlatform { }
- 修改
composer.json的autoload配置,让自定义路径的加载优先级高于vendor目录:
{ "autoload": { "psr-4": { "Doctrine\\DBAL\\Platforms\\": "src/Doctrine/DBAL/Platforms/", "App\\": "src/" } } }
- 执行
composer dump-autoload让配置生效即可。
注意事项
需要确保你的CustomDbPlatform已经完整实现了MariaDb1027Platform的所有核心逻辑,避免出现行为不一致的问题,你可以直接复制MariaDb1027Platform类的所有方法到你的自定义类中,再修改你需要自定义的getDefaultValueDeclarationSQL方法即可。
内容的提问来源于stack exchange,提问作者Filip Kaszczyński
相关产品推荐
相关产品推荐

