laravel 5.1中的中间件路由组和名称空间路由组之间的区别?

时间:2015-08-04 04:36:31

标签: php

我正在阅读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
    });
});

参考:http://laravel.com/docs/5.1/routing

1 个答案:

答案 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,这需要多长时间?”。

如果您使用具有前缀数组属性的组声明了所有路由,那么这对您来说将是一个简单而轻松的过程。