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 中, 如果我想使用 url helper 取得當前的 url, 包含 query string, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    // Get the current URL including the query string...
    echo url()->What should I put here?
  • Answer:

    <?php
    // Get the current URL including the query string...
    echo url()->full();
Laravel 中, 如果我想使用 url helper 取得上一次請求的 request, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    // Get the full URL for the previous request...
    echo url()->what should I put here?
  • Answer:

    <?php
    // Get the full URL for the previous request...
    echo url()->previous();
Laravel 中, 除了可以使用 url helper 取得 url 之外, 我還可以使用哪一個 class?

URL facade




# URLs For Named Routes

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

可以使用 route name

Laravel 中, 如果我想要產生一個 url http://example.com/post/1, 但我想帶入 Model $post, 在以下的 Example 中, 我可以怎麼修改?
  • Example:

    <?php
    echo route('post.show', ['post' => 1]);
  • Answer:

    <?php
    echo route('post.show', ['post' => $post]);
Laravel 中, 如果我要產生 url http://example.com/post/1/comment/3, 在以下的 example 中, 該怎麼做?
  • Example:

    <?php
    Route::get('/post/{post}/comment/{comment}', function () {
    //
    })->name('comment.show');
    echo route('comment.show', what should I put here?);
  • Answer:

    <?php
    echo route('comment.show', ['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 中, 如果我產生一個 signed url, 假設 route name 為 ‘unsubscribe’, parameter 的 key/value 為 role/2, 那在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    use Illuminate\Support\Facades\URL;

    return URL::what should I put here?;
  • Answer:

    <?php
    use Illuminate\Support\Facades\URL;

    return URL::signedRoute('unsubscribe', ['role' => 2]);
Laravel 中, 如果我想要產生一個暫時性的 signed url, 假設效期為 30 分鐘後, route name 為 ‘unsubscribe’, parameter 的 key/value 為 role/2, 在以下的 example 可以怎麼做?
  • Example:

    <?php
    use Illuminate\Support\Facades\URL;

    return URL::what should I put here?
    );
  • Answer:

    <?php
    use Illuminate\Support\Facades\URL;

    return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['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 中, 如果我想要產生一個 url, 這個 url 會導向指定的 Controller, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    // 假設 Controller 為 HomeController@index
    $url = what should I put here?
  • Answer1:

    <?php
    $url = action('HomeController@index');
  • Answer2:

    <?php
    $url = action([HomeController::class], 'index');
以下的 Laravel example 中, 如果我想要傳入 argument, 我可以怎麼做?
  • Example:

    <?php
    // 假設 argument 為 id => 1
    $url = action('UserController@profile', what should I put here?);
  • Answer:

    <?php
    $url = action('UserController@profile', ['id' => 1]);




# Default Values

Laravel 中, 假如我有很多 route 都有相同的 parameter, 而每次要使用這些 route 來產生 url 時我都要定義這些 parameter 的值, 如果我想要將這個定義的動作變成預設, 我可以使用 哪一個 class哪一個 method 來做到這件事?
  • URL class
  • defaults method
解釋以下的 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:

    <?php

    namespace App\Http\Middleware;

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

    class SetDefaultLocaleForUrls
    {
    public function handle($request, Closure $next)
    {
    // 每次經過此 middleware 時, URL class 會使用 defaults method 將 'locale' 這個 parameter 設為 $request->user()->locale 的值, 所以當使用該 route 來產生 url 時便不需再手動定義 'locale'
    URL::defaults(['locale' => $request->user()->locale]);

    return $next($request);
    }
    }
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

×