Laravel - The Basics - Controllers (官方文件原子化翻譯)

# 前言

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



# Basic Controllers

# Defining Controllers

Laravel 中, 如果不 extend basic controller 的話, 是有什麼影響?

無法使用一些方便的功能, 像是 middleware, validate, 以及 dispatch


# Controllers and Namespaces

Laravel 中, 如果以下是我的 Controller 路徑, 那我該在 Route 中怎樣定義我的 Controller 位址?
  • 路徑:
    App\Http\Controllers\Photos\AdminController
  • Answer:
    <?php
    Route::get('foo', 'Photos\AdminController@method');

# Single Action Controllers

Laravel 中, 如果我要從 CLI 建立一個 single action controller, 我可以怎麼做?
php artisan make:controller ControllerName --invokable
以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App\Http\Controllers;

    use App\Http\Controllers\Controller;
    use App\User;

    class ShowProfile extends Controller
    {
    public function __invoke($id)
    {
    return view('user.profile', ['user' => User::findOrFail($id)]);
    }
    }
  • Answer:
    使用 __invoke method, 表示該 controller 只有一個 method
Laravel 中, 在 route 註冊 single action controller 時, 需要指定 method 嗎?

不用



# Controller Middleware

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    class UserController extends Controller
    {
    public function __construct()
    {
    $this->middleware('auth');

    $this->middleware('log')->only('index');

    $this->middleware('subscribed')->except('store');
    }
    }
  • Answer:
    <?php
    class UserController extends Controller
    {
    public function __construct()
    {
    // 指定該 controller 需使用 auth middleware
    $this->middleware('auth');

    // 指定只有該 controller 中的 index method 使用 log middleware
    $this->middleware('log')->only('index');

    // 指定除了該 controller 中的 store method 之外, 其餘 method 都使用 subscribed middleware
    $this->middleware('subscribed')->except('store');
    }
    }
Laravel 中, 除了在 route, global, 以及 group 中指派 middleware 之外, 我還可以在什麼地方指派?

Controller

以下位於 controller 中的 example code 的意思是?
  • Example:
    <?php
    $this->middleware(function ($request, $next) {
    // ...

    return $next($request);
    });
  • Answer:
    在 controller 中定義一個 middleware
Laravel 中, 如果我要在 controller 中定義 (非指派) 一個 middleware, 那我可以怎麼做?

在 Controller 中



# Resource Controllers

Laravel 中, 如果我要使用 CLI 來建立一個 Resource Controller, 我可以怎麼做?
php artisan make:controller ControllerName --resource
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::resources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
    ]);
  • Answer:
    一次定義多個 resource controller
    recourse controller 可一次處理多種 action, 像是 create, edit, show, delete 等等…, 會根據 http method 以及 url 去判斷該 request 是屬於哪一種 action, 並導向該 controller 中相對應的 method

# Specifying The Resource Model

以下的 Laravel example code 的意思是?
  • Example:
    php artisan make:controller ControllerName --resorce --model=ModelName
  • Answer:
    自動建立一個 Resource Controller, 即 Controller 內已經幫你建立好各種預設的 method, 像是 index, update, show …etc, 而 –model 代表這些 method 預設 type hint 的 model

# Spoofing Form Methods

以下的 Laravel example code 的意思是?
  • Example:
    <form action="/foo/bar" method="POST">
    @method('PUT')
    </form>
  • Answer:
    HTTP Form 並不支援 ‘PUT’ method, 所以使用 blade 語法來模擬 ‘PUT’ method

# Partial Resource Routes

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::resource('photos', 'PhotoController')->only([
    'index', 'show'
    ]);
  • Answer:
    只開放 ‘index’ 以及 ‘show’ method, 也就是說只可 GET ‘example.com/photos’ 以及 ‘example.com/photos/{photo}’
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::resource('photos', 'PhotoController')->except([
    'create', 'store', 'update', 'destroy'
    ]);
  • Answer:
    只開放該 resource controller, 除了 [‘create’, ‘store’, ‘update’, ‘destroy’] 之外的 method

# API Resource Route

apiResource routeresource route 的差別在於?

apiResource route 不包含 create 以及 edit method

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::apiResources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
    ]);
  • Answer:
    一次性的定義多個 apiResources routes
