某些背景信息:我已将我的Laravel 5应用程序设置为拆分为模块。我的AppServiceProvider中的boot()函数如下所示:
public function boot()
{
// We want to register the modules in the Modules folder
$modulesPath = app_path() . '/Modules';
$handle = opendir($modulesPath);
// Loop through the module directory and register each module
while (($module = readdir($handle)) !== false) {
if ($module != "." && $module != ".." && is_dir("{$modulesPath}/{$module}")) {
// Check if there are routes for that module, if so include
if (file_exists($modulesPath . '/' . $module . '/routes.php')) {
include $modulesPath . '/' . $module . '/routes.php';
}
// Check if there are views for that module, if so set a namespace for those views
if (is_dir($modulesPath . '/' . $module . '/Views')) {
$this->loadViewsFrom($modulesPath . '/' . $module . '/Views', strtolower($module));
}
}
}
}
这个想法是能够在模块中保持分离,但也有全局路由和全局控制器。因此,每个模块都有自己的routes.php文件,如下所示:
<?php
Route::group(array('module'=>'MyModule','namespace' => 'NexusHub\Modules\MyModule\Controllers'), function() {
Route::resource('mymodule', 'MyModuleController');
});
然后我有一个全局的routes.php文件,如下所示:
<?php
Route::any('{catchall}', 'GlobalController@myAction')->where('catchall', '(.*)');
Route::group(array('module'=>'Global'), function() {
Route::resource('', 'GlobalController');
});
我遇到的问题是,我的catchall路线似乎没有找到模块。模块运行自己的路由,但忽略了catchall路由。
至于我为什么试图实现这个目标,目前的目的是所有模块使用相同的布局,并且该布局需要总是检索一些数据,因此全局控制器将抓住什么&#39 ; s需要并使其可用于布局。但是我想在未来可能还有其他一些东西,它们可以根据任意规则捕获多个不同的路径并运行额外的代码,这样就可以派上用场了。
更新:删除了包含全局路由的行,因为我意识到默认情况下它们已被包含在内。
答案 0 :(得分:0)
首先加载您的全局路由文件。
尝试移动服务提供商,以便在&#34; App \ Providers \ RouteServiceProvider&#34;之前加载所有模块路由。在config / app.php文件中。
...看看是否有帮助。
答案 1 :(得分:0)
我最终做了我想要的中间件(参见https://laravel.com/docs/master/middleware#global-middleware)。
在我的情况下,我使用类似于BeforeMiddleware类示例的东西,并将其注册在我的app / Http / Kernel.php类的$ middleware属性中,因为它是全局的而不是路由依赖的。