在控制器中访问shell方法?蛋糕PHP 1.3

时间:2010-06-01 21:05:38

标签: php shell cakephp view controller

我在CakePHP 1.3中编写了一个返回值的shell方法。

我希望能够从控制器中访问该方法,以便我可以将其返回值传递给View。

我不确定如何从控制器内适当地访问这些方法。我做错了吗?

我可以轻松复制代码,但我想“保持干燥”,而且我认为实际的功能不属于这个特定的控制器 - 我只需要它在这个特定视图中的返回值。

编辑:

我意识到我在这里提出了一个错误的问题,因为Shell本身不一定会返回一个值。我已经更改了代码,以便Shell只使用我想要的返回值,现在我想知道 - 需要从Shell访问的额外类/代码的适当位置是什么<控制器强>和?

它似乎是组件代码,但我不确定如何从Shell访问组件。它不是插件,因为我理解它们。这是怎么回事?

4 个答案:

答案 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,因此需要更多黑客攻击。