我正在阅读laravel 5.1文档.我不明白laravel路由组如何工作以及以下路由组之间的区别.
路由组和命名路由
如果使用路由组,则可以在路由组属性数组中指定as关键字,允许您为组内的所有路由设置公共路由名称前缀:
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// Route named "admin::dashboard"
}]);
});
Run Code Online (Sandbox Code Playgroud)
中间件
要将中间件分配给组中的所有路由,可以使用组属性数组中的中间件密钥.中间件将按您定义此数组的顺序执行:
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// Uses Auth Middleware
});
Route::get('user/profile', function () {
// Uses Auth Middleware
});
});
Run Code Online (Sandbox Code Playgroud)
命名空间
路由组的另一个常见用例是将相同的PHP命名空间分配给一组控制器.您可以在组属性数组中使用namespace参数来指定组中所有控制器的命名空间:
Route::group(['namespace' => 'Admin'], function()
{
// Controllers Within The "App\Http\Controllers\Admin" Namespace
Route::group(['namespace' => 'User'], function()
{
// Controllers Within The "App\Http\Controllers\Admin\User" Namespace
});
});
Run Code Online (Sandbox Code Playgroud)
子域路由
路由组也可用于路由通配符子域.可以像路由URI一样为子域分配路由参数,允许您捕获子域的一部分以供路由或控制器使用.可以使用组属性数组上的域密钥指定子域:
Route::group(['domain' => '{account}.myapp.com'], function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Run Code Online (Sandbox Code Playgroud)
路线前缀
前缀组数组属性可以用于为组中的每个路由添加给定URI.例如,您可能希望使用admin为组内的所有路由URI添加前缀:
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});
Run Code Online (Sandbox Code Playgroud)
您还可以使用prefix参数指定分组路径的公共参数:
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($account_id) {
// Matches The accounts/{account_id}/detail URL
});
});
Run Code Online (Sandbox Code Playgroud)
Jee*_*usu 18
路由组允许您将共享公共属性的路由组合在一起,而无需为每个路由重新定义所述属性.
举个例子,我们可以使用命名空间数组属性.
假设我们有一个名为的控制器NewsController,其中包含应用新闻部分的所有管理逻辑.您可以将此文件放在"App/Http/Controllers/Admin"目录中.
Laravel 5遵循PSR-4自动加载约定,因此应用程序将命名空间与文件路径相同,因此我们的类可能如下所示:
<?php
namespace App\Http\Controllers\Admin;
class NewsController
{
}
Run Code Online (Sandbox Code Playgroud)
我们可以这样写一个到这个类的路由:
Route::get('admin/news', [
'uses' => 'Admin\NewsController@index'
]);
Run Code Online (Sandbox Code Playgroud)
注意:Laravel会自动假设您的所有控制器都在App/Http/Controllers目录中,因此我们可以将其从路径文件中的任何控制器声明中删除.
上面应该可以正常工作,但也许你还有十几个其他类文件在同一个命名空间内处理管理逻辑.我们可以使用命名空间选项将这些组合在一起.
Route::group(['namespace' => 'Admin'], function()
{
Route::get('admin/news', [
'uses' => 'NewsController@index'
]);
Route::get('admin/users', [
'uses' => 'UserController@index'
]);
...
});
Run Code Online (Sandbox Code Playgroud)
请注意我不再Admin为每个路由定义控制器的命名空间.
相同的过程可以应用于中间件,子域和URL前缀.
让我们拿第一个例子并在它上面构建.从上面的路由声明中可以看出,我们所有的管理路由共享一个公共URL前缀.
http://example.com/ admin/news
http://example.com/ admin/users
我们可以使用prefixarray属性来定义路由的公共URL.在我们的例子中,这是admin.
我们更新的Route声明看起来像这样.
Route::group(['namespace' => 'Admin', 'prefix' => 'admin'], function()
{
Route::get('news', [
'uses' => 'NewsController@index'
]);
Route::get('users', [
'uses' => 'UserController@index'
]);
...
});
Run Code Online (Sandbox Code Playgroud)
您可能想知道为什么这会有用吗?好吧,你已经开发了一个包含数十条甚至数百条路线的大型应用程序.后来有一天,你的老板来给你说,"嘿仪先生,我们需要管理URL从改变/admin到/cms,多久会采取这样?".
如果您使用具有前缀数组属性的组声明所有路由,如上所述,这对您来说将是一个简单而轻松的过程.
| 归档时间: |
|
| 查看次数: |
10771 次 |
| 最近记录: |