文章轉發自專業的Laravel開發者社區,原始連接: https://learnku.com/laravel/t...
當你做爲一個初學者投身於 Laravel 的時候,Laravel 的路由器給你提供了一個很棒的優雅的 API。下面我要介紹的也不是什麼隱藏的或者新的知識,它僅僅是在你學習 Laravel 的時候可能給你提供一些幫助的小技巧。php
路由的 文檔 很是不錯,而且下文的技巧還會補充和拼湊一部分,這些部分將會幫助你快速掌握如何在 Laravel 項目中使用路由。laravel
自定義命名空間web
正如文檔所言,若是你想在一個路由組裏使用相似 App\Http\Controllers\Admin
的命名空間,那麼你可使用 Laravel 5.4 裏面介紹的 流式路由 API:api
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:
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.