Labs

<< 最初 < 前ページ 次ページ > 最後 >>
icon try-catch で Exception検知 (2019/08/09)
try-catch でエラー検出する場合、namespace内でException を待ち受けするため「 Exception」と記述する必要がある。

Laravel の QueryException を検知する場合

    use  Illuminate Database QueryException;
....
    public function store(Request $request)
    {
        try {
            $user = new User;
            $user->fill($request->all())->save();
        } catch ( QueryException $e) {

        }
    }
QueryException
icon FormRequest を利用したバリデーション (2019/08/09)
入力フォームからの Request をバリデートする。
FormRequest を利用すると Controller に処理を記述しなくても事前にバリデートしてくれる。

FormRequestファイルの生成

$ php artisan make:request UserStoreRequest
app/Http/Requests/ にファイルが作成される
class UserStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; //デフォルトで false になっている
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        //バリデートのルールを記述
        return [
            'name' => ['required', 'min:3', 'max:64', 'unique:users'],
            'email' => ['required', 'min:4', 'max:255', 'unique:users'],
            'password' => ['required', 'min:4', 'max:16'],
        ];
    }

    public function messages(){
        //rules に対応したメッセージを記述
        return [
            'name.required'  => '名前を入力してください。',
            'name.min'       => '名前は3文字以上で入力してください',
            'name.max'       => '名前が長すぎます',
            'name.unique'       => '名前は既に登録されています',
            'email.required'=> 'Emailを入力してください。',
            'email.min'     => 'Emailが短かすぎます',
            'email.max'     => 'Emailが長すぎます',
            'email.unique'       => 'Emailは既に登録されています',
            'password.required'=> 'パスワード入力してください。',
            'password.min'     => 'パスワードは4文字以上で入力してください',
            'password.max'     => 'パスワードは32文字以内で入力してください',
        ];
    }
}

Controller 設定

引数のクラスを Request から UserStoreRequest に変更すると FormRequest が自動的にバリデート処理をする
validate エラーが発生すると、即時に全画面にリダイレクトする
    public function store(UserStoreRequest $request)  //UserStoreRequest にクラス名を変更
    {
        //UserStoreRequest で validate エラーが発生すると、以降の処理は実行されない
        $request->session()->put('request', $request->all());
        try {
            User::create($request->validated());
            return redirect('user');
        } catch (QueryException $e) {
            return back()->withInput();
        }
    }

Blade でエラー表示

FormRequest で発生したエラーは、自動バインドされた $errors で記述する。
@if (count($errors) > 0)
<ul>
  @foreach ($errors->all() as $error)
  <li>{{ $error }}</li>
  @endforeach
</ul>
@endif

自分自身を除外する

UPDATE で 自分自身はユニークを除外する必要がある場合、Rule::unique() を利用する。
    use Illuminate Validation Rule;
    .....
    public function rules()
    {
        return [
            'name' => [
                'required', 'min:3', 'max:64',
                Rule::unique('users')->ignore($this->id),
            ],
            'email' => [
                'required', 'min:4', 'max:255',
                Rule::unique('users')->ignore($this->id),
            ]
        ];
    }
icon namespaceを利用したルートグループ化 (2019/08/08)
Middlewareを利用したルートグループ化と異なり、処理を実装しないルーティングに便利ネームスペースを省略できる

namespaceファイルの生成

Controllers/namespace/Controllerファイル を作成し、namespaceを設定
例として、App/Http/Controllers/Sample を namespace
namespace App\\Http\\Controllers\\Sample;

use App\\Http\\Controllers\\Controller;
use Illuminate\\Http\\Request;

class SampleController extends Controller
{

    public function index(Request $request)
    {
        $data = ['msg' => 'Sample index'];
        return view('hello.index', $data);  #hello/index.blade.php を作成済
    }

    public function other(Request $request)
    {
        $data = ['msg' => 'Sample Other'];
        return view('hello.index', $data);  #hello/other.blade.php を作成済
    }

}

ルート設定

namespace() でグループ化し、各ルートを設定
Route::namespace('Sample')->group(function() {
    Route::get('/sample', 'SampleController@index');
    Route::get('/sample/other', 'SampleController@other');
});
<< 最初 < 前ページ 次ページ > 最後 >>