簡體   English   中英

Yii2路由定義在模塊中

[英]Yii2 routes definition in modules

是否有任何解決方案可以從模塊配置中添加路由?

例。 我們有描述的主要配置

'components' => [
    'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => require(FILE_PATH_CONFIG_ENV . '_routes.php') // return array
    ],
]

在每個模塊中,我們使用私有參數加載自定義配置文件

public function loadConfig($sFileName = 'main', $sFolderName = 'config')
{
    Yii::configure($this, require($this->getBasePath() . DS . $sFolderName . DS . $sFileName . '.php'));

    return $this;
}

配置文件

return [
    'components' => [
        'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'rules' => [
                '/admin' => '/admin/index/index',
            ]
        ]
    ]
];

現在我需要以某種方式合並當前配置(主要用於Web應用程序)與從模塊加載的配置。 最后,我想在模塊配置路由中僅描述此模塊,並將它們用於漂亮的URL(用戶友好的URL)。 我怎么能這樣做? 這個例子在我創建url /admin/index/index時不起作用,它顯示我/admin/index/index但我想要/admin在模塊規則中提到。

所以我這樣做了( 這是一個問題的完整答案 )。

為模塊創建特殊的Bootstrap類。

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

在模塊文件夾中創建路徑文件(/modules/XXX/config/_routes.php)

return [
    '/sales'                            => '/sales/index/index',
    '/sales/company'                    => '/sales/company/index',
    '/sales/company/view/<sID:\d+>'     => '/sales/company/view',
    '/sales/company/update/<sID:\d+>'   => '/sales/company/update',
    '/sales/company/delete/<sID:\d+>'   => '/sales/company/delete',
];

將boostrap添加到主配置文件中

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

return $aConfig;

而已。 我們只能在模塊'route'配置中定義路由。

PS:我不喜歡檢測if (is_array($aModule) && strpos($aModule['class'], 'app\\modules') === 0) (我的意思是''debug','log',' gii'或其他原生Yii2模塊)也許有人可以建議更好的解決方案?

這將更加干凈和可靠。 我發現這對Yii2的GitHub庫在這里

<?php
namespace backend\modules\webmasters;

use Yii;
use yii\base\BootstrapInterface;

class Module extends \yii\base\Module implements BootstrapInterface
{
    public $controllerNamespace = 'backend\modules\webmasters\controllers';

    public function init()
    {
        parent::init();
        // initialize the module with the configuration loaded from config.php
        Yii::configure($this, require(__DIR__ . '/config/main.php'));
    }

    /**
     * @inheritdoc
     */
    public function bootstrap($app)
    {
        $app->getUrlManager()->addRules([
            [
                'class' => 'yii\web\UrlRule', 
                'pattern' => $this->id, 
                'route' => $this->id . '/tools/index'
            ],
            [
                'class' => 'yii\web\UrlRule', 
                'pattern' => $this->id . '/<controller:[\w\-]+>/<action:[\w\-]+>', 
                'route' => $this->id . '/<controller>/<action>'
            ],
        ], false);
    }
}

並將main.php配置文件的bootstrap部分配置為

'bootstrap' => [
    'log',
    'webmasters'
]
'modules' => [
    'webmasters' => [
        'class' => 'backend\modules\webmasters\Module'
     ]
]

這里的官方文檔中提到了分離模塊的url規則。

我認為這是一種更好的方法,不像在一個配置文件中合並和聲明所有規則。

該規則在他們聲明的順序解析(這是提到在這里 ),所以與分離可以跳過其他模塊的URL。 如果有大量規則,它可以提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM