最近 Laravelで学んでること

最近 Laravelでお仕事させてもらっていて、その中で学んだこと、疑問に思ったこと、調べてみたこと、コードレビューで指摘受けて気づけたことなどを書きます。Laravelでどういうことをやってるときの話なのかって部分をもう少しいうと、ざっくりですが「ユーザーを招待して登録する」みたいな機能を作ってる時の話。(書いてることは、あまり関係なさそう。とりあえず、最近やってることです。)

(1)Laravelでパスワードを二回入れて確認する confirmed validation

同じ値を確認用で2回入力する際のバリーデーションについて。パスワードじゃなくても、xxxx_confirmationフィールドでチェックしてくれる。Postする際の処理をのバリデーションをフォームリクエストに定義する。(フォームリクエストで、バリデーションを作るの、なぜかよく忘れてしまう)

公式ドキュメント バリデーション 5.5 Laravel

confirmed フィールドがそのフィールド名+_confirmationフィールドと同じ値であることをバリデートします。例えば、バリデーションするフィールドがpasswordであれば、同じ値のpassword_confirmationフィールドが入力に存在していなければなりません。

class StoreRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'password' => 'required|confirmed|max:60',
        ];
    }

    /**
     * 定義済みバリデーションルールのエラーメッセージ取得
     *
     * @return array
     */
    public function messages()
    {
        return [
            'password.required' => 'パスワードの入力は必須です',
            'password.confirmed' => 'パスワードが異なります',
        ];
    }
}

www.nyamucoro.com

(2)viewのデザインのために<br> 使ったら負け。bootstrapだと mt-2 mb-2 とかのmargin増やすutilityあるのでそれ使うと良い。

getbootstrap.com

(3)既にログイン済みだったら〇〇するって処理を、guest middleware(Laravel標準で準備されてるmiddleware)を参考にかく

ログイン済みかログイン済みじゃないかの場合で、処理を分けたいとき、例えば、ユーザー登録で、既にログイン済みだったら、〇〇へリダイレクトして欲しい、という処理が書きたい。Laravel標準で、認証済みかどうか判定し、認証済みの場合は/homeにリダイレクトする、guestというミドルウェアが用意されるので、これを参考にした。独自のミドルウェアを作るときは、

こういう流れだと思っているんだけど、Http/Kernel.phpに登録する、ルーティングに登録する、あたりをちゃんと整理できていないので、ミドルウェアについては、改めて整理したい。登録したミドルウェアをどの処理に適用させるのかっていうあたりを特に整理したい。

(4)コントローラー側のコードで、POSTの処理後に、viewを返すのか、redirectするのか、ちょっと悩んでる。

例えば、「ユーザー登録して、登録完了しました」というページを表示したい場合、POSTのリクエストを処理するアクションがviewを返してくれるように書くのか、完了しました表示してくれるページを返すアクションを別途作って、そこにリダイレクトしてくれる方が良いのかっていうところで悩んだ。今回は、POSTの処理で完了しましたのviewを返すようにしたけど、こういう部分で迷った場合の判断基準がわかっていないので、調べてみる。また、ちょっと話がずれるかもしれないけど、今回この処理を最初redirectするように書いていて、その場合に、例えば、POSTの処理で持っている情報(変数)をredirect先に引き継ぐには、どうしたら良いかってところですごく悩んだりした。sessionに投入して、取り出すみたいな感じでその場合はやったけど、sessionをむやみやたらに使うのはバグの温床なので慎重にしないといけないということだった。postの処理で使ったデータをそのままviewで使いたい場合に、postアクションでviewを返すようにするって感じなのかな。

(5)Sessionにデータを突っ込むのは慎重にする

sessionにデータを突っ込むのは慎重にしないとバグの温床になるので、注意する。バグの温床になる、理由をちゃんと理解できていない気がするので、この部分をもう少し勉強する。sessionに定義される変数を追うのが難しいというか、他の人がコード書くときに、sessionに変数が定義されてることを想定してコード書かないだろうから、影響する可能性があってあまりよくない、ってことかな?それで、sessionを使う場合については、flashを使って、次回1回切りでsessionにデータを突っ込むようにするのが良い(消えるのが保証されている)

例 e$request->session()->flash('user', $user);

公式ドキュメント HTTPセッション 5.5 Laravel

フラッシュデータ

次のリクエスト間だけセッションにアイテムを保存したいことは良くあります。flashメソッドを使ってください。flashメソッドは直後のHTTPリクエストの間だけセッションにデータを保存します。それ以降は削除されます。フラッシュデータは主にステータスメッセージなど継続しない情報に便利です。

(6)ランダムな値の生成方法

ググって見つけたやつ。メモ

substr(base64_encode(md5( mt_rand() )), 0, 30);

(7)Scope

where('xxx', 'yy') みたいに書いてるのを、モデル側でメソッド書くようにして、それを呼び出すようにして、コード読みやすい感じにする

(8)バリデーション(FormRequest)

バリデーションを書く場所いつもどこだっけってなるけど、基本的にPOSTのリクエストするときは、フォームリクエストを作ってバリデーションするようにする。

(9)self::creating データ登録時に自動的にデータを登録するようにする

Railsでいうbefore_createみたいなのを作る。(コントローラー側の責務を減らす)

qiita.com

qiita.com

qiita.com

まとめ

基本的なことばかりっぽいけど、すぐ忘れちゃうので、自分の理解の整理のために書いた。もっとちゃんと理解したいやつがまだまだあるので、次は以下の内容を整理したやつ書く。

  • フォームリクエストのバリデーションの理解を整理する
  • ミドルウェアの理解を整理する
  • 認可の処理についての理解を整理する