Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在夹具中执行Symfony 4自定义命令_Symfony_Process_Command_Locking_Fixtures - Fatal编程技术网

在夹具中执行Symfony 4自定义命令

在夹具中执行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调用我的自定义

我在symfony项目中有一个自定义命令,用默认数据填充数据库,应用程序需要在dev和prod环境中工作

对于dev环境,我有一个依赖于这些默认公共数据的fixture脚本。 我正在尝试在fixture脚本中调用我的自定义Symfony命令,以便确保具有正确加载fixture所需的数据

这是我在“pseudo script”中的自定义命令
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