laravel

LaravelのFormRequestでinputのデータを整形する

経緯

  • Controller内でinputデータ加工してからモデルに渡していてどこかに移したかった
  • FormRequestをバリデーションの為だけに使うのがなんだかしっくり来なかった(JWTAuth使ってたので認証はミドルウェア側で対応していた)

前提

  • Laravel5.5
  • JWTAuthを利用したログイン処理

実装内容

まず、FormRequestをこんな感じにします。
※credentialsにinputのデータを整形するメソッドを書いてます

AuthenticateLogin
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AuthenticateLogin extends FormRequest
{
    public function authorize()
    {
        // 認証はミドルウェアで行っているのでここではTrueを返す
        return true;
    }

    public function rules()
    {
        return [
            'email' => 'required',
            'password' => 'required'
        ];
    }

    /**
     * Requestから認証に必要なデータを返す
     *
     * @return array
     */
    public function credentials()
    {
        $credentials = $this->only('email', 'password');

        // 入力されたメールアドレスにドメインが含まれていなければ付加する
        if ($credentials['email'] && strpos($credentials['email'],'@') === false) {
            $credentials['email'] .= '@' . env('MAIL_DOMAIN');
        }

        return $credentials;
    }
}

次に、ControllerではFormRequestのメソッドを呼び出して$credentialsを取得します。

AuthenticateController
<?php

namespace App\Http\Controllers;

use \Auth;
use JWTAuth;
use App\Http\Requests\AuthenticateLogin;
use App\Services\AuthenticateService;

class AuthenticateController extends Controller
{
    /**
     * ログイン
     * 
     * @param AuthenticateLogin $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(AuthenticateLogin $request)
    {
        // リクエストから必要な情報のみを取得
        $credentials = $request->credentials();

        if (!$token = AuthenticateService::auth($credentials)) {
            return response()->json(['errors' => ['auth' => 'auth error']], 401);
        }

        $user = Auth::user();

        return response()->json(compact(['user', 'token']));
    }
}

さいごに

JWTAuthに直接渡す為ドメインモデルに書けなかったってこともあり今回の実装方法になったのですが、 こっちのほうが良くない? みたいなのがありましたらコメント頂けますと幸いです:bow: