2010-06-01 96 views
3

我在CakePHP 1.3中編寫了一個具有返回值的shell方法。訪問控制器中的shell方法? CakePHP 1.3

我希望能夠從訪問控制器內的方法,讓我可以通過它的返回值進入查看。

我不知道如何從控制器內適當地訪問這些方法。我做錯了嗎?我可以很容易地複製代碼,但我想「保持乾爽」,我相信實際功能不屬於這個特定的控制器 - 我只是需要它在這個特定的視圖中返回值。

編輯:

我意識到,我有點問錯了問題在這裏,因爲殼牌本身不一定返回值。我已經使殼牌只使用返回值我想改變的代碼,現在我不知道 - 什麼是額外的類/代碼,需要從殼牌一個控制器訪問了適當的地方嗎?

好像組件的代碼,但我不知道如何從shell訪問組件。根據我的理解,它不是一個插件。這個去哪了?

回答

5

在我們進口的殼任務的項目之一任何控制器使用它,例如:


App::import('Core', 'Shell');
App::Import('Vendor','shells/tasks/sometask');

$returndata = TasknameTask::execute($somevalue);


0

殼不應直接返回一個值明確,他們應該以某種方式填報,如通過將其回顯到標準輸出,記錄到文件或發送電子郵件等。我喜歡將shell看作是cli的控制器。如果不知道你的應用程序,我的建議是看你是否可以將當前shell中的邏輯重構爲模型類或類似的東西,讓模型方法返回值,然後在你的shell中使用該模型。這樣,您也可以在控制器中使用該模型。

+0

殼牌只能使用從重要的信息返回給它顯示的信息,所以我想在技術上它不是殼牌我需要訪問。是否有適當的地方放置需要從Shell和Controller訪問的類/代碼? – 2010-06-04 13:25:37

2

您可以create a component做that.Eg

/* in app/controllers/components */ 
class ShellComponent extends Object 
{ 
    function do_shell() 
    { 
     return shell_exec('some command'); 
    } 
} 

然後在你想如下

/* in some controller*/ 
var $components = array('Shell','maybe some other components',....); 

function testShell() 
{ 
    $result = $this->Shell->do_shell(); 
    .... 
} 
+0

因爲我喜歡將代碼從模型中分離出來的想法,正如我所提到的 - 它並不直接相關 - Component是一個好主意。但是我可以從Shell訪問組件嗎? – 2010-06-04 13:21:50

+0

嗯,這不是一個好主意我think.components是蛋糕中的控制器而不是操作系統中的shell :) – Young 2010-06-04 13:54:34

+0

這是cakephp 2的方法嗎?謝謝 – trante 2012-08-24 12:55:27

0

接受的答案似乎並不蛋糕2.0

工作蛋糕2.0

if (!class_exists('Shell')) { 
    require CONSOLE_LIBS . 'shell.php'; 
} 

App::import('Shell', 'DoSomething'); 
DoSomethingShell::main(); 

請記住一些殼牌方法不會在此模式下工作,例如通過$ this- > out,所以需要更多的黑客行爲。