Выполнение Symfony 4 пользовательских команд в приборах - PullRequest
1 голос
/ 10 февраля 2020

У меня есть пользовательская команда в моем проекте symfony для заполнения базы данных данными по умолчанию, которые должны работать в среде dev и prod.

Для среды dev у меня есть скрипт фикстуры это зависит от этих общих данных по умолчанию. Я пытаюсь вызвать мою пользовательскую команду Symfony в скрипте фикстуры, чтобы у меня были необходимые данные для правильной загрузки моих приборов.

Это моя пользовательская команда app:db:populate in "псевдо скрипт ", просто создавая кучу сущностей, persit & flu sh. Моя пользовательская команда работает нормально, когда я вызываю ее через 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();
}

Затем в моем скрипте фикстуры я сначала хочу вызвать app:db:populate, потому что фикстуры зависят от этих данных. Поэтому я попытался использовать класс 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

Я не знаю, что делать с этой ошибкой ... Почему команда работает нормально при использовании через консольный вызов classi c и почему он не работает в процессе?

Если у вас есть какая-либо другая стратегия, которая поможет мне достичь моей цели, я слушаю:)

Хорошего дня!

1 Ответ

1 голос
/ 16 февраля 2020

Итак, краткий ответ:

Цитирование Symfony Документация:

Возможно, вам потребуется выполнить некоторую функцию, которая доступна только в консольная команда. Как правило, вам следует реорганизовать команду и переместить некоторые логи c в службу, которую можно повторно использовать в контроллере.

В итоге я создал класс службы, который обрабатывает все приложение: db: populate logi c (прочитайте файл json и вставьте сущности приложения basi c в базу данных). Затем я вызываю этот сервис в обоих приложениях: db: populate execute методы и методы загрузки AppFixtures.

Надеюсь, это кому-нибудь поможет.

...