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

Laravel Fortify 如何基于数据库配置动态启用特性并注册对应路由

问题根因

Laravel 服务提供者的执行顺序为:先全局执行所有服务提供者的 register 方法,再按注册顺序执行所有服务提供者的 boot 方法。Fortify 的路由注册逻辑封装在它自身服务提供者的 boot 方法中,你之前将动态修改配置的代码放在 AppServiceProvider::boot() 或者自定义 FortifyServiceProvider::boot() 中,执行时机晚于 Fortify 自身的 boot 阶段,路由注册时读取的还是修改前的配置,所以动态开启的功能路由不会被加载。

解决方案

方案一:调整配置修改时机(推荐)

将动态配置逻辑移到自定义 Fortify 服务提供者的 register 方法中,通过 booting 回调确保配置修改在 Fortify 路由注册前完成:

<?php

namespace App\Providers;

use Laravel\Fortify\Features;
use Laravel\Fortify\FortifyServiceProvider as ServiceProvider;

class FortifyServiceProvider extends ServiceProvider
{
    public function register()
    {
        parent::register();

        $this->app->booting(function () {
            $features = (array)config('fortify.features');

            if (setting_bool('user_registration')) {
                $features[] = Features::registration();
            }
            if (setting_bool('verify_email')) {
                $features[] = Features::emailVerification();
            }
            if (setting_bool('two_factor')) {
                $features[] = Features::twoFactorAuthentication();
            }

            config()->set('fortify.features', $features);
        });
    }

    public function boot()
    {
        // 原有Fortify自定义逻辑保留在这里
        parent::boot();
    }
}

同时确认 config/app.php 的 providers 数组中,你自定义的 App\Providers\FortifyServiceProvider 已经替换掉官方的 Laravel\Fortify\FortifyServiceProvider。

方案二:手动注册路由

如果调整服务提供者顺序后仍有问题,可以直接在路由文件中手动加载对应功能的路由:

// 放在 routes/web.php 顶部
use Laravel\Fortify\Features;

if (Features::enabled(Features::registration())) {
    require base_path('vendor/laravel/fortify/routes/registration.php');
}
if (Features::enabled(Features::emailVerification())) {
    require base_path('vendor/laravel/fortify/routes/email-verification.php');
}
if (Features::enabled(Features::twoFactorAuthentication())) {
    require base_path('vendor/laravel/fortify/routes/two-factor-authentication.php');
}

注意事项

修改完成后执行以下命令清空缓存:

php artisan config:clear
php artisan route:clear

如果是生产环境需要重新缓存配置和路由,确保动态修改的配置被正确读取。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:54:02