【Laravel8】CRUD機能でfill($request->all())だとパスワードが平文で保存されてしまう。

はい、今回はパスポートをハッシュ化させる方法を紹介します。

CRUD機能においてcreate,update等情報を更新、作成することがありますが、ユーザー情報だとパスポートがある場合がありますよね。

その保存方法を紹介しますね。

伝えたいこと: 効率的なrequest保存とパスワードのハッシュ化

正直、一つ一つリクエストを保存しくこともできるんですが、効率的にできるだけ短いコードでハッシュ化させたいなあと思います。

なので、この記事の目的はできるだけ短いコードでパスワードをハッシュ化させて、requestを保存することです。

課題: ハッシュ化はできるけど、効率的に書く方法がわからない

requestの保存方法としては以下の二つがあると思います。

  1. 一つ一つ保存していく方法。
    ただ、これだとカラムが増えたときに修正が必要だったりして管理コストがかかる。
use App\Http\Requests\User\UpdateUserRequest;
use Illuminate\Support\Facades\Hash;

//(FormRequestでバリデーションをしている)
public function update(UpdateUserRequest $request, $id)
{

    //対象ユーザを見つけてリクエストを保存する。
    $user = User::find($id);

    //ユーザーの保存
    $user->fill([
        $user->name = $request->name,
        $user->email = $request->email,
        $user->password = Hash::make($request->password),
    ])->save();

    return response()->json([
        'success' => true,
        'message' => 'Update Success!',
        'details' => User::find($id)
    ]);
}Code language: PHP (php)

FormRequestを使ってバリデーションをする方法は以下

  1. 一気にリクエストを保存する方法
    ただこれだとパスポートが平文で保存される。
use App\Http\Requests\User\UpdateUserRequest;

//(FormRequestでバリデーションをしている)
public function update(UpdateUserRequest $request, $id)
{

    //対象ユーザを見つけてリクエストを保存する。
    $user = User::find($id);

    //ユーザーの保存
    $user->fill($reqeust->all())->save();

    return response()->json([
        'success' => true,
        'message' => 'Update Success!',
        'details' => User::find($id)
    ]);
}Code language: PHP (php)

fill()を使って一気に保存する方法は以下

ということでこの二つをいい感じにしたようにコードを書きたいわけです。

1だとたくさん書かないといけないから管理がめんどくさいよね~
2だと平文でパスワードが保存されるんよな…

解決方法: array_merge()を使う。

【Laravel5】パスワードハッシュ化をどこで行うべきか←を見てみると解決方法が記載されていたので参考にしてみよう。

ということで、array_merge()を使うことで解決できるようだ。

ソースを書いてみるぞ!

use App\Http\Requests\User\UpdateUserRequest;
use Illuminate\Support\Facades\Hash;

public function update(UpdateUserRequest $request, $id)
{
    $user = User::find($id);

    //requestにパスワードが含まれていれば、ハッシュ化してリクエストを更新する。
    //パスワードがない場合はそのままリクエストの更新を行う。
    if ($request->password) {
        $user->fill(array_merge($request->all(),
            ['password' => Hash::make($request->password)]
        ))->save();
    }else{
        $user->fill($request->all())->save();
    }

    //jsonでユーザー情報を返す
    return response()->json([
        'success' => true,
        'message' => 'Update Success!',
        'details' => User::find($id)
    ]);
}
Code language: PHP (php)

これでどうだー

なんでifで分岐しているのかというと、リクエストをrequiredがない場合はこんな書き方になるかと思う!
passwordが入っている時には、array_merge()を使ってハッシュ化させて保存。passwordが入力されていないのにハッシュ化させたらパスワードが変更したくないのに変更しちゃうからこんな書き方になった!

というわけでいい感じに使いこなした感が出たな。

成功だー!

こうして書くことでソースがシンプルになったはず!OKOKOK

↓を使いまわせばOK!なはず!!!!

 $user->fill(array_merge($request->all(),
    ['password' => Hash::make($request->password)]
))->save();Code language: PHP (php)

まとめ

調べたら大体やりたいことは載っているな。ということでggr力が大切なようだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA