使用CakePHP 1.3我有一个现有的InvoicesController,方法是single_invoice($ customer_id),所有这些都可以通过正常使用来实现。但是,我想通过蛋糕壳做同样的事情并将其构建为cronjob。
我创建了shell,它确实作为cronjob运行,所以这不是问题。问题是我无法从cronjob获取视图。基本上,这是我到目前为止所做的:
class InvoiceCreationShell extends Shell {
var $uses = array('Institution');
function main()
{
$institutions = $this->Institution->find('all');
foreach ($institutions as $institution)
{
App::import('Core', 'Controller');
App::import('Controller', 'Invoices');
$Invoices = new InvoicesController;
$Invoices->constructClasses();
$invoice = $Invoices->single_invoice();
$pdf = create_pdf($invoice);
file_put_contents($pdf);
}
}
}
我想要的是通过$ invoice参数返回渲染的视图内容。
答案 0 :(得分:1)
您无法执行此操作,因为Shell用于CLI应用程序,其中PHP环境与通过Web服务器(如Apache或Nginx)调用的环境不同。
但是,您仍然可以使用现有的Web应用程序功能,并且您有两种选择:
初始化Controller对象
以下代码示例适用于CakePHP> = 2.x
很抱歉,但最初我没有看到问题是关于1.3。在这种情况下,第2点有一个很好的建议。还有一种在CakePHP1.3中初始化Controller对象的方法 - this for example。
在这种情况下,它实际上取决于您的发票生成方式。请记住,视图部分是“不可能的”。因此,如果渲染到变量然后从该变量创建pdf(例如),您仍然可以获得它。诀窍是如何初始化Shell中的Controller对象:
首先包括所需的课程:
应用::进口( '控制器', '控制器'); App :: import('Controller','initializedController');
在Shell / Task中有一个变量:
private $ initializedController;
然后:
$ this-> initializedController = new initializedController(new CakeRequest('/'),new CakeResponse()); $这 - > initializedController-> constructClasses(); $这 - > initializedController-> startupProcess();
现在你可以调用Controller中的所有方法。
2.对现有WebApp发出HTTP请求
这可以通过CakePHP自己的HttpSocket Class或某些请求库(例如Guzzle)来实现。
答案 1 :(得分:0)
我得出的结论是,在与很多人交谈后,使用shell中的视图是不可能的,在此发布以及IRC。所以这就是我解决问题的方法:
我没有尝试从shell输出视图,而是简单地从Controller中渲染视图。以下是控制器解决此问题的示例:
class InvoicesController extends AppController {
function single_invoice($institution_id)
{
/* Do stuff */
return $this->render('single_invoice', 'invoice_layout');
}
}
这允许shell捕获$ invoice参数中渲染视图的内容,然后将其传递给pdf生成器。
我还在$ is_shell的single_invoice操作中添加了一个未显示的参数。然后我在“if($ is_shell){”检查中包围返回$ this-> render ...仅在shell使用时进行渲染。