【问题标题】:CakePHP 2.1.1 : Execute a shell from controllerCakePHP 2.1.1:从控制器执行外壳
【发布时间】:2019-02-21 15:45:39
【问题描述】:

我正在尝试通过 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,但我得到了同样的错误。

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

【问题讨论】:

  • 你的标题有一部分是错误的——你也得到了它的另一种方式——从 shell 执行一个控制器。无论哪种方式,它都是滥用(Cake)PHP和MVC这样做。恐怕到目前为止你得到的答案也好不到哪里去。
  • @马克。没错,我专注于 Shell 代码,而忽略了 Shell 类也从控制器调用的事实。
  • 您可以参考我的帖子以获得答案。 stackoverflow.com/a/54801498/9406765 谢谢。

标签: shell cakephp controller console


【解决方案1】:

简短的回答是:你没有!

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

所以:

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

=> 干燥清洁

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

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

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

【讨论】:

    【解决方案2】:

    这样做

    $this->Suivi = new SuivisController();
    

    this-&gt;Suivi 成为 SuiviController 而不再是 Suivi 模型。

    但你随后将其用作模型:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多