Laravel - The Basics - Responses

# 前言

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




# Creating Responses

# Strings & Arrays

以下的 Laravel 範例中, 如果我要 return 一個 string, 在以下的範例中, 我可以怎麼做?
  • Example

    <?php
    Route::get('/', function () {
    // what should I put here, string is 'Hello World'
    });
  • Answer:

    <?php
    Route::get('/', function () {
    return 'Hello World';
    });
以下的 Laravel 範例回以什麼格式 return?
  • Example:

    <?php
    Route::get('/', function () {
    return [1, 2, 3];
    });
  • Answer:
    JSON

Laravel 中, 如果我 return 一個 Eloquent collection, 最終會以什麼格式 return?

JSON


# Response Objects

以下的 Laravel example 的意思是?
  • Example:

    <?php
    Route::get('home', function () {
    return response('Hello World', 200)
    ->header('Content-Type', 'text/plain');
    });
  • Answer:

    <?php
    Route::get('home', function () {
    // return stirng 'Hello World', status code 為 200
    return response('Hello World', 200)
    // header Content-type 為 text/plain
    ->header('Content-Type', 'text/plain');
    });

# Attaching Headers To Responses

Laravel 中, attach header 有哪兩種方式?
  • chain header method
  • withHeaders method
解釋以下的 Laravel 範例
  • Example:

    <?php
    return response($content)
    ->header('Content-Type', $type)
    ->header('X-Header-One', 'Header Value')
    ->header('X-Header-Two', 'Header Value');
  • Answer:
    利用 header chain 的方式 attach 多個 header

解釋以下的 Laravel 範例
  • Example:

    <?php
    return response($content)
    ->withHeaders([
    'Content-Type' => $type,
    'X-Header-One' => 'Header Value',
    'X-Header-Two' => 'Header Value',
    ]);
  • Answer:
    使用 withHeaders method 的方式 attach 一個 array


# Cache Control Middleware

Laravel 中, 如果我要快速地針對特定 route 設定 Cache-Control header, 那我可以使用哪個 middleware?

cache.headers middleware

解釋下面的 Laravel example
  • Example:

    <?php
    Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
    Route::get('privacy', function () {
    // ...
    });

    Route::get('terms', function () {
    // ...
    });
    });
  • Answer:

    <?php
    // 使用 cache.header middleware 來對特定 route 做 Cache-Controel, 語法可參考
    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
    // etag 會針對 response 內容做一個 MD5 hash 以做為識別器

    Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
    Route::get('privacy', function () {
    // ...
    });

    Route::get('terms', function () {
    // ...
    });
    });


# Attaching Cookies To Responses

Requests Documentation


# Cookies & Encryption

App\Http\Middleware\EncryptCookies

$except

  • Example:

    <?php
    /**
    * The names of the cookies that should not be encrypted.
    *
    * @var array
    */
    protected $except = [
    // What should I put here?
    ];
  • Answer:

    <?php
    /**
    * The names of the cookies that should not be encrypted.
    *
    * @var array
    */
    protected $except = [
    'cookie_name',
    ];




# Redirects

Laravel 中, redirect responses 是哪一個 class 的 instance?

Illuminate\Http\RedirectResponse

Laravel 中, 如果我想要 redirect 到指定的位置, 假設是 ‘home/dashboard’, 那在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    Route::get('dashboard', function () {
    // What should I put here?
    });
  • Answer:

    <?php
    Route::get('dashboard', function () {
    return redirect('home/dashboard');
    });
以下的 Laravel example code 的意思是?
  • Example:

    <?php
    Route::post('user/profile', function () {
    // Validate the request...

    return back()->withInput();
    });
  • Answer:
    redirect 回上一個位置, 帶著 input


# Redirecting To Named Routes

Laravel 中, 當我使用 redirect method without no parameters, 會 return 哪一個 class 的 instance?

Illuminate\Routing\Redirector

Laravel 中, 如果我要 redirect 到名為 login 的 route, 我可以怎麼做?
<?php
return redirect()->route('login');
Laravel 中, 如果我要 redirect 到名為 login 的 route, 並且帶著 key/value 為 id/1 的 parameter, 我可以怎麼做?
<?php
return redirect()->route('login', ['id' => 1]);


# Populating Parameters Via Eloquent Models

Laravel 中, 如果我要 redirect 到一個 url 中帶有 id parameter 的 route, 如下 example, 而我想直接帶入 model $user, 我可以怎麼做?
  • Example:

    <?php
    // For a route with the following URI: profile/{id}

    return redirect()->route('profile', 'What should I put here?');
  • Answer:

    <?php
    // For a route with the following URI: profile/{id}

    return redirect()->route('profile', [$user]);


# Redirecting To Controller Actions

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    return redirect()->action('HomeController@index');
  • Answer:
    redirect 到一個 controller 名為 HomeController@index

Laravel 中, 如果我想要帶著 parameter 並 redirect 到一個 controller, 假如這個 controller 叫做 HomeController@index, 而 parameter 為 id/1 那我可以怎麼做?
<?php
return redirect()->action(
'UserController@profile', ['id' => 1]
);


# Redirecting To External Domains

Laravel 中, 如果我想要 redirect 到一個 Laravel 外的 domain 位置, 比如說 https://www.google.com, 那我可以怎麼做?
<?php
return redirect()->away('https://www.google.com');


# Redirecting With Flashed Session Data

