Laravel Fortify:如何替换注册控制器的CreatesNewUsers实现类
替换Laravel Fortify注册中的CreatesNewUsers实现类
问题场景
我正在使用Laravel Fortify实现用户注册功能,系统包含多种用户类型。当前注册路由配置如下:
Route::post( RoutePath::for('register', '/register'), [RegisteredUserController::class, 'store'] )->middleware(['auth.already:'.config('fortify.guard')]);
注册控制器的store方法代码如下:
public function store(Request $request, CreatesNewUsers $creator): RegisterResponse { if (config('fortify.lowercase_usernames')) { $request->merge([ Fortify::username() => Str::lower($request->{Fortify::username()}), ]); } event(new Registered($user = $creator->create($request->all()))); $this->guard->login($user); return app(RegisterResponse::class); }
希望替换该方法中的$creator参数为自定义实现类,但未找到官方指引,特此求助。
解决方案
1. 创建自定义用户创建类
新建App\Actions\Fortify\CreateCustomUser类,实现Laravel\Fortify\Contracts\CreatesNewUsers接口,在create方法中编写你的用户类型处理逻辑:
namespace App\Actions\Fortify; use Laravel\Fortify\Contracts\CreatesNewUsers; use App\Models\User; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\ValidationException; class CreateCustomUser implements CreatesNewUsers { use PasswordValidationRules; public function create(array $input) { // 从请求参数中获取用户类型,按需调整字段名 $userType = $input['user_type'] ?? 'default'; // 自定义验证规则,包含用户类型校验 validator($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => $this->passwordRules(), 'user_type' => ['required', 'string', 'in:admin,editor,viewer'], // 定义允许的用户类型 ])->validate(); // 根据用户类型创建用户,可添加自定义字段逻辑 return User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), 'user_type' => $userType, // 其他业务字段 ]); } }
2. 绑定接口到自定义实现
在App\Providers\FortifyServiceProvider的register方法中,通过Laravel服务容器将接口绑定到你的自定义类:
namespace App\Providers; use Laravel\Fortify\Fortify; use Illuminate\Support\ServiceProvider; use Laravel\Fortify\Contracts\CreatesNewUsers; use App\Actions\Fortify\CreateCustomUser; class FortifyServiceProvider extends ServiceProvider { public function register() { // 替换默认的CreatesNewUsers实现 $this->app->bind(CreatesNewUsers::class, CreateCustomUser::class); } // 保留原有的boot方法及其他逻辑 public function boot() { Fortify::registerView(function () { return view('auth.register'); }); // 其他Fortify配置... } }
3. 验证效果
完成以上配置后,当RegisteredUserController的store方法依赖注入CreatesNewUsers时,Laravel会自动使用你定义的CreateCustomUser类执行用户创建逻辑,无需修改控制器代码。
注意事项
- 确保自定义类严格实现
CreatesNewUsers接口的create方法,方法必须接收数组参数并返回用户模型实例。 - 如果需要针对不同用户类型执行额外操作(比如分配角色、创建关联模型),都可以在
create方法中扩展。 - 若表单需要选择用户类型,记得在注册视图中添加对应的输入字段,并同步调整验证规则。
内容的提问来源于stack exchange,提问作者NeebletWorm
相关产品推荐
相关产品推荐

