2010-06-01 50 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,所以需要更多的黑客行为。