一番シンプルなやり方はコントローラーに次のように記述します
public function confirm( Request $request )
{
$validation_rule = [
"name_sei" => 'required' ,
];
// バリデーション(エラーがある場合は前の画面に戻ります)
$this->validate( $request, $validation_rule );
}
1. パイプでつなぐ記法
'item_id' => 'required|integer',
2. 配列記法 (正規表現で | を使用したい時はこちら。)
'item_id' => ['required', 'integer'] ,
'name' => ['required','regex:{^[^/]+$}'] ,
'hogehoge_date' => 'nullable|date', // 日付( null を許す )
'hogehoge_time' => 'date_format:H:i', // 時間( 12:40 や 07:05 などのフォーマット)
// regex を使用する時は array() を使用しましょう。 | が正規表現の文字として使えるようになります。
'hogehoge_time2' => array( 'regex:{((0?[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))}' ) , // 分( 00 〜 59 または 0 〜 59 )
'hogehoge_id' => 'nullable|integer', // 数字( null を許す )
'hogehoge_tax_no' => 'required_if:withtax_flg,0', // 条件( withtax_flg が 0 の時は hogehoge_tax_no 必須 )
'price_initial_no' => 'required_unless:mt_payment_id,21', // 条件( mt_payment_id が 21以外 の時は price_initial_no 必須 )
'grade_no' => 'required_with:school_id', // 条件( school_id に値がある時 grade_no 必須。条件となるカラムはカンマ区切りで複数指定可 )
'send_flg' => 'integer|in:0,1' , // 0 または 1 の数値
'year_month_name' => ['required','regex:{^[0-9]+/[0-9]+$}'] , // 正規表現 2019/12 のような表記にマッチするか?
'email' => 'required|email|confirmed', // 必須 , メールアドレス , 「email_confirmation」にも同じ値が入っているかチェック
'password' => 'nullable|confirmed', // nullを許す, 「password_confirmation」にも同じ値が入っているかチェック
'name' => ['required','regex:{^[^/]+$}'] , // 入力文字列にスラッシュを含めない
'password' => 'required|min:4', // 4文字以上
// rule
$validation_rule['confirmations'] = [ 'required', function($attribute, $value, $fail) use ($confirmations_count) {
if ( $confirmations_count !== count($value) ){
return $fail('確認事項全てにチェックをつけてください');
}
}
];
// message
$validation_message = [
'confirmations.required' => '確認事項にチェックをつけてください',
];
チェックが一つも入っていない時は required のエラー「確認事項にチェックをつけてください」が表示されます
全てにチェックが入っていない時は クロージャー のエラー「確認事項全てにチェックをつけてください」が表示されます
テーブル users の中に同じ email で登録がある場合はバリデーションエラーとしたい、場合は次のように記述します
'email' => 'unique:users'
↑ 上の記述は不完全で、データ更新(update)の時に自分自身のメールアドレスもエラーとしてしまいます。
そこで、自分自身は除外するように次のように記述します。
// update時の validation
$this->validation_column['email'] = [ 'required',
\Illuminate\Validation\Rule::unique('users')->ignore($id),
];
// 同じ shop_id の中で email はユニーク
$this->validation_column['email'] = [ 'required', \Illuminate\Validation\Rule::unique('users')->where(function ($query) use ($q) {
return $query->where('shop_id', $q['shop_id']);
}) ];
// バリデーション実行
$this->validate($request, $this->validation_column);
次のように記述すると新規登録時と更新時の 登録ずみのメールアドレス除外 バリデーションをまとめて登録することができます。
// 事前にモデルの $id を取得しておきます。
$id = xxxxxxxxxxxxxxxxxx;
$this->validation_column = [
'email' => 'required|email|unique:users,email' . ($id > 0 ? ",{$id}" : ''),
'password' => ($id > 0 ? '' : 'required|') . 'min:4|confirmed',
];
独自のバリデーションルールを適用したい時、バリデーションルールを動的に変更したいときなどは FormRequest を使用すると、バリデーション部分が外に出るのでコントローラーがすっきりします。
UsersRequest という フォームリクエストを作成します
php artisan make:request UsersRequest
app/Http/Requests/UsersRequest.php が自動作成されます。
例として shop_id と email をチェックしてユニークかどうかを判定するバリデーションを記述してみます
app/Http/Requests/UsersRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UsersRequest extends FormRequest
{
/**
* 認証のロジックを記述する場合はここに記述する。
* それ以外は常に true を返すように記述しておかないとバリデーションが動作しないので return true; とする。
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* バリデーションルールを記述
*
* @return array
*/
public function rules()
{
return [
"shop_id" => 'required' ,
"email" => [ 'required', 'email', 'confirmed',
\Illuminate\Validation\Rule::unique('users')->ignore($this->input('id'))->where(function($query) {
// 入力されたshop_idの値と同じ値を持つレコードでのみ検証する
$query->where('shop_id', $this->input('shop_id'));
}),
] ,
];
}
}
public function confirm( Request $request )
{
$validation_rule = [
"name_sei" => 'required' ,
];
// バリデーション(エラーがある場合は前の画面に戻ります)
$this->validate( $request, $validation_rule );
}
↓
/**
* ユーザー登録確認
*
* \App\Http\Requests\UsersRequest による自動バリデーションが行われる(エラーの場合は前の画面に戻される)
*
*/
public function confirm( \App\Http\Requests\UsersRequest $request )
{
これでOKです。コントローラーにバリデーションの記述が一切なくなりました。 コメントはどこかに記述しておくとよいでしょう。
@php
dump( $errors );
@endphp
emailパラメーターのエラーを表示させるには
@include('partial.error_message', ['param_name' => 'email'])
Bootstrapの場合
@if($errors->has($param_name))
<div class="text-danger small" style="flex-wrap: wrap;">{{ $errors->first($param_name) }}</div>
@endif
Tailwind CSSの場合
@error('email')
<div class="text-red-500 text-xs absolute mt-1">{{ $message }}</div>
@enderror
old を使用します。
<input type="text" placeholder="" name="email" required value="{{ old('email') }}">
https://twitter.com/juandmegon/status/1274134701800919040?s=21
use Illuminate\Support\Str;
/**
* バリーデーションのためにデータを準備
*
* @return void
*/
protected function prepareForValidation()
{
$this->merge([
'slug' => Str::slug($this->slug),
]);
}
https://pgmemo.tokyo/data/archives/1952.html
$validation_rule = [
'last_name' => 'required',
];
$validation_message = [
'last_name.required' => '名前は必ず入力してください',
];
$this->validate( $request, $validation_rule, $validation_message );