簡體   English   中英

laravel 5.1中間件路由組和名稱空間路由組之間的區別?

[英]Difference between middleware route group and namespaces route group in laravel 5.1?

我正在閱讀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

路由組允許您將共享公共屬性的路由組合在一起,而無需為每個路由重新定義所述屬性。

舉個例子,我們可以使用命名空間數組屬性。

假設我們有一個名為NewsController的控制器,其中包含應用新聞部分的所有管理邏輯。 您可以將此文件放在“App / Http / Controllers / Admin”目錄中。

Laravel 5遵循PSR-4自動加載約定 ,因此應用程序將命名空間與文件路徑相同,因此我們的類可能如下所示:

<?php

namespace App\Http\Controllers\Admin;

class NewsController
{

}

我們可以這樣寫一個到這個類的路由:

Route::get('admin/news', [
    'uses' => 'Admin\NewsController@index'
]);

注意Laravel會自動假設您的所有控制器都位於App/Http/Controllers目錄中,因此我們可以將其保留在routes文件中的任何控制器聲明中。

上面應該可以正常工作,但也許你還有十幾個其他類文件在同一個命名空間內處理管理邏輯。 我們可以使用命名空間選項將這些組合在一起。

Route::group(['namespace' => 'Admin'], function()
{
    Route::get('admin/news', [
        'uses' => 'NewsController@index'
    ]);

    Route::get('admin/users', [
        'uses' => 'UserController@index'
    ]);

    ...
});

請注意我不再為每個路由定義控制器的Admin命名空間。

相同的過程可以應用於中間件,子域和URL前綴。

進一步的例子

讓我們拿第一個例子並在它上面構建。 從上面的路由聲明中可以看出,我們所有的管理路由共享一個公共URL前綴。

http://example.com/ admin / news
http://example.com/ admin / users

我們可以使用prefix數組屬性來定義路由的公共URL。 在我們的例子中,這是admin

我們更新的Route聲明看起來像這樣。

Route::group(['namespace' => 'Admin', 'prefix' => 'admin'], function()
{
    Route::get('news', [
        'uses' => 'NewsController@index'
    ]);

    Route::get('users', [
        'uses' => 'UserController@index'
    ]);

    ...
});

您可能想知道為什么這會有用嗎? 好吧,你已經開發了一個包含數十條甚至數百條路線的大型應用程序。 然后有一天,你的老板來找你說“嘿先生測試員,我們需要將管理員網址從/admin更改為/cms ,這需要多長時間?”。

如果您使用具有前綴數組屬性的組聲明所有路由,如上所述,這對您來說將是一個簡單而輕松的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM