首页 > 解决方案 > Laravel:如何处理在不同包的应用程序提供程序中设置的 ResetPassword::createUrlUsing?

问题描述

在我的Laravel API 中,我有两个包my-packages/foomy-packages/bar. 每一个都与一个 SPA 前端(foo.combar.com)相关,并有自己的身份验证保护(api:fooapi:bar)和用户提供者(users:foousers:bar)。

用户通过Laravel Passport Password Grant Token从 SPA 登录。

要为每个 SPA 设置密码恢复,我已将其添加到以下boot()方法中FooServiceProvider.php

ResetPassword::createUrlUsing(function ($notifiable, $token) {
    return config('foo.reset_password_url') .  $token;
});

再次在BarServiceProvider.php

ResetPassword::createUrlUsing(function ($notifiable, $token) {
    return config('bar.reset_password_url') .  $token;
});

现在,当我调用两条路由(foo/forgot-passwordbar/forgot-password)中的任何一条时,发送重置链接方法总是发送以下恢复地址foo

Route::post('foo/forgot-password', function (Request $request) {
  $request->validate(['email' => 'required|email']);
  Password::sendResetLink(
    $request->only('email')
  );
);

我应该如何解决这个问题?

标签: laravel

解决方案


我通过移动ResetPassword::createUrlUsing到 main找到了解决方法AppServiceProvider

public function boot()
{
    ResetPassword::createUrlUsing(function ($notifiable, $token) {
        $link = match (request()->path()) {
            'foo/forgot-password' => config('foo.reset_password_url') . $token,
            'bar/forgot-password' => config('bar.reset_password_url') . $token,
            default => null
        };
        return $link;
    });
}

虽然它不是很优雅,但我希望每个包都管理自己的密码重置过程。

编辑

这甚至可以这样简化:

public function boot()
{
    ResetPassword::createUrlUsing(function ($notifiable, $token) {
        return config(request()->segment(1) . '.reset_password_url') . $token;
    });
}

推荐阅读