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

# Introduction

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



# Validation Quickstart

# Writing The Validation Logic

在 Laravel validation 中, 如果請求的是 HTTP request, 那 validation 會回什麼?

redirect response

在 Laravel validation 中, 如果請求的是 AJAX request, 那 validation 會回什麼?

JSON response

Laravel validation rules 可以用哪兩種方式指定?
  • | delimited string
  • array
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $request->validateWithBag('blog', [
    'title' => ['required', 'unique:posts', 'max:255'],
    'body' => ['required'],
    ]);
  • Answer:
    指定該 validation 的 message bag name, 如果該 page 呼叫多個 API 的話, 便可以經由 message bag name 辨別不同 form 的 error message

# Stopping On First Validation Failure

以下的 Laravel example code 的意思是?
  • 範例程式碼:
    <?php
    $request->validate([
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required',
    ]);
  • Answer:
    bail rule, 當驗證沒通過時立即停下, 不再繼續往下驗

# A Note On Nested Attributes

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $request->validate([
    'title' => 'required|unique:posts|max:255',
    'author.name' => 'required',
    'author.description' => 'required',
    ]);
  • Answer:
    如果 author 是個 array 或 json, 驗證 author 下 key 為 name 以及 description 都需 present, 且 value 不可為空

# Displaying The Validation Errors

Laravel validation 中, 我們不需要特別的 bind error message 以及 GET route, 但卻能夠把 error message 帶過去, 為什麼?

因為 Laravel 將 error message 放在 flash session 當中

Laravel validation 中, $errors 變數是什麼的 instance?

Illuminate\Support\MessageBag

Laravel validation 中, $errors 變數是被哪一個 middleware 將之與 view 連接在一起?

Illuminate\View\Middleware\ShareErrorsFromSession

以下的 Laravel example code 的意思是?
  • Example:
    <!-- /resources/views/post/create.blade.php -->

    <h1>Create Post</h1>

    @if ($errors->any())
    <div class="alert alert-danger">
    <ul>
    @foreach ($errors->all() as $error)
    <li>{{ $error }}</li>
    @endforeach
    </ul>
    </div>
    @endif

    <!-- Create Post Form -->
  • Answer:
    在 blade view page 中, 如果 $error 存在, 印出 $error
    Route 可以是 back()->withErrors($validation)

# The @error Directive

以下的 Laravel example code 的意思是?
  • Example:
    <!-- /resources/views/post/create.blade.php -->

    <label for="title">Post Title</label>

    <input id="title" type="text" class="@error('title') is-invalid @enderror">

    @error('title')
    <div class="alert alert-danger">{{ $message }}</div>
    @enderror
  • Answer:
    如果 error 'title' 存在的話, 就執行 @error directive 內的動作

# A Note On Optional Fields

Laravel 中, 空的 string 會被轉化成 null, 這是為什麼?

因為以下兩個 global middleware

  • TrimStrings
  • ConvertEmptyStringsToNull
Laravel validation 當中, 如果我要 input 是允許 null 的, 我可以加入哪一個 rule?

nullable



# Form Request Validation

# Creating Form Requests

Laravel 中, 如果我要用 CLI 建立一個 “form request”, 我可以怎麼做?
php artisan make:request StoreBlogPort
以下位於 form request 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function rules(Deposit $deposit)
    {
    return [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    ];
    }
  • Answer:
    定義該 FORM REQUEST 的 rule, 並 inject 需要的 dependency
以下位於 Controller 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function store(StoreBlogPost $request)
    {
    $validated = $request->validated();
    }
  • Answer:
    使用 Form request 來驗證, 並取得 validated request
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function withValidator($validator)
    {
    $validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
    $validator->errors()->add('field', 'Something is wrong with this field!');
    }
    });
    }
  • Answer:
    在 validate 之後再做其他的驗證

# Authorizing Form Requests

Laravel 中, 如果我想要在 “form requests” 當中驗證一個 user 是否有相關 policy 定義的存取權限, 我可以使用哪一個 method?

authorize()

Laravel 中, 如果 “form request” 中的 authorize method return false, Laravel 會直接回什麼樣的 Response?

403

Laravel 中, 如果我不打算使用 “form request” 中的 authorize, 我想在其他地方驗證權限部分, 那我必須要讓 authorize method return 什麼 response?

true


# Customizing The Error Messages

在 Laravel 中, 如果我要客製化 “form request” 的錯誤訊息, 我可以使用哪一個 method?

messages

以下位於 Form request 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function messages()
    {
    return [
    'title.required' => 'A title is required',
    'body.required' => 'A message is required',
    ];
    }
  • Answer:
    使用 message(), 定義 error message, 當 titlerequired rule 驗證失敗, 錯誤訊息為 'A title is required'

# Customizing The Validation Attributes

以下位於 Form request 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function attributes()
    {
    return [
    'email' => 'test email',
    ];
    }
  • Answer:
    將 error message 中原本顯示為 email 的 attribute 改為 test email

# Prepare Input For Validation

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

    protected function prepareForValidation()
    {
    $this->merge([
    'slug' => Str::slug($this->slug),
    ]);
    }
  • Answer:
    Form request 中的 prepareForValidation 可以讓 Request 在 validate 之前先被處理過, 如上 example, 將 slug input 的 value 跑過 Str::slug(), 假如 input value 為 ‘a b c d’, 到了 validation 那則會變成 ‘a-b-c-d’


# Manually Creating Validators

以下的 Laravel 範例程式碼是什麼意思?
  • 範例程式碼:
    <?php

    namespace App\Http\Controllers;

    class PostController extends Controller
    {

    public function store(Request $request)
    {
    $validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    ]);

    if ($validator->fails()) {
    return redirect('post/create')
    ->withErrors($validator)
    ->withInput();
    }

    // Store the blog post...
    }
    }
  • Answer:
    <?php

    namespace App\Http\Controllers;

    class PostController extends Controller
    {

    public function store(Request $request)
    {
    // 手動建立一個 validator, make 的第一個 parameter 為 request, 第二個為 rules
    $validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    ]);

    // 如果 validator 驗證失敗
    if ($validator->fails()) {
    // 重導向 post/create
    return redirect('post/create')
    // 將 error 存到 session
    ->withErrors($validator)
    // 將指定的 input 存到 session, 若有帶則為帶入的 input array, 若沒帶則為 request->input, 可參考 https://github.com/laravel/framework/blob/6.x/src/Illuminate/Http/RedirectResponse.php#L74
    ->withInput();
    }

    // Store the blog post...
    }
    }
Laravel validation 中, 什麼情況之下我會需要手動建立一個 validator?

如果我想要控制 驗證到錯誤之後要做些什麼事 的情況

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

    namespace App\Http\Controllers;

    class PostController extends Controller
    {

    public function store(Request $request)
    {
    $validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    ]);

    if ($validator->fails()) {
    return redirect('post/create')
    ->withErrors($validator)
    ->withInput();
    }

    // Store the blog post...
    }
    }
  • Answer:
    一般來說, 如果使用 validate(), Laravel 預設會 return 相對應的 error, 使用 $validator->fails() 可以客製化抓到錯誤之後的動作

# Automatic Redirection

以下的 Laravel example code 的意思是?
  • 程式碼:
    <?php
    Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    ])->validate();
  • Answer:
    使用 validator, make method, arg1 為要驗的來源, arg2 為 rules, 最後 validated() 會執行 Laravel default 驗證, 若驗證失敗會自動跳轉 (HTTP request) 或回應 JSON(當 client 指定 content type Application/json)

# Named Error Bags

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return redirect('register')
    ->withErrors($validator, 'login');
  • Answer:
    重導向 register page, 帶著名為 login 的 $validation error, 若前端有多個 form 呼叫多個 API 的話, 不同名稱的 MessageBag instance 可幫助前端辨別不同 form 的 error
以下的 Laravel Blade example code 的意思是?
  • Example:
    {{ $errors->login->first('email') }}
  • Answer:
    取出名為 login 的 MessageBag, 並從中取出 'email' error message

# After Validation Hook

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $validator = Validator::make(...);

    $validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
    $validator->errors()->add('field', 'Something is wrong with this field!');
    }
    });

    if ($validator->fails()) {
    //
    }
  • Answer:
    <?php
    // 自訂一個 validator
    $validator = Validator::make(...);

    // 在通過 validation rules 的驗證後, 在驗證其他 custom 的 rule
    $validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
    $validator->errors()->add('field', 'Something is wrong with this field!');
    }
    });

    // 判斷驗證結果
    if ($validator->fails()) {
    //
    }


# Working With Error Messages

Laravel 中, 如果我呼叫 validatorerrors method, 我會拿到 哪一個 class 的 instance?

Illuminate\Support\MessageBag

Laravel 中, $errors 這個全域變數是 哪一個 class 的 instance?

Illuminate\Support\MessageBag


# Retrieving The First Error Message For A Field

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $errors = $validator->errors();

    echo $errors->first('email');
  • Answer:
    取得 email 欄位的第一項錯誤

# Retrieving All Error Messages For A Field

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

  • Answer:
    <?php

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $errors = $validator->errors();

    foreach ($errors->get('email') as $message) {
    //
    }
  • Answer:
    從 $errors 中取出 'email' 的所有錯誤訊息
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $errors = $validator->errors();

    foreach ($errors->get('attachments.*') as $message) {
    //
    }
  • Answer:
    attachments 為一個 array, 下面有多個 index, 因此每個 index 都可能會有各自的 error message, 使用 * 取出所有 index 的 error message

# Retrieving All Error Messages For All Fields

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $errors = $validator->errors();

    foreach ($errors->all() as $message) {
    //
    }
  • Answer:
    取得所有驗證過的欄位的錯誤訊息

# Determining If Messages Exist For A Field

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $errors = $validator->errors();
    if ($errors->has('email')) {
    //
    }
  • Answer:
    判斷 'email' column 是否有 error

# Custom Error Messages

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $messages = [
    'required' => 'The :attribute field is required.',
    ];
  • Answer:
    客製化驗證錯誤時的訊息, :attribute 代表 $request 中的 input 名稱
以下的 Laravel example code 的意思是?
  • 錯誤訊息:
    <?php
    $messages = [
    'required' => 'The :attribute field is required.',
    ];

    $validator = Validator::make($input, $rules, $messages);
  • Answer:
    帶入 validator::make() 的 arg3 來客製化 error message
Laravel validation 中, 如果我想要查詢各種在錯誤訊息中代表的相對應的 field, 我可以到哪一個檔案查詢?

resources/lang/xx/validation.php, xx = 語言種類, 比如說, en


