Laravel - The Basics - URL Generation (官方文件原子化翻譯筆記)

# 前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。



# The Basics

# Generating Basic URLs

解釋以下 Laravel example
  • Example:
    <?php
    $post = App\Post::find(1);

    echo url("/posts/{$post->id}");

    // http://example.com/posts/1
  • Answer:
    <?php
    $post = App\Post::find(1);

    // 使用 url helper 產生 url
    echo url("/posts/{$post->id}");

    // http://example.com/posts/1

# Accessing The Current URL

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    echo url()->current();
  • Answer:
    使用 url helper 取得當前 url, 但不包含 query string
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // Get the current URL including the query string...
    echo url()->full();
  • Answer:
    取得當前 request url, 包含 query string
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // Get the full URL for the previous request...
    echo url()->previous();
  • Answer:
    使用 url helper 取得上一次請求的 request url
Laravel 中, 除了可以使用 url helper 取得 url 之外, 我還可以使用哪一個 class?

URL facade



# URLs For Named Routes

Laravel 中, 除了使用 actual url 來產生 url 之外, 我還可以使用什麼來產生 url, 而且就算之後 actual url 變更了, 我也不會影響到我的邏輯?

可以使用 route name

以下的 example 產生 ‘example.com/post/1’ 的 url, 為什麼?
  • Example:
    <?php
    // 直接帶入 Post model
    echo route('post.show', ['post' => $post]);
  • Answer:
    因為 Laravel 會自動地從該 Post model 取出 'id'
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::get('/post/{post}/comment/{comment}', function () {
    //
    })->name('comment.show');
    echo route('comment.show', ['post' => 1, 'comment' => 3]);
  • Answer:
    產生一個 route url 'example.com/post/1/comment/3'

# Signed URLs

Laravel 中, Signed URLs 可以用在什麼情境上?

提供一個 email 到客戶信箱, “unsubscribe” 的 link

解釋以下的 Laravel example code
  • Example:
    <?php
    use Illuminate\Support\Facades\URL;

    return URL::signedRoute('unsubscribe', ['user' => 1]);
  • Answer:
    <?php
    use Illuminate\Support\Facades\URL;

    // 產生 signed url, unsubscribe 為 route name, user 為 parameter
    return URL::signedRoute('unsubscribe', ['user' => 1]);
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Support\Facades\URL;

    return URL::signedRoute('unsubscribe', ['role' => 2]);
  • Answer:
    產生一個 route name 為 unsubscribe 的 signedRoute
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Support\Facades\URL;

    return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['role' => 2]
    );
  • Answer:
    產生一個 route 'unsubscribe' 的暫時 url, 有效期限為 30 分鐘, 並帶入 parameter 'role' => 2

# Validating Sighed Route Requests

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Http\Request;

    Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
    abort(401);
    }

    // ...
    })->name('unsubscribe');
  • Answer:
    驗證該 User 帶進來的 signature 是否正確
解釋以下的 Laravel example code
  • Example:
    <?php
    protected $routeMiddleware = [
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    ];
  • Answer:
    註冊 ValidateSignature middleware 來驗證 signed url 正確性


# URLs For Controller Actions

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $url = action([HomeController::class], 'index');

    $url = action('HomeController@index');
  • Answer:
    必須先定義 route
    功能跟 route(‘routeName’) 是一樣的, 使用 action 會 return 定義該 controller 的 route 的 url
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $url = action('UserController@profile', ['id' => 1]);
  • Answer:
    產生一個導向 'UserControlelr' 的 'profile' method 的 url, 並帶入 parameter


# Default Values

解釋以下的 Laravel example code
  • Example:
    <?php

    namespace App\Http\Middleware;

    use Closure;
    use Illuminate\Support\Facades\URL;

    class SetDefaultLocaleForUrls
    {
    public function handle($request, Closure $next)
    {
    URL::defaults(['locale' => $request->user()->locale]);

    return $next($request);
    }
    }
  • Answer:
    當我 return 一個 url 時, 若是該 route 需要帶入 url parameter, 我便需要每次都特別指定, 尤其若是有許多 route 都有相同的情況, 但我便需要增加很多 code 來定義回傳的 url 中 parameter 的值
    可以自訂一個 middleware 統一定義 ‘locale’ 這個 url parameter, 作用範圍為回傳的 url, 與 model binding 不相衝突
Laravel - The Basics - Error Handling (官方文件原子化翻譯筆記) Laravel - The Basics - Responses (官方文件原子化翻譯)

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×