Добавление новых правил роутинга для модулей.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Mavel
Сообщения: 16
Зарегистрирован: 2017.03.25, 19:55

Добавление новых правил роутинга для модулей.

Сообщение Mavel »

Проблема вообще в следующем: надо в модуле прописать его собственные правила роутинга.
Делаю следующее: в в модуле прописываю следующий код, который добавляет в менеджер урлов новые правила:

Код: Выделить всё

    public function init()
    {
        parent::init();
        \Yii::$app->getUrlManager()->addRules([
            [
                'class' => 'yii\web\UrlRule',
                'pattern' => 'admin/login',
                'route' => 'admin/default/login'
            ]
        ], false);
    }
По существу правила роутинга добавляются в менеджер урлов, но по факту самого роутинга по правилам не происходит. Что же я делаю не так?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Добавление новых правил роутинга для модулей.

Сообщение zelenin »

Модуль инициализируется только во время захода в него. Чтобы зайти в него, он должен быть открыт по валидным правилам роутинга. Правила роутинга подгружаются только во время инициализации модуля. Замкнутый круг.
Добавляйте правила роута через BoostrapInterface
Mavel
Сообщения: 16
Зарегистрирован: 2017.03.25, 19:55

Re: Добавление новых правил роутинга для модулей.

Сообщение Mavel »

Хорошо, спасибо за наводку.
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: Добавление новых правил роутинга для модулей.

Сообщение zxczxc12 »

Сделал так:

1) Инициализация поведением всех модулей ( моих ), список всех ( моих ) модулей прописал в базе:

common\config\web.php

Код: Выделить всё

'components' => [
...
//  Инициализация модулей, их роутингов и событий
    'as initializer' => [
        'class' => \common\behaviors\ModulesInitializerBehavior::class,
    ],
...
]
ModulesInitializerBehavior:

Код: Выделить всё

class ModulesInitializerBehavior extends Behavior
{
    /** @inheritdoc */
    public function events()
    {
        return [
            Application::EVENT_BEFORE_REQUEST => 'beforeRequest',
        ];
    }

    public function beforeRequest()
    {
        $modules = Module::find()->all();
        $this->enableModules($modules);
    }

    /**
     * @param Module[] $modules
     * @return array
     */
    private function enableModules($modules)
    {
        $moduleConfig = $componentConfig =[];
        foreach ($modules as $module) {

            $this->enableModule($module->source);
            $moduleConfig[$module->id] = [
                'class' => $module->source,
            ];

            if (!is_null($module->component_id)) {
                $componentConfig[$module->component_id] = [
                    'class' => $module->component_source,
                ];
            }
        }

        $this->owner->setModules($moduleConfig);
        $this->owner->setComponents($componentConfig);

        //var_dump($this->owner->getModules());exit;
    }

    private function enableModule($module)
    {
        $this->enableModuleUrlRules($module::getUrlRules());
        //$this->enableModuleEventHandlers($version);
    }

    private function enableModuleUrlRules(array $url_rules)
    {
        $this->owner->getUrlManager()->addRules($url_rules, false);
    }

}

2) Прописывание роутингов в самом модуле:

Module.php

Код: Выделить всё

/**
 * article module definition class
 */
class Module extends \yii\base\Module
{
    const EVENT_CREATE_ARTICLE = 'articles.create.article';
    const EVENT_CREATE_ARTICLE_CONTENT = 'articles.create.article.content';
    const EVENT_DELETE_ARTICLE = 'articles.delete.article';
    const EVENT_UPDATE_ARTICLE_CONTENT = 'articles.update.article.content';
    const EVENT_CHANGE_STATUS = 'articles.change_status.article';

    const IS_ACTIVE = 1;
    const NOT_ACTIVE = 0;

    const VERSION = '0.1';

    /** @var array The rules to be used in URL management. */
    private static $urlRules = [
        'articles/create' => 'articles/default/create',
        'articles/update-content' => 'articles/default/update-content',
        'articles/get-content-images' => 'articles/default/get-content-images',
        'articles/update-article-status' => 'articles/default/update-article-status',
        'articles/delete' => 'articles/default/delete',
        'articles/upload-image-content' => 'articles/default/upload-image-content',
        'articles/content-images-get' => 'articles/default/images-get',
        'articles/create-article-content' => 'articles/default/create-article-content',

        ['pattern' => 'articles/<page:\d+>', 'route' => 'articles/default', 'defaults' => ['page' => 1]],
        ['pattern' => 'articles/<slug>', 'route' => 'articles/default/show-article'],
        
    ];

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();

        if (Yii::$app->id === 'backend') {
            $this->controllerNamespace = 'common\modules\articles\backend\controllers';
        } elseif (Yii::$app->id === 'frontend') {
            $this->controllerNamespace = 'common\modules\articles\frontend\controllers';
        } else {
            $this->controllerNamespace = 'common\modules\articles\console\controllers';
        }
    }

    public static function getUrlRules()
    {
        return static::$urlRules;
    }

}
Ответить