CakePHP 2.1.1:从控制器执行shell

时间:2012-11-20 08:18:16

标签: shell cakephp controller console

我正在尝试通过AJAX请求从我的控制器执行 Shell。

在我的控制器中:

public function log_import() {
    $this->autoRender = false;

    App::import('Console/Command', 'AppShell');
    App::import('Console/Command', 'IzigetlogShell');

    $job = new IzigetlogShell();
    $job->dispatchMethod('main');

    echo "REPONSE";

  }

我的外壳:

<?php
App::import('Core', 'Controller');
App::import('Controller', 'Suivis');

class IzilogShell extends AppShell {

    public $uses = array('Suivi');

        -- DU CODE --  

          $this->Suivi = new SuivisController();
          $this->Suivi->constructClasses();


          $exist_date = $this->Suivi->find('first',
              array(
                  'conditions' => array('Suivi.date' => $date_calcul)
              ));

      }

但我总是得到相同的错误消息: PHP致命错误:在第XX行的C:\ wamp \ www \ iziboxLogs \ app \ Console \ Command \ IzigetlogShell.php中调用未定义的方法SuivisController :: find()

我试图从控制台执行shell,我也遇到了同样的错误。

有什么想法吗?谢谢,马丁

2 个答案:

答案 0 :(得分:2)

简短的回答是:你没有!

它违反了MVC蛋糕所代表的含义。 您需要将“共享”代码移动到模型中,并仅在两种情况下使用此模型。不是控制器(来自模型和“webbrowser”的链接/逻辑,而不是你的shell)。而不是控制器内的shell(因为shell是模型和“CLI”的链接/逻辑)。

所以:

  • 模型包含所有代码
  • Shell使用Model及其方法
  • Controller使用Model及其方法

=&GT;干燥和清洁

那么你也不需要一个App :: import(或更好的App :: uses)语句。

PS:如果您碰巧有很多非模型代码,您也可以在APP / Lib中创建一个Lib,并将其作为您的公共类。

PPS:public $uses = array('Suivi');无论如何都适用于模型,不适用于控制器(顺便说一下,文档也是如此)。

答案 1 :(得分:0)

通过这样做

$this->Suivi = new SuivisController();

this->Suivi成为SuiviController,而不再是Suivi模型。

但是你将它用作模型:

$exist_date = $this->Suivi->find(...);

find()方法是模型方法,而不是控制器方法。因此,如果您确实需要调用find()方法,则根本不需要实现SuivisController