我在CakePHP 1.3中编写了一个返回值的shell方法。
我希望能够从控制器中访问该方法,以便我可以将其返回值传递给View。
我不确定如何从控制器内适当地访问这些方法。我做错了吗?
我可以轻松复制代码,但我想“保持干燥”,而且我认为实际的功能不属于这个特定的控制器 - 我只需要它在这个特定视图中的返回值。
编辑:
我意识到我在这里提出了一个错误的问题,因为Shell本身不一定会返回一个值。我已经更改了代码,以便Shell只使用我想要的返回值,现在我想知道 - 需要从Shell访问的额外类/代码的适当位置是什么<控制器强>和?
它似乎是组件代码,但我不确定如何从Shell访问组件。它不是插件,因为我理解它们。这是怎么回事?
答案 0 :(得分:5)
在我们导入shell任务的其中一个项目中,例如:
App::import('Core', 'Shell');
App::Import('Vendor','shells/tasks/sometask');
$returndata = TasknameTask::execute($somevalue);
答案 1 :(得分:2)
你可以create a component这样做。例如
/* 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();
....
}
答案 2 :(得分:0)
Shell不应该直接返回一个值,它们应该以某种方式报告它,例如通过将其回显到stdout,记录到文件或发送电子邮件等。我喜欢将shell视为cli的控制器。
在不知道你的应用程序的情况下,我的建议是看看你是否可以将当前shell中的逻辑重构为模型类或类似的东西,让模型方法返回值,然后在shell中使用该模型。这样,您也可以在控制器中使用该模型。
答案 3 :(得分:0)
接受的答案似乎不适用于Cake 2.0
对于Cake 2.0
if (!class_exists('Shell')) {
require CONSOLE_LIBS . 'shell.php';
}
App::import('Shell', 'DoSomething');
DoSomethingShell::main();
请记住,某些Shell方法在此模式下无效,例如$ this-&gt; out,因此需要更多黑客攻击。