Laravel Routing

PHP:7.2

Laravel:5.7

Laravel 所有的 routes 定義都是寫在 routes 目錄裡,這裡介紹一下兩個最常用的:

  • routes/web.php
  • routes/api.php

根據檔名的命名,顧名思義分別是定義一般頁面與 API 的 routes,這兩支檔案又綁了 RouteServiceProvider 這個 Provider,因此定義在 routes/api.php 的 routes 都會自動加上 /api 的 prefix。

舉例來說,以下這個範例如果寫在 web.phpapi.php,進入的 URL 分別是 /foo/api/foo

Route::get('hello', function () {
    return 'Hello World';
});

基本使用

Laravel route 的撰寫很容易,基本上是以 Http verb 為 method name 來決定。

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

基本範例

// 該頁只顯示字串
Route::get('hello', function () {
    return 'Hello World';
});

// 直接使用 resources/views 裡的頁面
Route::get('/', function () {
    return view('welcome');
});

// 綁定 Controller (格式為 Controller Namespace@method )
// RouteServiceProvider 會預設定義 Namespace 在 App\Http\Controllers
Route::get('/user', 'UserController@index');
Route::post('/user/update', 'API\UserController@update');

RESTful

現在的網站或 API 設計已經都是走 RESTful 的架構了, Laravel 的 Route 提供了很完整的功能可以輕易的完成 RESTful 架構。

基本範例

// 定義參數
Route::get('user/{id}', function ($id) {
    return 'User ' . $id;
});

// 多個參數
Route::get('user/{id}/name/{name}', function ($id, $name) {
    // do something
});

// Optional 參數,變數後面加上 ? 字符就可以變成 optional 的參數,但相對的是要再設定預設值。
Route::get('/list/user/{page?}', function ($page = 1) {
    return $page;
});

Route Groups

在一般的網站應用中,一定會有數個頁面是屬於同性質甚至有著相似的 URL,透過 Route Groups 可以批次處理這些 routes。

// 設定 URL Prefix
Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // "/admin/users" URL
    });

    Route::get('list', function () {
        // "/admin/list" URL
    });
});

// 設定 Controller Namespace
Route::namespace('Admin')->group(function () {
    // Controllers 預設 Namespace 為 "App\Http\Controllers\Admin"
    // 在此 group 裡面的定義就不用寫成 Admin\Controller
    Route::get('/test', 'TestController@test');
});

// 設定 Middleware
Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 這兩個 Middleware
    });
});

// 同時使用 namespace 及 prefix
Route::namespace('Admin')->prefix('admin')->group(function () {
    Route::get('/test', 'TestController@test');
});

// 直接透過 group 的參數設定
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function () {
    Route::get('/test', 'TestController@test');
});

Named Routes

在開發中如果有需要轉址或者其他用途,也可以給予 Route 命名再加以應用。

基本使用

Route::get('/user', 'UserController@index')->name('user');
// 在 Controller 中可以取得 url
$url = route('user');

// 透過 redirect method 直接轉址
return redirect()->route('name');

代入參數

Route::get('/user/{id}/profile', 'UserController@index')->name('user');
$url = route('user', ['id' => 1]);
Categories: Laravel