讨论数量:
第一种方案:在AppServiceProvider使用自动加载,
实现方法:在AppServiceProvider的register方法中追加一下代以下代码:
$list = File::directories(DIR . ‘/../../Modules’);
foreach ($list as $path) {
$dirName = basename($path);
//注册默认启动项信息
$serClass = ‘\Modules\‘ . $dirName . ‘\Providers\AutoServiceProvider’;
if (class_exists($serClass)) app()->register($serClass);
}
其中Providers\AutoServiceProvider.php是你自定义的模块服务,你可以基于他实现注册自定义模版文件路经,路由,config配置,本地化语言,数据迁移等服务。
当然你只须路由也可以直接把代码改成
require ‘\Modules\‘ . $dirName . ‘\route.php’; //加载路由即可!
第二种方案就是通过url自动判断自动加载,在加载路由前解析,放那里都行
代码如下:
/**
* 解析模块的URL地址 [模块/控制器/操作?]参数1=值1&参数2=值2…
* @access public
* @param string $url URL地址
* @param string $depRoute URL分隔符
* @return void
*/
private function parseUrl($url, $depRoute = ‘/‘)
{
$url = trim($url, $depRoute);
$url = str_replace($depRoute, '|', $url);
list($path) = self::parseUrlPath($url);
//解析路由mvc参数及附加参数
if (isset($path)) {
// 解析模块
Request::offsetSet('route_module', !empty($path[0]) ? array_shift($path) : 'admin');
// 解析控制器
Request::offsetSet('route_controller', !empty($path[0]) ? array_shift($path) : 'index');
// 解析操作
Request::offsetSet('route_action', !empty($path[0]) ? array_shift($path) : 'index');
// 解析额外参数
self::parseUrlParams(empty($path) ? '' : implode('|', $path));
}
}
这样就类式于tp的动态路由风格了mac。
后面你可以自定义模块路由引用route_module值加载,也可以自定义一条全局的动态路由即可,无须要模块中重新定义路由,
如动态加载当前模块路由:
require ‘\Modules\‘ . Request::input(‘route_module’) . ‘\route.php’; // 加载路由即可!
或者在web.php中写入一条全局路由:
Route::any('{url}', '\Modules\'.Request::input('route_module').'\'.Request::input('route_controller').'Controller@'.Request::input('route_action'));
推荐文章: