3

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 ?

diabetesjones
  • 838
  • 1
  • 7
  • 17

1 Answers1

2

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!

Yerke
  • 2,187
  • 3
  • 19
  • 33