我正在创建一个“模块化”Laravel应用程序,其中相关类被分组到它们自己的目录和命名空间中,这反映了app/
目录和\App
命名空间的结构。服务提供者注册视图并定义每个模块的路由。
这种结构非常适合划分所有内容,但问题在于引用视图中的控制器。在主应用程序模块中,要根据控制器操作创建URL,我可以使用{{ action('MyController@index') }}
之类的内容,因为所有内容都与\App\Http\Controllers
命名空间相关。在模块视图中,我必须执行类似{{ action('\Modules\MyModule\Http\Controllers\MyModuleController@index') }}
的工作,但是可以输入和读取很多东西,如果我重命名模块,我需要替换每个实例。
有没有办法让所有视图作为模块的一部分加载使用正确的命名空间?这是我的模块服务提供商的boot()
功能中的内容:
foreach($this->modules as $module) { // Module names in CamelCase
$this->loadViewsFrom(base_path('modules/' . $module . '/Resources/Views'), strtolower($module));
}
可让我引用view('mymoduleinlowercase::folder.viewname')
我似乎无法在API文档中找到对loadViewsFrom()
函数的任何引用。
答案 0 :(得分:1)
所以看起来它已经基本上自动地使用命名路线。我的ModuleServiceProvider
类的路由部分如下所示:
// $this->modules = ['Module1CamelCase', 'Module2CamelCase', ...];
foreach($this->modules as $module) {
$routefile = base_path('modules\\' . $module . '\\Http\\routes.php');
if(file_exists($routefile)) {
$router->group(['namespace' => 'Modules\\' . $module . '\\Http\\Controllers', 'prefix' => strtolower($module)], function($router) use ($routefile) {
require $routefile;
});
}
}
modules/MyModule/Http/routes.php
看起来像:
$router->get('/', 'HomeController@index');
$router->resource('myresource', 'MyResourceController');
...
因为我在为每个模块指定路由组的选项时使用了'namespace' => 'Modules\\...
,所以我可以在HomeController@index
文件中键入routes.php
而不是\Modules\MyModule\Http\Controllers\HomeController@index
。
我还在选项中使用了'prefix' => 'mymodule'
,所以现在我有mymodule
的{{1}}和HomeController@index
的{{1}}。要建立链接,我只需在模板文件中使用mymodule.myresource.show
。
我没有意识到它已经为我自动命名我的路线了。通过从命令行运行MyResourceController@show
,很容易看到。