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

如何禁用Laravel Pennant数据库缓存并实时计算特性标志

无需数据库,用Laravel Pennant实时计算特性标志的方案

当然可以,Laravel Pennant本身就支持不依赖数据库、实时计算特性状态的用法,下面是几种实用方案:

1. 直接用闭包定义特性(最推荐)

这是最简单的实时计算方式,你可以在服务提供者里直接为特性定义实时判断逻辑,每次调用特性检查时都会执行这段逻辑,完全跳过数据库存储。

在App\Providers\AppServiceProvider的boot方法中添加:

use Laravel\Pennant\Feature;
use App\Models\User;

public function boot()
{
    // 定义"新支付流程"特性,实时计算是否启用
    Feature::define('new_payment_flow', function (?User $user = null) {
        // 示例逻辑:管理员默认开启,或者请求带参数临时开启
        if ($user?->hasRole('admin')) {
            return true;
        }

        // 根据请求参数临时触发
        return request()->query('enable_new_payment') === '1';
    });

    // 另一个示例:根据环境变量控制
    Feature::define('beta_features', function () {
        return app()->environment('staging', 'local');
    });
}

之后调用Feature::active('new_payment_flow')或者在Blade中使用@feature('new_payment_flow')时,都会实时执行闭包内的逻辑得出结果。

2. 使用Array驱动(无持久化存储)

Pennant提供了array驱动,它将特性状态存储在内存中,不会写入数据库。如果需要每次请求都重新初始化状态,也能实现实时计算的效果。

首先修改config/pennant.php配置:

return [
    'default' => 'array',

    'stores' => [
        'array' => [
            'driver' => 'array',
        ],
        // 保留其他驱动(如database)但不设为默认
    ],
];

然后同样可以通过Feature::define定义实时逻辑,或者在服务提供者中动态设置状态(每次请求都会重置数组存储):

Feature::activate('new_payment_flow', function (User $user) {
    return $user->isPremium();
});

3. 自定义驱动(复杂场景)

如果你的实时逻辑需要更灵活的封装,比如整合外部配置中心或自定义规则引擎,可以自定义Pennant驱动。

创建一个实现Laravel\Pennant\Contracts\Store接口的驱动类:

namespace App\Pennant;

use Laravel\Pennant\Contracts\Store;
use App\Models\User;

class RealTimeFeatureStore implements Store
{
    public function get(string $feature, mixed $scope = null): mixed
    {
        // 在这里实现你的实时计算逻辑
        return match ($feature) {
            'new_payment_flow' => $this->checkNewPaymentFlow($scope),
            'beta_features' => app()->environment('staging'),
            default => false,
        };
    }

    // 辅助方法:实现具体特性的判断逻辑
    private function checkNewPaymentFlow(mixed $scope): bool
    {
        if ($scope instanceof User) {
            return $scope->hasRole('admin');
        }
        return request()->has('enable_new_payment');
    }

    // 其他接口方法(如set、forget等)可以留空,因为不需要持久化
    public function set(string $feature, mixed $value, mixed $scope = null): void {}
    public function forget(string $feature, mixed $scope = null): void {}
    public function flush(mixed $scope = null): void {}
    public function all(mixed $scope = null): array { return []; }
}

然后在AppServiceProvider的register方法中注册这个驱动:

use Laravel\Pennant\PennantManager;
use App\Pennant\RealTimeFeatureStore;

public function register()
{
    $this->app->extend(PennantManager::class, function (PennantManager $manager) {
        $manager->extend('real-time', fn ($app) => new RealTimeFeatureStore());
        return $manager;
    });
}

最后在config/pennant.php中设置默认驱动为real-time即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:51:30