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 应用程序)与从模块加载的配置合并。最后,我只想在模块配置路由中描述这个模块,并将它们用于漂亮的 urls(用户友好 url)。我该怎么做?当我创建 url /admin/index/index
时,这个示例不起作用,它显示 /admin/index/index
但我想要 /admin
,如模块规则中所述。
官方文档here中提到了模块的分离url规则。
而且我认为这是一种更优化的方法,与在一个配置文件中合并和声明所有规则不同。
规则按照声明的顺序进行解析(here 提到了这一点),因此通过分隔,您可以跳过其他模块 url。在大量规则的情况下,它可以提高性能。
所以我这样做了(这是一个问题的完整答案)。
创建 Bootstrap class 模块专用。
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' config.
中定义路由
PS:我不喜欢检测 if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0)
(我的意思是不是 'debug'、'log'、'gii' 或其他原生 Yii2 模块)也许有人可以提出更好的解决方案吗?
这样会更干净可靠。我在 Yii2 的 github 仓库 here.
上找到了这个
<?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'
]
]
有没有从模块配置中添加路由的解决方案?
例子。我们有主要配置,我们在其中描述
'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 应用程序)与从模块加载的配置合并。最后,我只想在模块配置路由中描述这个模块,并将它们用于漂亮的 urls(用户友好 url)。我该怎么做?当我创建 url /admin/index/index
时,这个示例不起作用,它显示 /admin/index/index
但我想要 /admin
,如模块规则中所述。
官方文档here中提到了模块的分离url规则。
而且我认为这是一种更优化的方法,与在一个配置文件中合并和声明所有规则不同。
规则按照声明的顺序进行解析(here 提到了这一点),因此通过分隔,您可以跳过其他模块 url。在大量规则的情况下,它可以提高性能。
所以我这样做了(这是一个问题的完整答案)。
创建 Bootstrap class 模块专用。
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' config.
中定义路由PS:我不喜欢检测 if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0)
(我的意思是不是 'debug'、'log'、'gii' 或其他原生 Yii2 模块)也许有人可以提出更好的解决方案吗?
这样会更干净可靠。我在 Yii2 的 github 仓库 here.
上找到了这个<?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'
]
]