Laravel控制器自动生成password_url随机字符串失败求助
问题分析与解决方案
你的问题出在:虽然把password_url添加到了$request对象中,但后续的$request->validate()只会返回验证规则里包含的字段,password_url不在验证规则里,所以$validated数组里没有这个字段,最终User::create($validated)也就不会把它写入数据库。
另外必须确认你的User模型的$fillable属性已经包含password_url,这是Laravel批量赋值的必要条件,否则即使数组里有该字段也无法写入。
下面是几种可行的解决方法:
方法一:直接合并到验证后的数组(最直接)
在验证完成后,把随机生成的password_url直接加到$validated数组里,再执行创建操作:
public function RegistrationStore(Request $request) { $validated = $request->validate([ "first_name" => ['required'], 'last_name' => ['required'], 'stable_id' => ['required'], 'post_id' => ['required', 'in:2,3,4,5'], 'email' => ['required', 'email', Rule::unique('users', 'email')], ]); // 直接添加字段到验证后的数组 $validated['password_url'] = Str::random(10); $user = User::create($validated); return redirect('/login')->with('message', 'registration successful.'); }
方法二:修改验证规则,包含password_url
如果你坚持要通过$request传递这个字段,可以在验证规则里加入password_url并设置为nullable(因为不需要表单提交,允许字段不存在,但我们手动添加了值):
public function RegistrationStore(Request $request) { $random_string = Str::random(10); $request->request->add(['password_url' => $random_string]); $validated = $request->validate([ "first_name" => ['required'], 'last_name' => ['required'], 'stable_id' => ['required'], 'post_id' => ['required', 'in:2,3,4,5'], 'email' => ['required', 'email', Rule::unique('users', 'email')], 'password_url' => ['nullable'], // 加入这行规则 ]); $user = User::create($validated); return redirect('/login')->with('message', 'registration successful.'); }
方法三:使用模型事件(更优雅,解耦控制器逻辑)
在User模型中添加creating事件,当用户被创建时自动生成password_url,这样控制器不需要做任何修改:
// app/Models/User.php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class User extends Model { protected $fillable = [ 'first_name', 'last_name', 'stable_id', 'post_id', 'email', 'password_url', // 务必包含这个字段 ]; protected static function boot() { parent::boot(); // 创建用户前自动生成password_url static::creating(function ($user) { $user->password_url = Str::random(10); }); } }
关键注意点:无论用哪种方法,都要确保User模型的$fillable数组包含password_url,否则Laravel的批量赋值保护会阻止该字段被写入数据库。
内容的提问来源于stack exchange,提问作者Blitzkriegfest
相关产品推荐
相关产品推荐

