在symfony2中调用控制台功能

时间:2016-01-28 10:46:01

标签: symfony doctrine-orm

我有一个控制器在数据库中保存数据我想在crontab中运行此控制器。为此我做了

 class GetApiController extends Controller {
      public function getapiAction() {
          download xml data..
          saved in database used some querybuilder function.....
           }
    }

现在我尝试定义一个控制台功能

  class GetApiCommand extends ContainerAwareCommand
   {

 protected function execute(InputInterface $input, OutputInterface $output)
   {
 $getapicontroller =new GetApiController();  

 $getapicontroller->getapiAction();
   }

   } 

制作这个getapi控制器的实例并尝试在那里调用该操作方法,它给我错误

第291行上的

kBundle \ Controller \ Controller.php  致命错误:调用成员函数has()on null ..

我也尝试制作这个控制器服务,并尝试在

的帮助下打电话
       $this->forward('app.get_controller:getapiAction');

他们再次提出前方无法识别的错误

知道如何解决这个问题吗? 在此先感谢您的帮助......

1 个答案:

答案 0 :(得分:3)

您需要创建Service来完成您想要的工作。然后,您可以从Controller和Command中使用此服务。

这意味着控制器和控制台命令都可以调用它,如果你需要更改它,你只需要在一个地方更改它。

因此,如果您的服务已使用名称' my_service'进行注册,那么您的控制器将会是这样的;

class GetApiController extends Controller {
      public function getapiAction() {
          $my_service = $this->get('my_service');
          $my_service->download();
    }
}

和您的控制台命令类似;

<?php
namespace MyBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class MyCommandCommand extends ContainerAwareCommand 
{
    ...
    protected function execute(InputInterface $input, OutputInterface $output)
    {
          $myService = $this->getContainer()->get('my_service');
          $my_service->download();
    }
}