【问题标题】:Yii2 - Call a Yii console command from within another console command?Yii2 - 从另一个控制台命令中调用 Yii 控制台命令?
【发布时间】:2016-01-29 22:37:20
【问题描述】:

我创建了两个不同的 Yii2 控制台命令/控制器。

调用它们的示例是

# yii user/create-account

# yii webserver/update-config

在用户/创建帐户运行后,我想调用 webserver/update-config - 是否可以在 Yii 中通过代码执行此操作?还是我必须使用 exec()/system() 从外部调用第二个 yii php 脚本(我不想这样做)。

任何帮助/见解将不胜感激!

【问题讨论】:

标签: php shell yii2


【解决方案1】:

经过一番考虑,我选择从另一个控制器中调用一个控制器的方式是使用控制器的 runAction 方法(这也是 Yii 开发人员推荐的方式)。

控制台应用程序示例:

\Yii::$app->runAction('webserver/update-config');

也可以通过使用数组作为第二个参数来传递参数。

简单参数示例:

\Yii::$app->runAction('webserver/update-config', ['oneValue', 'anotherValue'];

这里是命名参数的示例:

\Yii::$app->runAction('webserver/update-config', [
    'servertype' => 'oneSetting', 
    'serverdir'  => 'anotherSettingValue'
]);

请注意,这会使被调用的控制器成为调用代码的一部分。因此,如果被调用的控制器由于某种原因失败,整个程序就会失败。 良好的错误处理是必须的。在被调用的控制器中,您可以使用 return 将错误代码设置为回馈。

例子:

调用代码行:

$iExitCode = \Yii::$app->runAction('webserver/update-config', ['oneValue', 'anotherValue'];

被调用的控制器:

<?php
namespace app\commands;

use yii\console\Controller;

/**
* Webserver related functions
*/
class WebserverController extends Controller {
    public function actionUpdateConfig($oneValue, $anotherValue) {
        // Code that does something
        if ($success) return 0;
        else          return 1;
    }
}
?>

【讨论】:

    【解决方案2】:

    从另一个动作调用一个动作(即使在一个控制器内)不是很好的做法,也不是很清楚。我建议另一种方法。

    将更新网络服务器配置逻辑移到Webserver 控制器之外,例如将其放置在某个组件/助手中。

    然后你可以从任何地方调用这个方法,特别是在用户控制器和网络服务器控制器中。

    示例。在Webserver 组件中:

    public static function updateConfig()
    {
        ...
    }
    

    User 控制器中:

    public function actionCreateAccount()
    {
        ...
        Webserver::updateConfig();
    }
    

    Webserver 控制器中:

    public function actionUpdateConfig()
    {
        Webserver::updateConfig();
    }
    

    我认为这更可重用和清晰。

    【讨论】:

    • 虽然我认为自定义助手是一种方法,但我不确定这是否是正确的设计决策——因为它是一个助手,其功能取决于某些模型。我一直觉得帮手应该是自给自足/独立的。
    • 可以是组件,依赖于一些类、模型等
    • 从另一个动作调用一个动作对我来说更糟糕。
    【解决方案3】:

    变体 1

    您可以从另一个动作运行控制器的一个动作。例如,

    public function actionCreateAccount() {
        // something
    }
    
    public function actionUpdateConfig() {
        // something
    }
    
    public function actionComplex() {
        $this->actionCreateAccount();
        $this->actionUpdateConfig();
    }
    

    或者

    public function actionCreateAccount() {
        // something
        $this->actionUpdateConfig();
    }
    
    public function actionUpdateConfig() {
        // something
    }
    

    变体 2

    如果你需要调用另一个控制器的动作,你可以使用控制台控制器的run()方法:

    例如,WebmasterController 中的操作:

    public function actionUpdateConfig($param1, $param2)
    {
        echo $param1 . '/' . $param2 . PHP_EOL;
    }
    

    UserController 中的操作:

    public function actionCreateAccount()
    {
        echo 'test: ';
        $this->run('webmaster/update-config', ['do', 'it']);
    }
    

    【讨论】:

    • 他想调用另一个控制器的动作。
    • 那么使用控制台控制器的 run() 方法是一个很好的变体。例如,WebmasterController 中的操作:` public function actionUpdateConfig($param1, $param2) { echo $param1 . '/' 。 $param2 。 PHP_EOL; } ` UserController 中的操作:` public function actionCreateAccount() { echo 'test: '; $this->run('webmaster/update-config', ['do', 'it']); } `
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2014-02-23
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多