Laravel 5

时间:2015-12-21 14:54:52

标签: laravel

某些背景信息:我已将我的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需要并使其可用于布局。但是我想在未来可能还有其他一些东西,它们可以根据任意规则捕获多个不同的路径并运行额外的代码,这样就可以派上用场了。

更新:删除了包含全局路由的行,因为我意识到默认情况下它们已被包含在内。

2 个答案:

答案 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属性中,因为它是全局的而不是路由依赖的。