我有一个控制器在数据库中保存数据我想在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');
他们再次提出前方无法识别的错误
知道如何解决这个问题吗? 在此先感谢您的帮助......
答案 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();
}
}