如何在symfony 2的命令类中使用类控制器函数?

时间:2017-03-16 13:35:44

标签: php symfony command-line-interface symfony-2.6

我正在使用symfony 2命令类构建批处理文件。我有一个函数,它处理来自bundle中控制器的DB

class SubmitDisclosureController extends FOSRestController implements MEAuthController { ... public function discDetails($discId) {
$emr = $this->getDoctrine()->getEntityManager();

我是通过命令src/AppBundle/Command/BatchJobCommand.php 来调用它,如下所示

class BatchJobCommand extends Command
{
protected function execute(InputInterface $input, OutputInterface $output)
{
    $output->writeln([
            'User Creator',
            '============',
            '',
        ]);

    // retrieve the argument value using getArgument()
    $output->writeln('First batch job')

    $disc = new SubmitDisclosureController();
    $disc->discDetails('42094');
`

如果我尝试执行它,它会给出PHP Fatal error: Call to a member function has() on null in C:\xampp\htdocs\GR\ vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller. php on line 288

是不是可以通过从命令类调用控制器的函数来重用代码?

2 个答案:

答案 0 :(得分:3)

$disc = new SubmitDisclosureController();
$disc->setContainer($this->getContainer());
$disc->discDetails('42094');

会让您通过错误消息。但是,正如@MateiMihai所说,更好的设计是将光盘功能转移到它自己的服务中,然后在你的控制器,命令和测试类之间共享。 http://symfony.com/doc/current/service_container.html `

答案 1 :(得分:1)

什么说Matei正是您所需要的:创建服务并在每个班级上使用它:

class DisclosureService { ...  public function discDetails($discId) {...}  }

在services.yml配置文件中,您必须添加它。

 disclosure:
    class:  Your\Namespace\DisclosureService 
    arguments: ["@doctrine", ...]

在你的命令和&控制器,您可以通过以下方式调用服务:

$this->get('disclosure')->discDetails('')

详细信息可在官方文档中找到:http://symfony.com/doc/current/service_container.html