7

我有一个控制台命令来进行消费时间,并且我需要知道如何在 YII 的 Web 应用程序操作中调用(执行)它。

class MyCommand extends CConsoleCommand{
      public function actionIndex(){
          $model = new Product();
          $model->title = 'my product';
          ...
          $model->save();
          .
          .
          .
      }
}

我想执行这段代码。

4

7 回答 7

36

试试这个:

    Yii::import('application.commands.*');
    $command = new MyCommand("test", "test");
    $command->run(null);

必须设置值为“test”的 2 个参数但没有影响,它们用于使用控制台时的 --help 选项。

/**
 * Constructor.
 * @param string $name name of the command
 * @param CConsoleCommandRunner $runner the command runner
 */
public function __construct($name,$runner)
{
    $this->_name=$name;
    $this->_runner=$runner;
    $this->attachBehaviors($this->behaviors());
}

https://github.com/yiisoft/yii/blob/master/framework/console/CConsoleCommand.php#L65

于 2013-07-02T10:48:11.310 回答
6

试试这个

Yii::import('application.commands.*');
$command = new GearmanCommand('start', Yii::app()->commandRunner);
$command->run(array('start', '--daemonize', '--initd'));

其中 array('start', '--daemonize', '--initd') 是一个动作和动作参数

于 2013-12-13T15:13:39.583 回答
2

我有同样的问题 - 我需要从内部控制器和命令调用操作

我说的是同样的问题,因为它实际上是一样的——你有需要从控制台调用的操作,也可以从控制器调用它。

If you need to call an action(command) as a part of controller action, then i think you need to modify this solution a little. 或者我的解决方案对你来说足够了吗?

所以这是我的解决方案:

首先按照http://www.yiichina.net/doc/guide/1.1/en/basics.controller#action中的说明创建动作

class NotifyUnsharedItemsAction extends CAction
{
    public function run()
    {
        echo "ok";
    }
}

然后像往常一样加载控制器动作:

class TestController extends Controller
{

    public function actions() {
        return array(
            'notifyUnsharedItems'=>'application.controllers.actions.NotifyUnsharedItemsAction',
    );
}

在命令中,我以这种方式运行操作:

class NotifyUnsharedItemsCommand extends CConsoleCommand
{
    public function run($args)
    {
        $action = Yii::createComponent('application.controllers.actions.NotifyUnsharedItemsAction',$this,'notify');
        $action->run();
    }

}
于 2012-04-28T15:02:16.573 回答
2

接受我们在 linux 服务器上,对于 Yii 1.1 的实际示例将是:

$run = '/usr/bin/php ' . Yii::getPathOfAlias('root').'/yiic' [command]
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $run, '/dev/null', '/dev/null'));

这将在后台运行 Yii 控制台命令。

于 2015-11-07T11:30:12.297 回答
1

Yii 是 PHP -> 您可以使用http://php.net/manual/en/function.exec.php中指定的标准 php 构造以及页面底部附近的相关方法,具体取决于您想要实现的目标.

于 2012-04-14T07:42:25.527 回答
1

此外,cebeon gist的另一个非常干净的解决方案:

<?php
// ...
$runner=new CConsoleCommandRunner();
$runner->commands=array(
    'commandName' => array(
        'class' => 'application.commands.myCommand',
    ),
);

ob_start();
$runner->run(array(
    'yiic',
    'idbrights',
));
echo nl2br(htmlentities(ob_get_clean(), null, Yii::app()->charset));

Yii::app()->end();
于 2014-06-18T08:19:46.887 回答
0

通常,在这些情况下您应该做的是重构。将“通用”代码移出 MyCommand 并将其放入components文件夹中的类中。现在,您可以将任何头放在“通用”代码之上,而无需更改您的功能。例如:

受保护/组件/Mywork.php:

<?php
class Mywork
{
    public function doWork()
    {
        $model = new Product();
        $model->title = 'my product';
        ...
        $model->save();
        ...
    }
}

受保护/控制器/MyworkController.php:

<?php
class MyworkController
{
    public function actionDowork()
    {
        $mywork = new Mywork;
        ...
    }
}

受保护/命令/MyworkCommand.php:

<?php
class MyworkCommand extends CConsoleCommand
{
    public function run($args)
    {
        $mywork = new Mywork;
        ...
    }
}

这种方法也使测试更容易,因为您可以将 Mywork 作为您正在使用的视图之外的单个单元进行测试。

于 2014-11-25T20:35:56.080 回答