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