# Specifying A Custom Message For A Given Attribute

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $messages = [
    'email.required' => 'We need to know your e-mail address!',
    ];
  • Answer:
    客製化 input 'email', rule 'required' 的 error message, 可將 $message 帶入 Validator::make() 的 arg3

# Specifying Custom Messages In Language Files

Laravel validation 中, 如果我要全域的客製化錯誤訊息, 可以在哪一個檔案中做修改?

resources/lang/xx/validation.php, xx = 語言種類, 比如說, en

以下位於 resources/lang/en/validation.php 的 Laravel example code 的意思是?
  • Example:
    <?php
    'custom' => [
    'email' => [
    'required' => 'We need to know your e-mail address!',
    ],
    ],
  • Answer:
    Global 定義 input 為 email, rule 為 required 的錯誤訊息

# Specifying Custom Attributes In Language Files

以下位於 resources/lang/en/validation.php 的 Laravel example code 的意思是?
  • Example:
    <?php
    'attributes' => [
    'email' => 'email address',
    ],
  • Answer:
    global 定義 attribute, 定義完成後, input 為 email 的 error message 都會顯示 email address

# Specifying Custom Values In Language Files

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Validator::make($request->all(), [
    'credit_card_number' => 'required_if:payment_type,cc'
    ]);

    // 錯誤訊息
    The credit card number field is required when payment type is cc.

    // 在 resources/lang/en/validation.php 修改
    'values' => [
    'payment_type' => [
    'cc' => 'credit card'
    ],
    ],

    // 新錯誤訊息
    The credit card number field is required when payment type is credit card.
  • Answer:
    如果 input payment_type 的 value 為 cc, 那就使用 rule required 驗 input credit_card_number
    Laravel 預設的 error message 會拿 payment 的 value 來回覆, 所以可以在 'resources/lang/en/validation.php' 檔案中自定義, 若 input payment_type 的 value 為 cc, 則在 error message 終將之轉換為 credit card


# Available Validation Rules

# accepted

Laravel validation 中, 如果我要驗證一個 input 的 value 必須是 yes, on, 1, 或 true, 那我可以使用哪一個 rule?

accepted

# active_url

Laravel validation 中, 如果我要驗證一個 input 的 value 必須是一個 url, 經過 DNS 正解之後必須是 A 或 AAAA record, 我可以使用哪一個 rule?

active_url

# after:date

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    'start_date' => 'required|date|after:tomorrow'
  • Answer:
    input start_date 必須 present 及 filled, 須符合 date format, 且日期需在明天之後
以下的 Laravel validation example code 的意思是?
  • 第一個 input validation:
    <?php
    'finish_date' => 'required|date|after:start_date'
  • Answer:
    'finish_date' 為 required, 格式需為 date, 且日期需在 'start_date' 這個 input 之後

# after_or_equal:date

以下的 Laravel validation example code 的意思是?
  • Example:
    <?php
    'start_date' => 'required|date|after_or_equal:tomorrow'
  • Answer:
    'start_date' 為 required, 格式需為 date, 且需為明天或明天之後的日期

# alpha

Laravel 中, 如果我要驗證一個 input 單純由字母所組成, 我可以使用哪一個 validation rule?

alpha


# alpha_dash

Laravel 中, 如果我驗證一個 input 只可含有 字母, 數字, -_, 我可以使用哪一個 validation rule?

alpha_dash


# alpha_num

Laravel 中, 如果我驗證一個 input 只可含有 字母, 數字, 我可以使用哪一個 validation rule?

alpha_num


# array

Laravel 中, 如果我要驗證一個 input 必須是一個 array, 我可以使用哪一個 validation rule?

array


# before:date

Laravel 中, 如果我要驗證一個 input 必須是在某個指定的日期之前, 我可以使用哪一個 validation rule?

before:date


# before_or_equal:date

Laravel 中, 如果我要驗證一個 input 必須是相等於某個指定的日期, 或在這個日期之前, 那我可以使用哪一個 validation rule?

before_or_equal:date


# between:min,max

Laravel 中, 如果我要驗證一個 input 必須是介於兩個數值之間, 這兩個數值可以是 string, number, array 或 files, 我可以使用哪一個 validation rule?

between:min,max


# boolean

Laravel 中, 如果我要驗證一個 input 必須是 boolean, 即 true, false, 1, 0, "1", 或 "0", 那我可以使用哪一個 validation rule?

boolean


# confirmed

Laravel 中, 如果我在 password input 使用了 confirmed rule, 那我必須還要有另外一個 input 的名稱叫做什麼?

password_confirmation

Laravel 中, 如果我想要驗證兩個 input 必須有一模一樣的 value, 舉例來說, 讓用戶輸入密碼以及再次輸入密碼來確保用戶沒有不小心輸入錯誤, 那我可以使用哪一個 validation rule?

confirmed


# date

Laravel 中, 如果我要驗證一個 input 必須是 non-relative 的日期格式, 那我可以使用哪一個 validation rule?

date


# date_equals:date

Laravel中, 如果我要驗證一個 input 必須是一個日期且需與指定的日期相同, 那我可以使用哪一個 validation rule?

date_equals:date


# date_format:format

Laravel 中, 如果我要驗證一個 input 需跟我指定的日期格式相同, 那我可以使用哪一個 validation rule?

date_format:format

