Laravel 路由優化小技巧分享

文章轉發自專業的Laravel開發者社區,原始連接: https://learnku.com/laravel/t...

當你做爲一個初學者投身於 Laravel 的時候,Laravel 的路由器給你提供了一個很棒的優雅的 API。下面我要介紹的也不是什麼隱藏的或者新的知識,它僅僅是在你學習 Laravel 的時候可能給你提供一些幫助的小技巧。php

路由的 文檔 很是不錯,而且下文的技巧還會補充和拼湊一部分,這些部分將會幫助你快速掌握如何在 Laravel 項目中使用路由。laravel

自定義命名空間web


正如文檔所言,若是你想在一個路由組裏使用相似 App\Http\Controllers\Admin 的命名空間,那麼你可使用  Laravel 5.4 裏面介紹的 流式路由 APIapi

Route::namespace('Admin')->group(function () {
    //  "App\Http\Controllers\Admin" 命名空間下的控制器
});

這正是每個 Laravel 項目都會使用到的 RouteServiceProvider 技術:app

protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

因爲 routes/web.php 文件擁有一個命名空間,因此 Admin 命名空間使用了相對路徑。ide

要在 App\Http\Controllers\Admin 命名空間下建立一個控制器,你能夠在控制檯運行下面這條命令:學習

php artisan make:controller -r Admin/UsersController

就跟以前的例子同樣,這條命令在 routes/web.php 文件裏面定義的路由相似這樣:this

Route::namespace('Admin')
    ->prefix('admin')
    ->group(function () {
        Route::resource('users', 'UsersController');
    });

路由宏spa


路由器是能夠宏定義的,這意味着若是你想經過一個包提供一組路由,或者複用一組路由定義,那麼你能夠在服務提供者裏面定義一個宏。調試

舉個栗子,若是你有個商城的軟件包,裏面包含了不少購物路由,你想容許用戶重寫或者自定義一部分路由,那你能夠這樣作:

// 在服務提供者的 boot() 方法內

public function boot()
{
    Route::macro('shopRoutes', function ($prefix) {
        Route::group([
            'prefix' => $prefix,
            'middleware' => ['shopping'],
        ], function () {
            Route::get('products/{product}', 'ProductsController@show');
            // ...
        });
    });
}

接下來,用戶就能夠在一個新的 Laravel 項目的 routes/web.php 文件中調用剛剛那個宏了:

collect(config('languages'))->each(function ($language) {
    Route::shopRoutes($language);
});

或者選擇下面這種實現方式:

Route::macro('shopRoutes', function ($languages) {
    Route::group([
        'prefix' => '/{language}',
        'middleware' => ['shopping'],
        'where' => ['language' => implode('|', $languages)],
    ], function () {
        Route::get('products/{product}', 'ProductsController@show');
        // ...
    });
});

宏的例子很抽象,可是你能明白其中的用意。我建議僅當路由宏能對你的項目有所幫助的時候才使用它。你會知道何時應該這麼作的!

調試路由


在一個 Laravel 應用程序中, web.php 文件(以及 api.php 文件)是程序可以響應的路由的自文檔文件,我很欣賞這點。因爲我更看重這個文件的文檔這方面,因此我更偏向於一個個的定義路由而不是使用資源路由。

若是你發現本身想要找某一個路由或者調試全部可能定義的路由, artisan route:list 這個命令會頗有用:

artisan route:list
+--------+----------+----------+------+---------+--------------+
| Domain | Method   | URI      | Name | Action  | Middleware   |
+--------+----------+----------+------+---------+--------------+
|        | GET|HEAD | /        |      | Closure | web          |
|        | GET|HEAD | api/user |      | Closure | api,auth:api |
+--------+----------+----------+------+---------+--------------+

 route:list 這條命令對查看路由名稱及其附加的中間件頗有幫助。 這也引出了我下面要介紹的技巧:命名路由。

Named Group Routes


A common convention in Laravel is naming routes, which allows you to easily reference the name of the route and avoid hard-coding the root-relative URI in your templates. In some applications hard-coding the URI is fine, in other cases, the named routes allow the following:

{{ route('admin.users.show', ['user' => $user]) }}
{{-- /admin/users/2 --}}

When you are defining a group of routes, for example, our admin example, you can also prefix the name of the route on the group:

Route::namespace('Admin')
    ->prefix('admin')
    ->name('admin.')
    ->group(function () {
        Route::resource('users', 'UsersController');
    });

The above prefixed name would generate route names like the following for the users resource controller:

  • admin.users.index
  • admin.users.store
  • admin.users.create
  • admin.users.show
  • admin.users.update
  • admin.users.destroy
  • admin.users.edit

Learn More


Read through the entire routing documentation and the resource controllers section of the controllers documentation. I reference the resource controllers section to try and ensure that most of my routes represent a REST verb and for route naming conventions.

相關文章
相關標籤/搜索