4

我正在尝试通过 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 Fatal error: Call to undefined method SuivisController::find() in C:\wamp\www\iziboxLogs\app\Console\Command\IzigetlogShell.php on line XX

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

有任何想法吗 ?谢谢,马丁

4

2 回答 2

1

简短的回答是:你没有!

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

所以:

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

=> 干燥清洁

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

PS:如果你碰巧有很多非模型代码,你也可以在APP/Lib中做一个Lib作为你的常用类。

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

于 2012-11-20T09:03:24.347 回答
0

通过做这个

$this->Suivi = new SuivisController();

this->Suivi变成 SuiviController 而不是 Suivi 模型了。

但是您随后将其用作模型:

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

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

于 2012-11-20T08:50:53.950 回答