Laravel validation rule 當中, date_format 與 date 可否混用?

不可


# different:field

Laravel validation 中, 如果我要驗證兩個 input 的 value 必須要是不同的, 那我可以使用哪一個 validation rule?

different:field


# digits:value

Laravel 中, 如果我要驗證一個 input 必須是 numeric, 且需與指定的位數一樣, 不可負數, 那我可以使用哪一個 validation rule?

digits:value

Laravel validation rule 中, digits:value 這個 rule 可否含有小數點?

不可

Laravel validation rule 中, digits:value 這個 rule 可否含有負數?

不可


# digits_between:min,max

Laravel 中, 如果我要驗證一個 input 必須為 numeric, 且長度須介於我指令的兩個 value, 那我可以使用哪一個 validation rule?

digits_between:min,max


# dimensions

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    dimensions:min_width=minWidth,max_width=maxWidth,min_height=minHeight,max_height=maxHeight,ratio=ratio1/ratio2
  • Answer:
    定義 input image 須符合的最小寬度, 最大寬度, 最小高度, 最大高度, 以及長寬比
以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    dimensions:width=width,height=height
  • Answer:
    定義 input image 須符合的寬度, 高度
以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2)
  • Answer:
    使用 Rule class 的 dimensions() 來定義最大寬度, 最大高度, 以及長寬比

# distinct

Laravel 中, 假如我要驗一個 input, 這個 input 是一個 array, 我要確保 array 下的 field 的 value 必須不可重複, 舉例來說, foo array 下 不同 element 的 id field 的 value 必須不可相同, 我可以使用哪一個 validation rule?

distinct


# email

Laravel 中, 如果我要驗證一個 input, 其 value 必須是 email 格式, 我可以使用哪一個 validation rule?

email

Laravel 中, 可以使用不同的規則驗證 email 嗎?

可以, 可參考官方文件

Laravel 中, validation email rule 預設使用哪一個 validation?

RFCValidation


# ends_with:foo,bar,…

Laravel 中, 如果我要驗證 input 必須是指定的 value 結尾, 我可以使用哪一個 validation rule?

ends_with


# exclude_if:anotherfield,value

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    exclude_if:anotherfield,value
  • Answer:
    當另外一個指定的 field 的 value 為某值, 排除此 input 的驗證

# exclude_unless:anotherfield,value

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    exclude_unless:anotherfield,value
  • Answer:
    除非指定的 field 的 value 為某值, 否則一律排除此 input 的驗證

# exists:table,column

Laravel 中, 如果我要驗證一個 input, 這個 input 必須存在於指定的 table 中的指定 column, 那我可以使用哪一個 validation rule?

exists:table,column

Basic Usage Of Exists Rule
以下的 Laravel validation rule 當中, 什麼情況之下可以不需指定 column 名稱?
  • validation rule:
    <?php
    'state' => 'exists:states'
  • Answer:
    當 input 的 field 名稱跟 column 一樣時
Specifying A Custom Column Name
以下的 Laravel validation rule 當中, abbreviation 代表的是?
  • validation rule:
    <?php
    'state' => 'exists:states,abbreviation'
  • Answer:
    指定該 table 中的 column
以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    'email' => 'exists:connection.staff,email'
  • Answer:
    input email 的 value 需存在於 database connection, table staff, column email
Laravel 中, exists validation rule 可以指定 model 來代替 table name 嗎?

可以哦

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    'user_id' => 'exists:App\User,id'
  • Answer:
    使用 model name 代替 table name
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($data, [
    'email' => [
    'required',
    Rule::exists('staff')->where(function ($query) {
    $query->where('account_id', 1);
    }),
    ],
    ]);
  • Answer:
    input email 的 value 需存在於 table staff, 條件 where(‘account_id’, 1) 的 column email 當中

# file

Laravel 中, 如果我要驗一個 input 必須是 file, 那我可以使用哪一個 validation rule?

file


# filled

Laravel 中, 如果我要驗一個 input, 內容不可為 empty, 我可以使用哪一個 validation rule?

filled


# gt:field

Laravel 中, 如果我要驗一個 input, 其 value 必須大於另外一個指定的 input, 我可以使用哪一個 validation rule?

gt:field


# gte:field

Laravel 中, 如果我要驗一個 input, 其 value 必須大於或等於另外一個指定的 input, 我可以使用哪一個 validation rule?

gte:field


# image

Laravel 中, 如果我要驗一個 input, 其 value 必須是一個 image, 即 jpeg, png, bmp, gif, svg, webp, etc…, 我可以使用哪一個 validation rule?

image


# in:foo,bar,…

Laravel 中, 如果我要驗一個 input, 其 value 必須要被你指定的 value list 包含在內, 那我可以使用哪一個 validation rule?

in:foo,bar,…

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

    Validator::make($data, [
    'zones' => [
    'required',
    Rule::in(['first-zone', 'second-zone']),
    ],
    ]);
  • Answer:
    指定 input ‘zones’ 的 value 必須為 ‘first-zone’, 或 ‘second-zone’, 同資料庫中 enum type 的概念
Laravel 中, 如果我要使用 Rule 來定義一個 in 規則, 我可以怎麼做?

# in_array:anotherfield.*

Laravel 中, 如果我要驗證一個 input, 其 value 必須被 另外一個 input 的 value 包含在內, 所以說另外一個 input 的 value 可能會是一個 array, 那我可以使用哪一個 validation rule?

