В моем личном проекте я использую:
Я хотел бы запустить CravlerMaxMindGeoIpBundle's
php bin/console cravler:maxmind:geoip-update
от контроллера успешно.
На данный момент я установил пакет CravlerMaxMindGeoIpBundle
и команду php bin/console cravler:maxmind:geoip-update
прекрасно работает в командной строке.
Затем я выполнил официальную документацию (4-я ссылка в разделе «Вступление»). Разумеется, команда с изменяемым вызовом. И все же я получаю сообщение об ошибке.
[Symfony\Component\Console\Exception\CommandNotFoundException] There are no commands defined in the "cravler:maxmind" namespace.
Что делать, чтобы запустить команду без ошибок?
Мое действие в контроллере
public function geoIpUpdateAction(Request $request) { $kernel = $this->get('kernel'); $application = new Application($kernel); $application->setAutoExit(false); $input = new ArrayInput(array( 'command' => 'cravler:maxmind:geoip-update' )); // You can use NullOutput() if you don't need the output $output = new BufferedOutput(); $application->run($input, $output); // return the output, don't use if you used NullOutput() $content = $output->fetch(); // return new Response(""), if you used NullOutput() dump($content); return $this->render('admin/geo_ip.html.twig'); }
Мой AppKernel с включенными пакетами
<?php use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Config\Loader\LoaderInterface; class AppKernel extends Kernel { public function registerBundles() { $bundles = [ new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new AppBundle\AppBundle(), new Bmatzner\FoundationBundle\BmatznerFoundationBundle(), new Knp\Bundle\TimeBundle\KnpTimeBundle(), new FOS\UserBundle\FOSUserBundle(), new Cravler\MaxMindGeoIpBundle\CravlerMaxMindGeoIpBundle(), ]; if (in_array($this->getEnvironment(), ['dev', 'test'], true)) { $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); } return $bundles; } public function getRootDir() { return __DIR__; } public function getCacheDir() { return dirname(__DIR__).'/var/cache/'.$this->getEnvironment(); } public function getLogDir() { return dirname(__DIR__).'/var/logs'; } public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml'); } }
Что мне не хватает?
Это типичная ошибка для импорта:
use Symfony\Component\Console\Application;
вместо:
use Symfony\Bundle\FrameworkBundle\Console\Application;
Поэтому обязательно импортируйте второй класс (из FrameworkBundle), чтобы правильно загрузить все настроенные команды (внешние или нет).