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

how to use class controller functions in command class of symfony 2?

我正在使用 symfony 2 命令构建一个批处理文件 class。我有一个函数可以处理来自捆绑包内控制器的数据库

class SubmitDisclosureController 扩展 FOSRestController 实现 MEAuthController { ... public 函数 discDetails($discId) {<br> $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

是否无法通过从命令调用控制器的函数来重新使用代码 class?

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

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

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

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