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


Running a cron job in Symfony2 - trying to call a method in a controller

我正在做一场噩梦,试图在我的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);
    }

我已经在我的配置中将发票设置为一项服务。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作业来运行吗?

感谢您的帮助。

Michael

我担心您可能还不了解全局。控制台应用程序没有请求对象,因此整个requestrongtack无法工作。我知道您尝试创建一个请求对象,但这不会影响请求堆栈。

你的控制台应用程序应该看起来像:

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']);