Новичок Symfony здесь. После прочтения некоторой документации Symfony и некоторых ответов здесь, в SO, я теперь почти полностью запутался.
Я пытаюсь использовать компонент консольного приложения и создать маленькое консольное приложение с поддержкой db.
Многие утверждают, что для использования функций DI Symfony достаточно унаследовать мой командный класс не от Symfony \ Component \ Console \ Command \ Command, а от ContainerAwareCommand.
Однако, когда я пытаюсь это сделать, я получаю ошибку Method Not Found при вызове application :: getKernel ().
У меня такое ощущение, что функции DI на самом деле недоступны в консольном приложении на основе консоли составная часть. Есть ли другой вид консольного приложения Symfony, например, основанный на полномасштабной среде?
Мне очень нравится простая структура, предоставляемая консольным компонентом Symfony \ Component \ Console \ Application. Но тогда возникает вопрос — что делать для внедрения зависимостей и DBAL? Кажется, что все примеры, которые я нахожу, ссылаются на полную платформу Symfony и еще больше запутывают меня.
Просто быстрое обновление моего прогресса, если кто-нибудь наткнется на те же проблемы.
Одна вещь, которую я не мог понять, это как создать экземпляры командных классов библиотекой DI без моей помощи, поэтому мне фактически пришлось внедрить сам контейнер в мой переопределенный класс приложения и переопределить getDefaultCommands()
где я затем вытаскиваю экземпляры из контейнера вручную. Не идеально, но придется сделать сейчас.
Если ваша команда расширяется ContainerAwareCommand
...
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
...
class MyCommand extends ContainerAwareCommand
{
Контейнер DI доступен с getContainer()
метод. (как в стандартном контроллере), например:
$this->validator = $this->getContainer()->get('validator');
Я не знаю, актуален ли ваш вопрос, но у меня есть ответ, когда я наткнулся на ту же проблему здесь.
Вам просто нужно создать ядро самостоятельно и передать его в \ Symfony \ Bundle \ FrameworkBundle \ Console \ Application, которая расширяет базовую \ Symfony \ Component \ Console \ Application.
<?php
// CronRun.php
require __DIR__.'/../../../../vendor/autoload.php';
require_once __DIR__.'/../../../../app/AppKernel.php';
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
$application->add(new \KingdomHall\TaskBundle\Command\CronCommand());
$input = new \Symfony\Component\Console\Input\StringInput('k:c:r');
$application->run($input);