gpt4 book ai didi

php - Yii2 模块中的路由定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:54:55 24 4
gpt4 key购买 nike

是否有任何解决方案可以从模块配置中添加路由?

例子。我们在描述的地方有主要配置

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

在每个模块中,我们加载带有私有(private)参数的自定义配置文件

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;

就是这样。我们只能在模块“路由”配置中定义路由。

PS:我不喜欢检测 if (is_array($aModule) && strpos($aModule['class'], 'app\modules') === 0)(我的意思是不是“调试”、“日志”、“gii”或其他原生 Yii2 模块)也许有人可以建议更好的解决方案?

关于php - Yii2 模块中的路由定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com