如何在Symfony3中的app控制器中运行bundle命令?

时间:2017-04-25 18:01:23

标签: php symfony command-line

引言

在我使用的个人项目中:

  1. Symfony v3.2.7
  2. PHP v7.1.1
  3. CravlerMaxMindGeoIpBundle
  4. How to Call a Command from a Controller
  5. 在Windows 10 Pro开发计算机上
  6. TARGET

    我想成功地从控制器运行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.
    

    问题

    如何在没有错误的情况下运行命令该怎么办?

    CODE

    我在控制器中的动作

    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');
        }
    }
    

    最后

    我错过了什么?

1 个答案:

答案 0 :(得分:9)

导入是一个常见的错误:

use Symfony\Component\Console\Application;

而不是:

use Symfony\Bundle\FrameworkBundle\Console\Application;

因此,请确保导入第二个类(来自FrameworkBundle)以正确加载所有已配置的命令(外部或非外部)。