diabetesjones
diabetesjones

Reputation: 838

Yii2: run console command from controller in vendor directory

I am doing some refactoring of our large work app. This involves separating out some tools I've build, like a schema/seed migration tool for the command line, in to their own repositories to be used by multiple applications.

If it's in console/controllers, it gets picked up. If I move them to their own repository and require it via Composer, how do I get Yii to know when I say php yii db/up, i mean go to the new\vendor\namespace\DbController@actionup ?

Upvotes: 3

Views: 998

Answers (1)

Yerke
Yerke

Reputation: 2215

If you create an extension (and load it through composer of course), you can locate Module.php inside, which will hold path to console controllers (that you can call with your terminal).

I will write my example for common\modules\commander namespace, for vendor extension your namespace will differ, but it work for all of them the same way. So I have the following file structure for my extension

<app>
  common
    modules
      commander
        controllers
          • TestController.php
        • Module.php

My Module class looks as follow:

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();
    }
}

And TestController.php is inherited from yii\console\Controller:

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

And the main part to make everything work is to register out Module.php in console/config/main.php settings

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

Here it is, now you can use your command like:

yii commander/test/index

And it'll print you 123, showing that everything works and Console Controllers are located in different folders!

Upvotes: 2

Related Questions