iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
自我挑戰組

後端新手PHP+Laravel筆記系列 第 22

[Day22]Laravel 路由

Laravel 路由

基本路由

首先看到rotues資料夾裡的web.php,會看到這些程式碼

Route::get('/', function () { // 使用get方法請求
    return view('welcome'); // 回傳view給他
});

view的位置就放在resources\views\welcome.blade.php

接下來說說來說說基本路由
Laravel 的路由只接受一個 URI 和一個Closure(閉包)

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

laravel 可以使用所有HTTP的方法

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

可能你這個路由可以響應多個HTTP的請求,可以使用match,或者任何請求都可以就使用any

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('foo', function () {
    //
});

如果有將路由指向任何HTML表單POST,PUT或DELETE放在web.php中,應當包括CSRF令牌字段。否則,請求將被拒絕。

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

路由參數

所需參數

有時需要捕捉路由中的URI字段,可以通過以下方式實現

Route::get('user/{id}', function ($id) {
    return "User: $id";
});

如下圖所示:

可以根據自己的想法來定義更多的路線參數

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

可選參數

有時可能需要指定一個路由參數,但將該路由參數的存在設為可選。您可以通過?在參數名稱後放置一個標記來實現。確保給路由對應的變量一個默認值:

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});

正規表達法約束

您可以使用where路由實例上的方法來限制路由參數的格式。該where方法接受參數的名稱和定義參數應如何約束的正則表達式:

Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+'); // 他就會找出$name這個參數,符合規則的字段

Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

全局約束

如果您希望路由參數始終受給定正則表達式的約束,則可以使用該pattern方法。您應該在boot您的方法中定義這些模式RouteServiceProvider

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

一旦定義了模式,它就會自動應用於使用該參數名稱的所有路由:

Route::get('user/{id}', function ($id) {
    // Only executed if {id} is numeric...
});

命名路由

命名路由允許為特定路由方便地生成 URL 或重定向。您可以通過將name方法鏈接到路由定義來為路由指定名稱:

Route::get('user/profile', function () {
    //
})->name('profile');

您還可以為控制器操作指定路由名稱:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

生成命名路由的 URL

為給定路由指定名稱後,您可以在通過全局route函數生成 URL 或重定向時使用該路由的名稱:

// Generating URLs...
$url = route('profile');

// Generating Redirects...
return redirect()->route('profile');

如果命名路由定義了參數,您可以將參數作為第二個參數傳遞給route函數。給定的參數將自動插入到 URL 的正確位置:

Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

上一篇
[Day21]Laravel目錄結構
下一篇
[Day23]下載POSTMAN以及MYSQL
系列文
後端新手PHP+Laravel筆記30

尚未有邦友留言

立即登入留言