CakePHP shell使用现有的MVC从视图输出创建pdf

时间:2012-11-21 15:08:34

标签: php cakephp cakephp-1.3

使用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参数返回渲染的视图内容。

2 个答案:

答案 0 :(得分:1)

您无法执行此操作,因为Shell用于CLI应用程序,其中PHP环境与通过Web服务器(如Apache或Nginx)调用的环境不同。

但是,您仍然可以使用现有的Web应用程序功能,并且您有两种选择:

  1. 初始化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();

  2. 现在你可以调用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使用时进行渲染。