in_array:anotherfield.*


# integer

Laravel 中, 如果我要驗一個 input, 其 value 必須是一個 integer, 我可以使用哪一個 validation rule?

integer

Laravel 中, validation rule integer, 會去驗證 input 的型別是否是 integer 嗎?

不會

Laravel 中, validation rule integer, 實際上是驗證什麼?

string 或是有著 數字的 string, 換句話說, 若是全數字的 string 也算通過


# ip

Laravel 中, 如果我要驗一個 input 是否一個 IP address, 我可以使用哪一個 validation rule?

ip


# ipv4

Laravel 中, 如果我要驗一個 input, 其 value 是否符合 IPv4 address 格式, 我可以使用哪一個 validation rule?

ipv4


# ipv6

Laravel 中, 如果我要驗一個 input, 其 value 是否符合 IPv6 address 格式, 我可以使用哪一個 validation rule?

ipv6


# json

Laravel 中, 如果我要驗一個 input, 其 value 是否為一個 json 字串, 我可以使用哪一個 validation rule?

json


# lt:field

Laravel 中, 如果我要驗一個 input, 其 value 必須小於另外一個指定的 input, 我可以使用哪一個 validation rule?

lt:field


# lte:field

Laravel 中, 如果我要驗一個 input, 其 value 必須小於或等於另外一個指定的 input, 我可以使用哪一個 validation rule?

lte:field


# max:value

Laravel 中, 如果我要驗一個 input, 其 value 必須 小於或等於 一個指定的 value, 那我可以使用哪一個 validation rule?

max:value


# mimetypes:text/plain,…

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
  • Answer:
    驗證 input video 的 minetypes
Laravel 中, 當我使用 validation rule minetypes 時, 框架會真正去讀這個檔案嗎?

會哦

Laravel 中, 當我使用 validation rule minetypes 時, 有可能框架驗到的跟 client 提供的 minetypes 不同嗎? 為什麼?
  • 會哦
  • 因為框架會自己去讀檔案, 不會以 client 提供的為依據
Laravel 中, validation rule minetypes, 是會比對實際上框架讀的 minetypes, 還是讀到 minetypes 之後再去取得相對應得副檔名

實際上框架讀的 minetypes


# mines:foo,bar

Laravel 中, 如果我要驗一個 input, 其 value 必須要是我指定的 minetype 相對應的副檔名, 那我可以使用哪一個 validation rule?

mines:foo,bar,…

Laravel 中的 validation rule mines 會去呼叫哪一個 method?

guessExtension

Laravel 中的 validation rule mines 會去呼叫 guessExtension, 然後 guessExtension 會去呼叫哪一個 method?

getMineType

Laravel 中的 validation rule mines 會去讀檔案內容以判斷其 minetypes 嗎?

會的

哪裡可以找到 minetype 以及其相對應的 extension?

文件


# min:value

Laravel 中, 如果我要驗證一個 input, 其 value 必須大於或等於我所指定的一個值, 那我可以使用哪一個 validation rule?

min:value


# not_in:foo,bar,…

Laravel 中, 如果我要驗一個 input, 其 value 不可被包含在我所提供的一個 list 當中, 即該 list 可以是一個 array, 那我可以使用哪一個 validation rule?

not_in:foo,bar,…

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

    Validator::make($data, [
    'toppings' => [
    'required',
    Rule::notIn(['sprinkles', 'cherries']),
    ],
    ]);
  • Answer:
    使用 Rule class 的定義 notIn rule, input toppings 的 value 不可為 sprinkles 或 cherries

# not_regex:pattern

Laravel 中, 如果我要驗一個 input, 其 value 不可符合我所定義的 regex pattern, 那我可以使用哪一個 validation rule?

not_regex:pattern

Laravel 中, 當我使用 not_regexregex 預設 validation rule 時, 該使用 array 形式, 還是 pipe 形式?

array, 如下 example:

  • Example:
    <?php
    $validatedData = $request->validate([
    'password' => ['required', 'regex:^(?=.*[a-z]|.*[A-Z])(?=.*[\d])(?=.*[\W])[\w@$%\^&]{8,16}$'],
    ]);
Larevel 的 validation rule regex 以及 not_regex, 其格式須符合 PHP 的哪一個 function?

preg_match


# numeric

Laravel 中, 如果我要驗一個 input, 其 value 需為 numeric, 那我可以使用哪一個 validation rule?

numeric

Laravel validation rule 中的 numeric 跟 integer 差別在哪?

numeric 可以有小數點, integer 為整數


# password

Laravel 中, 如果我要驗一個 input, 其 value 必須可以通過登入者的 password 驗證, 那我可以使用哪一個 validation rule?

password

Laravel 的 validation rule password 可否指定 guard? 怎麼做?
  • 'password' => 'password:api'

# present

Laravel 中, 如果說我要驗一個欄位必須要出現在 request 的 input list 裡, 至於有沒有 value 的話不管, 那我可以使用哪一個 validation rule?

present


# required

Laravel 中, 如果我要驗一個 input, 該欄位必須要出現在 input data 之中, 且欄位的值不可為 null, 那我可以使用哪一個 validation rule?

required

Laravel validation rule required 中, 欄位在哪四種情況下會被視為 “empty”?
  • The value is null.
  • The value is an empty string.
  • The value is an empty array or empty Countable object.
  • The value is an uploaded file with no path.
Laravel 中, required 的驗證條件是?
  • input data 中必須要有該欄位
  • 該欄位不可為 null
以下的 Laravel validation example code 的意思是?
  • Example:
    <?php
    present:field_name
  • Answer:
    input data 中必須要有該欄位就可, 欄位是否為空不驗
Laravel 中, filled 的驗證條件是?
  • input data 中如果有出現的欄位, 其欄位不可為 empty, 如果沒出現則不管

# required_if:anotherfield,value,…

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    required_if:anotherfield,value,...
  • Answer:
    如果 anotherfield 的 value 為某值時, require 此 input
Laravel 中, 如果我使用 Rule class 來定義 required_if, 那 requiredIf method 接受什麼樣的 arguments?
  • boolean
  • closure
Laravel 中, 如果我使用 Rule class 來定義 required_if, 並且帶入 closure, 那 closure 的輸出必須要是什麼型別?

boolean

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

    Validator::make($request->all(), [
    'role_id' => Rule::requiredIf($request->user()->is_admin),
    ]);
  • Answer:
    如果 $request->user()->is_admin 為 true 的話, 就 require input role_id, 也可帶入 closure
以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($request->all(), [
    'role_id' => Rule::requiredIf(function () use ($request) {
    return $request->user()->is_admin;
    }),
    ]);
  • Answer:
    如果 $request->user()->is_admin 為 true 的話, 就 require input role_id, 也可在 requiredIf() 內直接帶入 $request->user()->is_admin

# required_unless:anotherfield,value,…

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    required_unless:anotherfield,value,..
  • Answer:
    一律 require input, 除非 anotherfield 的 value 為某值

# required_with:foo,bar,…

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    required_with:foo,bar,...
  • Answer:
    require input 當指定的 field present

# required_with_all:foo,bar,…

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    required_with_all:foo,bar,...
  • Answer:
    require input 當指定的 fields 全部都有 present

# required_without:foo,bar,…

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    required_without:foo,bar,...
  • Answer:
    如果指定的 field 沒有 present, 那就 require input

# required_without_all:foo,bar,…

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    required_without_all:foo,bar,...
  • Answer:
    如果指定的 field 全部都沒有 present, 則 require input

# same:field

Laravel 當中, 如果我要驗一個 field, 其 value 必須跟我指定的另外一個 field 的 value 是一樣的, 那我可以使用哪一個 validation rule?

same:field


# size:value

Laravel 當中, 如果我要驗一個 field, 其 value 的 size 必須要跟我指定的相同, 那我可以使用哪一個 validation rule?

size:value

Laravel validation rule size:value 中, 如果 input 是 string, 那 value 會是?

string 的字元數目

Laravel validation rule size:value 中, 如果 input 是 integer, 那 value 會是?

integer 的值

Laravel validation rule size:value 中, 如果 input 是 array, 那 value 會是?

array 的 count

Laravel validation rule size:value 中, 如果 input 是 files, 那 value 會是?

files 的大小

Laravel validation rule size:value 中, 如果 input 是 files, 那 value 會是 files 大小, 以什麼為單位?

kilobytes

# starts_with:foo,bar,…

Laravel 中, 如果我要驗一個 field, 其 value 必須要是指定的 value 開頭, 那我可以使用哪一個 validation rule?

starts_with:foo,bar,…


# string

Laravel 當中, 如果我要驗一個 field, 其 value 必須是不可為 null 的 string, 那我可以使用哪一個 validation rule?

string


# timezone

Laravel 當中, 如果我要驗一個 input, 其 value 必須是一個可被 PHP function timezone_identifiers_list 驗證合法的 timezone, 那我可以使用哪一個 validation rule?

timezone


# unique:table,column,except,idColumn

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    unique:table,column,except,idColumn
  • Answer:
    input 的 value 必須不存在於指定的 table, column
    arg3 為 except, arg4 為 except 的 column, 預設為 id 可不帶
    比如說, unique:users,name,ray@example.com,email, 這樣就會用 unique rule 去驗 users table 的 name column, 但略過 email column 為 ray@example.com 的 row
Specifying A Custom Table / Column Name:
Laravel validation rule unique 中, 除了指定 table 之外, 我可否指定 model?

Laravel validation rule unique 中, 什麼樣的條件之下我可以不需指定 column ?

當我 input 的 field name 跟 column name 一樣時

Custom Database Connection
以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    'email' => 'unique:connection.users,email_address'
  • Answer:
    指定 database 為 connection
Forcing A Unique Rule To Ignore A Given ID:
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users')->ignore($user->id),
    ],
    ]);
  • Answer:
    'email' value 在 users table, email column 中需為 unique, 但忽略 $user->id 的 row
以下的 Laravel example 中, ignore() 的 parameter 可以從 request 直接取得嗎?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users')->ignore($user->id),
    ],
    ]);
  • Answer:
    不可, 為避免 SQL injection, 若要帶入 Request 的 attributes 那要先 sanitise
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users')->ignore($user),
    ],
    ]);
  • Answer:
    'email' value 在 users table, email column 中需為 unique, 但忽略 $user->id 的 row, 預設會尋找 id, 所以可直接帶入 $user model
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users')->ignore($user->id, 'user_id'),
    ],
    ]);
  • Answer:
    'email' value 在 users table, email column 中需為 unique, 但忽略 $user->id 的 row, 此 example 中 primary key column 不叫 id, 而是叫 user_id
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Validation\Rule;

    Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users', 'email_address')->ignore($user->id, 'user_id'),
    ],
    ]);
  • Answer:
    'email' value 在 users table, email column 中需為 unique, 此 example 中, email column 實際名稱為 'email_address', 若是跟 input 相同的話 arg2 可省略。
    忽略 $user->id 的 row。
    此 example 中 primary key column 不叫 id, 而是叫 user_id
