Ray Lee | 李宗叡
Learn or Die
Published in
13 min readDec 9, 2020

--

Photo by Kamil S on Unsplash

# 前言

我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。

# 目錄

Laravel — 官方文件原子化翻譯 — 目錄

# 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

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.