Yii2 routes definition in modules

后端 未结 3 856
太阳男子
太阳男子 2021-01-12 19:20

Is there any solution to add routes from module configuration?

Example. We have main config where we describe

\'components\' => [
    \'urlManage         


        
3条回答
  •  天命终不由人
    2021-01-12 20:14

    So I did this way (this is full answer for a question).

    Create Bootstrap class special for module.

    namespace app\extensions;
    
    use yii\base\BootstrapInterface;
    
    /**
     * Class ModuleBootstrap
     *
     * @package app\extensions
     */
    class ModuleBootstrap implements BootstrapInterface
    {
        /**
         * @param \yii\base\Application $oApplication
         */
        public function bootstrap($oApplication)
        {
            $aModuleList = $oApplication->getModules();
    
            foreach ($aModuleList as $sKey => $aModule) {
                if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0) {
                    $sFilePathConfig = FILE_PATH_ROOT . DS . 'modules' . DS . $sKey . DS . 'config' . DS . '_routes.php';
    
                    if (file_exists($sFilePathConfig)) {
                        $oApplication->getUrlManager()->addRules(require($sFilePathConfig));
                    }
                }
            }
        }
    }
    

    Create route file in module folder (/modules/XXX/config/_routes.php)

    return [
        '/sales'                            => '/sales/index/index',
        '/sales/company'                    => '/sales/company/index',
        '/sales/company/view/'     => '/sales/company/view',
        '/sales/company/update/'   => '/sales/company/update',
        '/sales/company/delete/'   => '/sales/company/delete',
    ];
    

    Add boostrap to main config file

    $aConfig = [
        // some code
        'bootstrap' => [
            // some code
            'app\extensions\ModuleBootstrap',
        ],
        'modules' => [
            // some code
            'sales' => ['class' => 'app\modules\sales\SalesModule']
        ]
    ]
    
    return $aConfig;
    

    That's it. We can define routes only in module 'route' config.

    PS: I don't like detection if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0) (I mean NOT 'debug', 'log', 'gii' or other native Yii2 modules) maybe someone can suggest better solution?

提交回复
热议问题