Adding Additional Where Clauses
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    'email' => Rule::unique('users')->where(function ($query) {
    return $query->where('account_id', 1);
    })
  • Answer:
    'email' input 的 value 在 users table, email column, where(‘account_id’, 1) 的篩選後的 records 中, 需為 unique

# url

Laravel 中, 如果我要驗一個 input, 其 value 必須要是一個 url, 那我可以使用哪一個 validation rule?

url


# uuid

Laravel 中, 如果我要驗一個 input, 其 value 必須要是一個 uuid, 那我可以使用哪一個 validation rule?

uuid



# Conditionally Adding Rules

# Validating When Present

Laravel 中, 如果我要驗一個 input, 如果該 input 有出現在 request 的 input array 中的話我才驗, 若是不存在我就不驗, 那我可以使用哪一個 validation rule?

sometimes

以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    $v = Validator::make($data, [
    'email' => 'sometimes|required|email',
    ]);
  • Answer:
    required rule 會驗證該 input 必須要 present 且 filled, 但若是使用 sometimes rule, 當該 input 不存在時, 後面的 rule 都不會實施

# Complex Conditional Validation

請解釋以下的 Laravel 程式碼的語意?
  • 程式碼
    <?php
    $v->sometimes('reason', 'required|max:500', function ($input) {
    return $input->games >= 100;
    });
  • Answer:
    如果 closure 的 return 值為 true, 就驗 reason 這個 input, rule 為 required|max:500
以下的 Laravel example code 的意思是?
  • 程式碼
    <?php
    $v->sometimes(['reason', 'cost'], 'required|max:500', function ($input) {
    return $input->games >= 100;
    });
  • Answer:
    當 closure return true, 驗證 'reason', 'cost' input, 使用 'required|max:500' rule
以下的 Laravel 程式碼中, $input 是哪一個 class 的 instance?
  • 程式碼
    <?php
    $v->sometimes('reason', 'required|max:500', function ($input) {
    return $input->games >= 100;
    });
  • Answer:
    Illuminate\Support\Fluent


# Validating Arrays

Laravel validation 當中, 如果說 photos 是一個 array, 我要驗證該 photos 裡 key 為 profile 的 value, 該 value, 規則為 required|image, 那我可以怎麼做?
<?php
$validator = Validator::make($request->all(), [
'photos.profile' => 'required|image',
]);
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $validator = Validator::make($request->all(), [
    'person.*.email' => 'email|unique:users',
    'person.*.first_name' => 'required_with:person.*.last_name',
    ]);
  • Answer:
    (1) 對 person array 下的每一個 element 中的 email 驗證
    (2) 對 person array 下的每一個 element 中的 first_name 驗證, 且當前 element 下需有 last_name 我才驗 required rule


# Custom Validation Rules

Laravel 中, 如果我要客製 validation rule 的話, 有哪幾種方式?
  • rule object
  • closure
  • extensions

# Using Rule Objects

Laravel 中, 如果我要使用 CLI 建立一個 rule, 指令該怎麼下?
php artisan make:rule RuleName
以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App\Rules;

    use Illuminate\Contracts\Validation\Rule;

    class Uppercase implements Rule
    {

    public function passes($attribute, $value)
    {
    return $value === 1;
    }

    public function message()
    {
    return 'The :attribute must be uppercase.';
    }
    }
  • Answer:
    $passes() 需 return boolean, 代表該 rule 驗證通過與否
    $message() 為驗證失敗時, 錯誤訊息
    $attribute 為 input name
    $value 為 input value
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function message()
    {
    return trans('validation.uppercase');
    }
  • Answer:
    客製 error message, 從自定義的 translation file 中取得 error message
以下的 Laravel Validation example code 的意思是?
  • Example:
    <?php
    use App\Rules\Uppercase;

    $request->validate([
    'name' => ['required', 'string', new Uppercase],
    ]);
  • Answer:
    使用自定義的 rule Uppercase

# Using Closures

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $validator = Validator::make($request->all(), [
    'title' => [
    'required',
    'max:255',
    function ($attribute, $value, $fail) {
    if ($value === 'foo') {
    $fail($attribute.' is invalid.');
    }
    },
    ],
    ]);
  • Answer:
    定義一個 closure based validation rule
    $attribute 等於 input name, 即 ‘title’
    $value 等於 input value
    $fail 裡頭是 error message

# Using Extensions

