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