7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-14

経緯

  • 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:

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?