自定义命令脚本目录结构当前项目结构是这样的(参考代码库):其中db/migrations文件夹是migrationclass文件夹,config/db.php是我们项目原来的db配置,migrations.php和migrations-db.php是迁移组件需要的配置文件。编写自定义命令脚本,首先在根目录新建一个文件:migrate,不带后缀,并添加可执行权限。并参考组件原命令脚本vendor/doctrine/migrations/doctrine-migrations.php,先获取项目原数据库配置信息,替换migrations-db.php数据库配置文件:$db_config=include'配置/数据库。php';$db_params=['driver'=>'pdo_mysql','host'=>$db_config['host'],'port'=>$db_config['port'],'dbname'=>$db_config['dbname'],'user'=>$db_config['user'],'password'=>$db_config['password'],];尝试{$connection=DriverManager::getConnection($db_params);}catch(DBALException$e){echo$e->getMessage()。PHP_EOL;exit;}然后配置组件,替换migrations.php配置文件:$configuration=newConfiguration($connection);$configuration->setName('DoctrineMigrations');$configuration->setMigrationsNamespace('db\migrations');$configuration->setMigrationsTableName('migration_versions');$configuration->setMigrationsDirectory('db/migrations');最后是完整的命令脚本代码:#!/usr/bin/envphp'pdo_mysql','host'=>$db_config['host'],'port'=>$db_config['port'],'dbname'=>$db_config['dbname'],'user'=>$db_config['user'],'password'=>$db_config['password'],];try{$connection=DriverManager::getConnection($db_params);}catch(DBALException$e){echo$e->getMessage()。PHP_EOL;exit;}//迁移组件配置$configuration=newConfiguration($connection);$configuration->setName('DoctrineMigrations');$configuration->setMigrationsNamespace('db\migrations');$configuration->setMigrationsTableName('migration_versions');$configuration->setMigrationsDirectory('db/migrations');//创建命令脚本$helper_set=newHelperSet(['question'=>newQuestionHelper(),'db'=>newConnectionHelper($connection),newConfigurationHelper($连接,$配置),]);$cli=ConsoleRunner::createApplication($helper_set);尝试{$cli->run();}catch(Exception$e){echo$e->getMessage()。PHP_EOL;}现在执行迁移相关命令时,将之前的vendor/bin/doctrine-migrations部分替换为./migrate,同时配置migrations.php和migrations-db.php文件也可以删除。PhpStorm集成迁移命令如果使用PhpStorm,命令行也可以集成到开发工具中,会有自动提示,大大提高工作效率:PhpStorm->Preferences->CommandLineToolSupport->AddChoosetool选择工具基于SymfonyConsole,点击OKAlias并输入m,PathtoPHPexecutable选择php路径,pathtoscript选择同目录下的migrate文件点击OK,如果提示Found9commands,则配置成功。PhpStorm->Tools->RunCommand,会弹出命令窗口,输入m,出现命令提示符。结束语至此,数据迁移组件已经灵活的集成到我们自己的项目中,您也可以根据自己的项目灵活修改自定义命令脚本文件。但是如果你长期使用,你会发现目前的数据迁移有两个问题:不支持tinyint类型。在相关issue中,官方开发者回复:“Tinyinteger”很多数据库厂商不支持。DBAL的类型系统是SQL类型的抽象层,包括从PHP到数据库值以及返回的类型转换。我假设您的问题与MySQL有关,我们没有用于BooleanType映射的独特本机SQL类型。因此,MySQL的TINYINT被用于该目的,因为它最适合所有可用的本机类型,而在DBAL中,我们没有像这样的小整数的抽象(如上所述)。您可以做的是实现您自己的小整数自定义类型并告诉DBAL使用列注释(以区别于MySQL中的BooleanType)。那应该有效。请参阅文档。要告诉DBAL对自定义类型使用列注释,只需覆盖requiresSQLCommentHint()方法以返回true。所以只能添加自定义类型。另一个问题是不支持枚举类型。深挖代码后发现enum类型的特殊格式不好集成到组件中,不能支持自定义类型,但是如果中途添加数据迁移组件,如果已经有数据表现在项目中的structure,里面包含了enum类型的字段,那么使用迁移组件会报错。那么,在下一章中,我们将完成这两件事:添加一个自定义的tinyint类型,解决enum报错的问题。可以在我的代码库中查看本文的详细代码,欢迎star。
