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

Laravel Auth::routes()本地化前缀分组后密码重置异常解决方案咨询

解决Laravel本地化路由下密码重置链接缺失locale参数的问题

问题分析

将Auth::routes()包裹在带{locale}前缀的路由组后,密码重置功能抛出UrlGenerationException,原因是Laravel默认的密码重置逻辑生成链接时,不会自动传递locale这个必填路由参数。

解决方案

方案1:全局设置路由默认参数(推荐)

通过在服务提供者中设置路由参数的默认值,让Laravel生成所有路由时自动带上当前locale,无需在每个路由生成时手动传递。

修改app/Providers/AppServiceProvider.php的boot方法:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        // 全局设置locale路由参数的默认值为当前应用语言
        URL::defaults(['locale' => app()->getLocale()]);
    }

    // ... 其他方法
}

这样处理后,无论是视图中手动生成路由,还是Laravel内部(如密码重置)生成路由,都会自动填充locale参数,无需额外修改认证逻辑。

方案2:自定义密码重置通知类

如果不想全局设置默认参数,可以通过自定义密码重置通知,在生成重置链接时手动添加locale参数。

  1. 生成自定义通知类:
php artisan make:notification CustomResetPasswordNotification
  1. 修改自定义通知的toMail方法,添加locale参数:
<?php

namespace App\Notifications;

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class CustomResetPasswordNotification extends Notification
{
    protected $token;

    /**
     * Create a new notification instance.
     */
    public function __construct(string $token)
    {
        $this->token = $token;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @return array<int, string>
     */
    public function via(object $notifiable): array
    {
        return ['mail'];
    }

    /**
     * Get the mail representation of the notification.
     */
    public function toMail(object $notifiable): MailMessage
    {
        $resetUrl = route('password.reset', [
            'locale' => app()->getLocale(),
            'token' => $this->token,
            'email' => $notifiable->getEmailForPasswordReset(),
        ]);

        return (new MailMessage)
            ->subject('Password Reset Request')
            ->line('You are receiving this email because we received a password reset request for your account.')
            ->action('Reset Password', $resetUrl)
            ->line('If you did not request a password reset, no further action is required.');
    }
}
  1. 在User模型中重写sendPasswordResetNotification方法,使用自定义通知:
<?php

namespace App\Models;

use App\Notifications\CustomResetPasswordNotification;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    // ... 其他属性和方法

    /**
     * Send the password reset notification.
     *
     * @param  string  $token
     * @return void
     */
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new CustomResetPasswordNotification($token));
    }
}

总结

  • 方案1实现简单,全局生效,适合整个应用路由都依赖locale参数的场景。
  • 方案2更灵活,仅针对密码重置流程修改,适合不需要全局设置默认参数的场景。

内容的提问来源于stack exchange,提问作者Eric Xyz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:03:27