Laravel 中, 請解釋以下的 extension example
  • Example:
    <?php

    namespace App\Providers;

    use Illuminate\Support\ServiceProvider;
    use Illuminate\Support\Facades\Validator;

    class AppServiceProvider extends ServiceProvider
    {
    public function register()
    {
    //
    }

    public function boot()
    {
    Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
    return $value == 'foo';
    }, 'The value must be foo');
    }
    }
  • Answer:
    在 AppServiceProvider 的 boot method 中, 使用 validator class 的 extend method 來定義新的 validation rule
    # 1. 新的 validation rule 名稱為 foo
    # 2. $attribute 為 input 名稱
    # 3. $value 為 input value
    # 4. $parameters 為一個 array, 可帶入 rule 的參數
    # 5. $validator 為 Validator instance
    # 6. extend() 的第三個 argument 可自訂 error message
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Validator::extend('foo', 'FooValidator@validate');
  • Answer:
    當使用 validator class 的 extend method 自定義新的 validation rule 時, 也可指定 controller 來取代 closure

# Defining The Error Message

Laravel 中, 當我使用 extension 來自定義 validation rule 時, 我可以經 Error Message 定義在 language validation file 的哪一層中?

第一層

Laravel 中, 當我使用 extension 來自定義 validation rule 時, 我可以經 Error Message 定義在 language validation file 的第一層, 為什麼不是定義在 custom 層下?

因為這是一個新的 rule 的 message, 不是 attribute-specific message

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function boot()
    {
    Validator::extend(...);

    Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
    return str_replace(array(':value', ':other'), $parameters, $message);
    });
    }
  • Answer:
    在 AppServiceProvider 中, 針對 validation extend rule ‘foo’ 做佔位符帶入, 比方說, $message = ‘The :value must be greater than :other’, 而 $parameter 便可以是一個 array([‘price’, ‘cost’]), 因此錯誤訊息會是 ‘The price must be greater than cost’

# Implicit Extensions

以下的 Laravel validation example 的結果會是 true 還是 false? Why?
  • Example:
    <?php
    $rules = ['name' => 'unique:users,name'];

    $input = ['name' => ''];

    Validator::make($input, $rules)->passes();
  • Answer:
    true, 因為 rule 對於沒有 present 的 attribute, 或值為 empty string 的 attribute 不會生效
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
    return $value == 'foo';
    });
  • Answer:
    Laravel 預設不會執行 rule, 當 attribute 沒有出現在 input array list, 除了使用 required 之外, 可使用 extendImplicit method 強制執行
以下的 Laravel example code 中, implement ImplicitRule 的意思是?
  • Example:
    <?php
    class CheckMerchantChannelValidForAssigning implements ImplicitRule
    {

    protected $withdraw;

    public function __construct(Withdraw $withdraw)
    {
    $this->withdraw = $withdraw;
    }

    public function passes($attribute, $value)
    {
    return in_array($value,
    MerchantChannel::ofSuitableForAssigningToWithdraw($this->withdraw)->get()->pluck('id')->toArray());
    }

    public function message()
    {
    return 'The merchant channel is invalid';
    }

    }

  • Answer:
    當使用 Laravel validation rule object 時, 如果驗證對象 attribute 沒有出現在 input array list 當中的話, Laravel 預設不會執行這個 rule, 那如果我要強制執行該 rule, implement implicitRule 可以強制執行該 rule

# Additional

Laravel 當中, 以下的 agent_id 驗證 exists 邏輯代表什麼意思?

在 users table 當中, 帶入的 agent_id 必須要跟 table 裡頭的 id 相同, 且 role_id 必須得跟 Role::AGENT 相同

<?php
request()->validate([
'q' => 'nullable | string | max:255',
'row' => 'nullable | int | digits_between:1,3',
'agent_id' => 'nullable | exists:users,id,role_id,'.Role::AGENT,
]);
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    class SendReviewRequest extends Request
    {
    public function rules()
    {
    return [
    'reviews' => ['required', 'array'],
    'reviews.*.id' => [
    'required',
    Rule::exists('order_items', 'id')->where('order_id', $this->route('order')->id)
    ],
    'reviews.*.rating' => ['required', 'integer', 'between:1,5'],
    'reviews.*.review' => ['required'],
    ];
    }
    }
  • Answer:
    在 request 中, 可以使用 $this->route 取得 route parameter 中的 order model
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $v = new Validator(
    $trans,
    [
    'foo' => 'true',
    'bar' => 'aaa'
    ],
    [
    'foo' => 'accepted_if:bar,aaa'
    ]
    );

    $this->assertTrue($v->passes());
  • Answer:
    使用 accepted_if, 如果 bar field 為 aaa, 則 foo 需為 accepted
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Password::min(8)

    Password::min(8)->letters()

    Password::min(8)->mixedCase()

    Password::min(8)->numbers()

    Password::min(8)->symbols()
  • Answer:
    <?php
    // require 至少 8 個 characters
    Password::min(8)

    // require 至少一個字母
    Password::min(8)->letters()

    // require 至少一個大寫字母一個小寫字母
    Password::min(8)->mixedCase()

    // require 至少一個 number
    Password::min(8)->numbers()

    // require 至少一個特殊符號
    Password::min(8)->symbols()

    // 產生的密碼必須沒有被曝光過
    Password::min(8)->uncompromised()
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // 任一 service provider
    use Illuminate\Validation\Rules\Password;

    public function boot()
    {
    Password::defaults(function () {
    $rule = Password::min(8);

    return $this->app->isProduction()
    ? $rule->mixedCase()->uncompromised()
    : $rule;
    });
    }

    'password' => ['required', Password::defaults()],
  • Answer:
    註冊 default password rule
<未完成> 命令行的藝術 Laravel - The Basics - Middleware (官方文件原子化翻譯)

留言

Your browser is out-of-date!

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

×