Laravelには標準で「パスワードリセット」という機能が用意されているが実装しにくい。
というか、僕だけかもしれないけど、用意されているいくつかの機能は「無理やり」用意しました感があって、その機能を使うには、その機能が動くように従いまくって実装する必要がある。
だったら、自分の実装の仕方で自作した方が後で見返しても分かりやすくていいのではないかと思い、我流の実装を残しておこうと思う。
※あくまで僕のクセや実装方法での自作なので、人それぞれの実装方法があると思います。
パスワード忘れた人用に↓こんなフォームを用意しておき、メールアドレスを入力し送信ボタンが押されると、メールアドレス存在チェックのバリデーションを行い、存在していたらランダム文字列でパスワードを更新し、そのパスワードを入力されたメールアドレスに送信する。
メールアドレス存在チェックを行うため、リクエストクラスを作る。
app/Http/Requests/User/ForgotRequest.php
<?php
namespace App\Http\Requests\User;
use Illuminate\Foundation\Http\FormRequest;
use App\Rules\User\PasswordExistsRule;
class ForgotRequest extends FormRequest
{
private $email;
public function authorize()
{
return true;
}
public function all($keys = null)
{
$results = parent::all($keys);
$this->email = $results['email'];
return $results;
}
public function rules()
{
return [
'email' => [
'required',
'email',
new PasswordExistsRule(
$this->email
)
],
];
}
public function attributes()
{
return [
'email' => 'メールアドレス',
];
}
}
メールアドレス存在チェックを行うルールを作る。
app/Rules/User/PasswordExistsRule.php
<?php
namespace App\Rules\User;
use App\Models\Member;
use Illuminate\Contracts\Validation\Rule;
class PasswordExistsRule implements Rule
{
private $email;
public function __construct($email)
{
$this->email = $email;
}
public function passes($attribute, $value)
{
if(!Member::where('email', $this->email)->first()) return false;
return true;
}
public function message()
{
return 'そのメールアドレスは登録されていません';
}
}
コントローラを実装する。
app/Http/controllers/User/ForgotController.php
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\User\ForgotRequest;
use App\Models\Member;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Hash;
class ForgotController extends Controller
{
public function index()
{
return view('user.forgot.index');
}
public function send(ForgotRequest $request)
{
$email = $request->input('email');
$password = Str::random(8);
$member = Member::where('email', $email)->first();
$member->password = Hash::make($password);
$member->save();
// メール送信する
return view('user.forgot.complete',
compact(
'password'
)
);
}
}
無理やりLaravelに従わなくてもこんなんで良くない??