Yii2:从供应商目录中的控制器运行控制台命令

时间:2017-06-22 18:27:12

标签: php yii yii2

我正在对我们的大型工作应用进行一些重构。这包括将我构建的一些工具(如命令行的模式/种子迁移工具)分离到他们自己的存储库中以供多个应用程序使用。

如果它在控制台/控制器中,它会被拾取。如果我将它们移动到自己的存储库并通过Composer需要它,我如何让Yii知道我何时说Invoke-Expression,我的意思是转到[CmdletBinding()] param( # Other parameters removed for brevity [string] $MSBuildParameters = "" ) # Other syntax removed for brevity $cmd = "& `$MSBuild '$Solution' /p:Configuration=$Configuration /p:Platform=`"$BuildPlatform`" /nologo /m /v:m /nr:false $MSBuildParameters" Invoke-Expression $cmd

1 个答案:

答案 0 :(得分:2)

如果你创建一个扩展(当然是通过编辑器加载它),你可以在里面找到Module.php,它将保存控制台控制器的路径(你可以用你的终端调用)。

我将为common\modules\commander命名空间编写我的示例,对于供应商扩展,您的命名空间会有所不同,但它以相同的方式适用于所有这些命名空间。 所以我的扩展名

有以下文件结构
<app>
  common
    modules
      commander
        controllers
          • TestController.php
        • Module.php

我的模块类看起来如下:

namespace common\modules\commander;
use yii\base\Module as BaseModule;
class Module extends BaseModule
{
    public $controllerNamespace = 'common\modules\commander\controllers';

    public function init()
    {
        parent::init();
    }
}

TestController.php继承自yii\console\Controller

namespace common\modules\commander\controllers;
use yii\console\Controller;
class TestController extends Controller
{
    public function actionIndex()
    {
        echo 123;
    }
}

让一切工作的主要部分是在console/config/main.php设置中注册Module.php

'modules' => [
    'commander' => [
        'class' => \common\modules\commander\Module::className(),
    ],
    ...
],

现在,您可以使用以下命令:

yii commander/test/index

它会打印给你123,表明一切正常,控制台控制器位于不同的文件夹中!