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

vis*_*ion 13 php

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

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

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,多久会采取这样?".

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