【问题标题】:how to use class controller functions in command class of symfony 2?如何在 symfony 2 的命令类中使用类控制器功能?
【发布时间】:2017-08-07 17:16:12
【问题描述】:

我正在使用 symfony 2 命令类构建一个批处理文件。我有一个函数可以从包中的控制器处理 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

难道不能通过从命令类调用控制器的功能来重用代码吗?

【问题讨论】:

  • 其实你需要的其实是一个控制器和命令都可以使用的服务
  • @MateiMihai 是的,你是对的。但这种变化会影响现有的功能。

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


【解决方案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

【讨论】:

  • 注意:如果您想在命令中使用定义的服务,请确保扩展 ContainerAwareCommand。您还需要不同的代码来访问命令$this->getContainer()->get('disclosure'); 中的服务。另请参阅:symfony.com/doc/current/…
  • 不要吹毛求疵,但关于 ContainerAwareCommand 和基本 Controller 类的一个有点烦人的事情是命令类没有 get 函数。所以你的代码不会像发布的那样工作。编辑:看起来@Joe 比我快了大约三秒。
【解决方案2】:
$disc = new SubmitDisclosureController();
$disc->setContainer($this->getContainer());
$disc->discDetails('42094');

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

【讨论】:

  • 我试过你的答案。我收到一个新错误。 PHP Notice: Use of undefined constant OCI_COMMIT_ON_SUCCESS - assumed 'OCI_COMMIT_ON_SUCCESS'。我能够在本地连接到数据库并且工作正常。仅当我在命令行上尝试时才会出现此问题。 OCI8 是否有任何单独的设置可以在 CLI 中使用?
  • 不。应该是完全相同的连接东西,除非你真的用配置文件愚弄了。但你接受了另一个答案,所以我想一切都很好。
  • 我接受了答案,因为它适用于我的原始帖子。现在问题出在系统配置上,我猜Notice: Use of undefined constant OCI_COMMIT_ON_SUCCESS - assumed 'OCI_COMM IT_ON_SUCCESS'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多