Laravel 中, 如果我想要 redirect 到一個 route, 並且將一些 message 存到 session 帶過去, 如下 example, 那我可以怎麼做?
  • Example:

    <?php
    Route::post('user/profile', function () {
    // Update the user's profile...

    // redirect 到 dashboard route, 並且將 status => 'Profile updated' 的訊息 存到 session 帶過去
  • Answer:

    <?php
    Route::post('user/profile', function () {
    // Update the user's profile...

    return redirect('dashboard')->with('status', 'Profile updated!');
    });
以下的 Laravel example code 的意思是?
  • Example code:

    <?php
    Route::post('user/profile', function () {
    // Update the user's profile...

    return redirect('dashboard')->with('status', 'Profile updated!');
    });
  • Example blade:

    <?php
    @if (session('status'))
    <div class="alert alert-success">
    {{ session('status') }}
    </div>
    @endif
  • Answer:
    redirect 到 dashboard route, 將 status 存到 session 並帶過去, 在 blade page 中拿出 session




# Other Responses Types

Laravel 中, 當 response helper 被呼叫並且不帶任何參數時, 會回傳哪一個 class?

Illuminate\Contracts\Routing\ResponseFactory

# View Responses

解釋以下 Laravel example
  • Example:

    <?php
    return response()
    ->view('hello', $data, 200)
    ->header('Content-Type', $type);
  • Answer:

    <?php
    // 使用 response global helper
    return response()
    // return view, customized status code
    ->view('hello', $data, 200)
    // return header
    ->header('Content-Type', $type);


# JSON Responses

Laravel 中, 如果我想要將以下範例中的 array 變成 json 在 response, 我可以怎麼做?
  • Example:

    <?php
    $array = ['name' => 'Abigail', 'state' => 'CA'];
    return responses()-> what shoud I put here?
  • Answer:

    <?php
    return response()->json($array);
解釋以下 Laravel example
  • Example:

    <?php
    return response()
    ->json(['name' => 'Abigail', 'state' => 'CA'])
    ->withCallback($request->input('callback'));
  • Answer:
    建立一個 JSONP response


# File Downloads

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    return response()->download($pathToFile);
  • Answer:
    直接觸發瀏覽器下載這個檔案

以下的 Laravel 程式碼中, 如果我想要指定使用者方看到的檔案名稱, 那我可以怎麼做?
  • Example:

    <?php
    return response()->download($pathToFile);
  • Answer:

    <?php
    return response()->download($pathToFile, $name, $headers);
解釋以下的 Laravel example
  • Example:

    <?php
    return response()->download($pathToFile, $name, $headers);
  • Answer:
    讓瀏覽器下載檔案, 指定使用者方看到的檔案名稱, 並且指定 header

以下的 Laravel example 中, 如果我想要讓使用者下載完畢後, server 端就將該檔案刪除, 我可以怎麼做?
  • Example:

    <?php
    return response()->download($pathToFile);
  • Answer:

    <?php
    return response()->download($pathToFile)->deleteFileAfterSend();


# Streamed Downloads

Laravel 中, 如果我想要 return 一個 response 觸發使用者瀏覽器直接下載檔案, 但我要分批的讀取檔案, 避免檔案的讀取將記憶體吃光, 那我可以怎麼做?
<?php
return response()->streamDownload(function () {
echo GitHub::api('repo')
->contents()
->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');


# File Responses

Laravel 中, 如果我想要回傳一個 response, 使用者可以經由這個 url 直接存取到檔案內容, 而不是觸發一個下載, 我可以怎麼做?
<?php
return response()->file($pathToFile);




# Response Macros

Laravel 中, 如果我想要自己建一個 service provider, 那我可以建立在哪一個資料夾中?

app/Providers

解釋以下 Laravel example
  • Example:

    <?php

    namespace App\Providers;

    use Illuminate\Support\Facades\Response;
    use Illuminate\Support\ServiceProvider;

    class ResponseMacroServiceProvider extends ServiceProvider
    {
    /**
    * Register the application's response macros.
    *
    * @return void
    */
    public function boot()
    {
    Response::macro('caps', function ($value) {
    return Response::make(strtoupper($value));
    });
    }
    }
  • Answer:

    <?php

    // 建立一個檔案在 App/Providers 資料夾下, 並指定好 namespace
    namespace App\Providers;

    // 會用到 Facades\Response
    use Illuminate\Support\Facades\Response;
    use Illuminate\Support\ServiceProvider;

    // 自定義的 class 需 extends 內建 ServiceProvider
    class ResponseMacroServiceProvider extends ServiceProvider
    {
    /**
    * Register the application's response macros.
    *
    * @return void
    */
    // 在 boot method 中
    public function boot()
    {
    // 使用 macro method 來定義名為 caps 的 response
    Response::macro('caps', function ($value) {
    // 該 response 的邏輯
    return Response::make(strtoupper($value));
    });
    }
    }
Laravel 中, 自定義一個 response 後, 在以下的 example, 我可以怎麼使用它
  • Example:

    <?php

    namespace App\Providers;

    use Illuminate\Support\Facades\Response;
    use Illuminate\Support\ServiceProvider;

    class ResponseMacroServiceProvider extends ServiceProvider
    {
    /**
    * Register the application's response macros.
    *
    * @return void
    */
    public function boot()
    {
    Response::macro('caps', function ($value) {
    return Response::make(strtoupper($value));
    });
    }
    }
  • Example:

    <?php
    return response()->what should I put here?;
  • Answer:

    <?php
    return response()->caps('foo');
Laravel - The Basics - URL Generation <未完成> Laravel - The Basics - Views

留言

Your browser is out-of-date!

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

×