我在symfony项目中有一个自定义命令,用于使用应用程序在开发和生产环境中工作所需的默认数据填充数据库。
对于开发环境,我有一个fixture脚本,它依赖于这些默认的公共数据。我试图在fixture脚本中调用我的自定义Symfony命令,这样我就可以确保正确加载我的fixture所需的数据。
这是我在“伪脚本”中的自定义命令app:db:populate
,只是创建一堆实体,persit & flush。当我通过php bin/console app:db:populate
调用它时,我的自定义命令工作正常
protected function execute(InputInterface $input, OutputInterface $output)
{
// Creating a bunch of default entities, persist them and flush
$data = new MyDefaultEntity();
// ...
$this->manager->persist($data);
// ...
$this->manager->flush();
}
然后,在我的fixture脚本中,我想首先调用app:db:populate
,因为fixture依赖于这些数据。因此,我尝试使用Process
类以如下方式执行我的脚本:
public function load(ObjectManager $manager)
{
// Execute the custom command
$cmd = 'php bin/console app:db:populate';
$process = new Process($cmd);
$process->run(function ($type, $buffer) {
if (Process::ERR === $type) {
echo 'ERR > '.$buffer;
} else {
echo 'OUT > '.$buffer;
}
});
// Then load the fixtures !
// ...
}
在$this->manager->flush();
我的控制台中出现以下错误(帖子的数据被混淆):
In AbstractMySQLDriver.php line 36:
An exception occurred while executing 'INSERT INTO ....(..., ..., ...) VALUES (?, ?, ?)' with params ["...", "...", "..."]:
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
我不知道该如何处理此错误...为什么通过传统控制台调用使用此命令时可以正常工作,为什么在进程中不工作?
1条答案
按热度按时间eqqqjvef1#
简单来说就是
引用Symfony文档:
您可能需要执行一些仅在控制台命令中可用的功能。通常,您应该重构命令并将一些逻辑移动到一个可以在控制器中重用的服务中。
我最终创建了一个服务类来处理所有的app:db:populate逻辑(读取json文件并在数据库中插入基本的应用实体),然后在app:db:populate执行方法和AppFixtures加载方法中调用此服务。
希望这能对某人有所帮助。