You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:56:31