新規登録時のみ、パスワードを必須とする例。
Route::prefix('user')->name('user.')->group(function(){
Route::get('', 'UserController@index')->name('home');
Route::get('create', 'UserController@create')->name('create');
Route::get('{user}/edit', 'UserController@edit')->name('edit');
Route::post('{user?}', 'UserController@store')->name('store');
});
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
# models
use App\Models\User;
# requests
use App\Http\Requests\UserRequest;
class UserController extends Controller
{
public function store(User $user, UserRequest $request)
{
if (is_null($user->id)) {
$user = new User();
}
$user->fill($request->all());
// パスワードの入力があった場合のみ暗号化して保存
if (!is_null($request->password)
&& strlen($request->password) > 0
) {
$user->password = bcrypt($request->password);
}
$user->save();
return redirect(route('user.home'));
}
}
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'bail|required|max:100',
'email' => 'bail|required|max:255|email:strict',
'password' => [
'bail',
// $this->user が null ならば必須
Rule::requiredIf(is_null($this->user ?? false)),
'between:8,32',
],
];
}
public function prepareForValidation()
{
// 「全角」英数字を「半角」に変換
$this->merge(['email' => mb_convert_kana($this->email, 'a')]);
$this->merge(['password' => mb_convert_kana($this->password, 'a')]);
}
public function attributes()
{
return [
'name' => '名前',
'email' => 'メールアドレス',
'password' => 'パスワード',
];
}
}