在Symfony2中运行cron作业 - 尝试在控制器中调用方法

时间:2015-10-30 13:03:43

标签: php symfony cron

我正在尝试在我的Symfony2项目中设置一个cron作业。

我理解设置它的原则以及放置代码的位置,但我无法让它做我需要的。

基本上,我需要每天运行cron作业并检查客户数据库,以确定发票是否需要发送。实际的客户端引用尚未完成,但我已经编写了一个测试,我想根据我传递给函数的硬编码值生成电子邮件和发票。

// AppBundle/Command/CronRunCommand.php

protected function execute(InputInterface $input, OutputInterface $output)
    {

        $request = new Request();
        $request->attributes->set('client','14');
        $request->attributes->set('invoice_id','3');
        $request->attributes->set('dl','0');

        $output->writeln('<comment>Running Invoice Cron Task...</comment>');

        return $this->getContainer()->get('invoices')->generateInvoiceAction($request);

    }

我已在config.yml中将发票设置为服务:

services:
  invoices:
      class: AppBundle\Controller\InvoiceController

在InvoiceController中,有一个函数可以使用Invoice Painter Bundle生成发票,然后将其发送到指定的电子邮件地址(目前为了开发目的而硬编码)。

当我在控制台上运行cron命令时,它会抛出以下错误:

[Symfony\Component\Debug\Exception\FatalErrorException]  
  Error: Call to a member function has() on null 

我已经搜索了这个,我相信这是因为它引用了一个控制器方法并且我的命令文件没有扩展控制器,但我对如何做到这一点感到很困惑 - 当然有一个在控制器中作为cron作业运行方法的方法?

任何帮助表示感谢。

迈克尔

1 个答案:

答案 0 :(得分:1)

我担心你可能仍然无法理解大局。控制台应用程序没有请求对象,因此整个request_stack不起作用。我知道您尝试创建请求对象,但这不会影响请求堆栈。

您的控制台应用应该类似于:

protected function execute(InputInterface $input, OutputInterface $output)
{
  $data = [
    'client'  => 14,
    'invoice' => 3,
    'dl'      => 0,
  ];
  $invoiceManager = $this->getContainer()->get('invoices');

  $results = $invoiceManager->generateInvoice($data);
}

您的控制器操作类似于:

public function generateInvoiceAction(Request $request)
{
  $data = [
    'client'  => $request->attribute->get('client'),
    'invoice' => $request->attribute->get('invoice'),
    'dl'      => $request->attribute->get('dl'),
  ];
  $invoiceManager = $this->getContainer()->get('invoices');

  $results = $invoiceManager->generateInvoice($data);

发票管理器可能如下所示:

class InvoiceManager {
  public function __construct($em) {
    $em = $this->em;
  }
  public function generateInvoice($data) {
    $client = $this->em->find('Client',$data['client']);