以下的 Laravel example command 的意思是?
  • Example:
    php artisan make:controller ControllerName --api
  • Answer:
    使用 CLI 建立 apiResource controller

# Nested Resources

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::resource('photos.comments', 'PhotoCommentController');
  • Answer:
    建立一個 nested resources route
    API 會像是 ‘example.com/api/photos/{photo}/comments/{comment}’
    情境為 Photo model 有多個 Comment model, 也就是說 Comment model 必須得 belongsTo Photo model

# Shallow Nesting

Laravel 中, 如果我要定義一個 resource route 具有以下的模式, 那我可以怎麼樣來定義我的 route?
  • Example:
  • Answer:
    <?php
    Route::resource('photos.comments', 'CommentController')->shallow();


# Naming Resource Routes

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::resource('photos', 'PhotoController')->names([
    'create' => 'photos.build'
    ]);
  • Answer:
    Laravel resources controller 每個 action 都會有預設的 name, 如果要自定義, 可以使用 names method

# Naming Resource Route Parameters

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::resource('users', 'AdminUserController')->parameters([
    'users' => 'admin_user'
    ]);
  • Answer:
    使用 resource route, 預設 url 為 ‘users/{user}’, 但因為使用 parameter method 修改, 所以 url 為 ‘users/{admin_user}’

# Localizing Resource URIs

解釋以下的 Laravel example 的意思
  • Example:
    <?php
    use Illuminate\Support\Facades\Route;

    public function boot()
    {
    Route::resourceVerbs([
    'create' => 'crear',
    'edit' => 'editar',
    ]);
    }
  • Answer:
    當使用 resource route 時, Laravel 預設會定義 verb, 比如說 Route::resource(‘photos’, ‘PhotoController’), edit action 的 url 會是 ‘example.com/photos/{photo}/edit’
    若要變更 url 中的 resource verb, 可以在 AppServiceProvider 的 boot method 中, 如上 example 自定義

# Supplementing Resource Controllers

Laravel 中, 當我使用了 resource route, 但我同時也定義了其他的 route 給同一個 controller 除了 resource 以外的 action, 那這些額外定義的 route 應該置於 resource route 之前還是之後?

之前

Laravel 中, 如果你發現你常常需要增加額外的 method 到一個 resource controller, 那你可能該怎麼做?

增加新的 Controller 讓 controller 的功能比較單一



# Dependency Injection and Controllers

Laravel 中, 在 Controller 中可以使用哪兩種 dependency injection 方式?
  • Constructor Injection
  • Method Injection
以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App\Http\Controllers;

    use App\Repositories\UserRepository;

    class UserController extends Controller
    {
    protected $users;

    public function __construct(UserRepository $users)
    {
    $this->users = $users;
    }
  • Answer:
    使用 Controller 中的 construct injection, inject UserRepository 這個 class
以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App\Http\Controllers;

    use Illuminate\Http\Request;

    class UserController extends Controller
    {
    public function store(Request $request)
    {
    $name = $request->name;

    //
    }
    }
  • Answer:
    使用 method injection 的方式, inject Request 到 store method 中
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // 在 .../routes/web.php
    Route::put('user/{id}', 'UserController@update');

    // 在 controller 中
    namespace App\Http\Controllers;

    use Illuminate\Http\Request;

    class UserController extends Controller
    {
    public function update(Request $request, $id)
    {
    //
    }
    }
  • Answer:
    將從 url parameter 中取得的 {id}, 帶入到 UserController 中的 update method, 沒有使用 model binding

# Route Caching

Laravel 中, closure based routes 可以被 cached 嗎?

不行哦

Laravel 中, route cache 的優點是?

可以大幅的縮小註冊 routes 的時間

Laravel 中, 如果我要用 CLI 來 cache route, 我可以怎麼做?
php artisan route:cache
Laravel 中, 在我使用了 route:cache 之後, 如果我又新增了一個 route, 那我該怎麼樣讓它生效?
php artisan route:clear
php artisan route:cache
<未完成> kubernetes - Storage Classes <未完成> 使用地區性的永久磁碟部署 Apps 到 Kubernetes Engine

留言

Your browser is out-of-date!

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

×