在夹具中执行Symfony 4自定义命令
我在symfony项目中有一个自定义命令,用默认数据填充数据库,应用程序需要在dev和prod环境中工作 对于dev环境,我有一个依赖于这些默认公共数据的fixture脚本。 我正在尝试在fixture脚本中调用我的自定义Symfony命令,以便确保具有正确加载fixture所需的数据 这是我在“pseudo script”中的自定义命令在夹具中执行Symfony 4自定义命令,symfony,process,command,locking,fixtures,Symfony,Process,Command,Locking,Fixtures,我在symfony项目中有一个自定义命令,用默认数据填充数据库,应用程序需要在dev和prod环境中工作 对于dev环境,我有一个依赖于这些默认公共数据的fixture脚本。 我正在尝试在fixture脚本中调用我的自定义Symfony命令,以便确保具有正确加载fixture所需的数据 这是我在“pseudo script”中的自定义命令app:db:populate,只是创建了一组实体persit&flush。当我通过php-bin/console-app:db:populate调用我的自定义
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依赖于这些数据。因此,我尝试使用进程类以这种方式执行脚本:
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()之前,自定义命令似乎执行得很好代码>
我的控制台中有以下错误(post的数据被混淆):
我不知道该怎么处理这个错误。。。为什么通过经典控制台调用使用该命令时可以正常工作,为什么它在进程中不工作
如果你有任何其他策略来帮助我实现我的目标,我在听:)
祝你今天愉快 因此,简单的答案是
引用Symfony文档:
您可能需要执行一些仅在控制台命令中可用的功能。通常,您应该重构命令,并将一些逻辑移动到一个可以在控制器中重用的服务中
我最终创建了一个服务类来处理所有app:db:populate逻辑(读取json文件并在数据库中插入基本的应用实体)。然后我在app:db:populate执行方法和AppFixtures加载方法中调用此服务
希望这能对别人有所帮助。在这种情况下我会考虑两件事。1.在Symfony中调用console命令可能比在系统控制台中单独调用要慢,因此锁定计时器可能会超过所示的时间。2.可能的情况是,在调用app:db:populate
之前,数据库已被Symfony/doctor锁定,等待完成load
调用,以便您有一个循环引用。所以你能做的是:1。检查循环参考,例如加载
allready锁定数据库以读取夹具,2。增加锁定计时器以确保它不是循环引用。您还可以将命令类作为服务注入,并通过Symfony直接调用它,而不是作为控制台命令:,。非常感谢@goulashsoup,我最终创建了一个处理所有db填充逻辑的服务类(读取json文件并在数据库中插入基本应用实体)。然后我在app:db:populate-execute和AppFixtures-load方法中调用该服务。谢谢你的帮助
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