Laravel 视图中的命名空间
Namespacing in Laravel Views
我正在创建一个 "modular" 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()
函数的任何引用。
所以看起来它已经基本上自动地使用命名路由执行此操作。我的 ModuleServiceProvider
class 的路由部分如下所示:
// $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\...
,所以我可以在我的 routes.php
文件中键入 HomeController@index
而不是 \Modules\MyModule\Http\Controllers\HomeController@index
。
我还在选项中使用了 'prefix' => 'mymodule'
,所以现在我有了很好的命名路由,例如 mymodule
用于 HomeController@index
和 mymodule.myresource.show
用于 MyResourceController@show
。要制作一个 link,我只需在模板文件中使用 {{ route('mymodule.myresource.show', $resourceid) }}
。
我没有意识到它已经自动为我很好地命名了我的路线。通过命令行 运行 php artisan routes:list
很容易看出。
我正在创建一个 "modular" 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()
函数的任何引用。
所以看起来它已经基本上自动地使用命名路由执行此操作。我的 ModuleServiceProvider
class 的路由部分如下所示:
// $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\...
,所以我可以在我的 routes.php
文件中键入 HomeController@index
而不是 \Modules\MyModule\Http\Controllers\HomeController@index
。
我还在选项中使用了 'prefix' => 'mymodule'
,所以现在我有了很好的命名路由,例如 mymodule
用于 HomeController@index
和 mymodule.myresource.show
用于 MyResourceController@show
。要制作一个 link,我只需在模板文件中使用 {{ route('mymodule.myresource.show', $resourceid) }}
。
我没有意识到它已经自动为我很好地命名了我的路线。通过命令行 运行 php artisan routes:list
很容易看出。