2012-11-20 22 views
4

我試圖通過AJAX請求從我的控制器執行一個Shell。CakePHP 2.1.1:從控制器執行一個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致命錯誤:調用未定義的方法SuivisController ::發現( )在C:\ wamp \ www \ iziboxLogs \ app \ Console \ Command \ IzigetlogShell.php上XX行

我試過ex從控制檯執行shell,我得到了同樣的錯誤。

任何想法?謝謝,馬丁

+0

您的標題部分錯誤 - 您也以其他方式得到它 - 從shell執行控制器。無論哪種方式,它濫用(蛋糕)PHP和MVC這樣做。你所得到的答案到目前爲止恐怕不會好過。 – mark

+0

@Mark。你是對的,我專注於Shell代碼,並且錯過了從控制器調用Shell類的事實。 – nIcO

回答

0

通過這樣做

$this->Suivi = new SuivisController(); 

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

但是你再使用它作爲一個模型:

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

find()方法是一個模型的方法,而不是一個控制器方法。因此,如果您確實需要撥打find()方法,則根本不需要立即對SuivisController進行實例化。

2

簡短的回答是:你不!

它違反了MVC什麼蛋糕代表。 您需要將「共享」代碼移到模型中,並且只能在兩種情況下使用此模型。而不是控制器(這是模型和「瀏覽器」的鏈接/邏輯,而不是你的shell)。而不是控制器內的外殼(因爲外殼是來自模型和「CLI」的鏈接/邏輯)。

所以:

  • 模型包含了所有的代碼
  • Shell使用模型和它的方法
  • 控制器使用模型及其方法

=>乾燥和清潔

那麼你也不需要一個App :: import(或更好的App :: uses)語句。 PS:如果您碰巧有很多非模型代碼,您也可以在APP/Lib中創建一個Lib,並將其用作普通類。

PPS:public $uses = array('Suivi');無論如何都適用於模型,不適用於控制器(作爲docs speficy的方式)。