基于用户属性实现Laravel Spark Stripe v5.0套餐条件显示
Laravel Spark v5.0 基于用户性别实现套餐条件展示方案
1. 为套餐添加性别关联元数据
在app/Providers/SparkServiceProvider.php的boot方法中,给每个套餐绑定对应性别标识:
public function boot() { parent::boot(); // 男性套餐配置 Spark::plan('男性套餐', 'stripe-male-plan-id') ->price(10) ->features([ '专属男性服务', '每月10次权益' ]) ->metadata(['gender' => 'male']); // 女性套餐配置 Spark::plan('女性套餐', 'stripe-female-plan-id') ->price(5) ->features([ '专属女性服务', '每月15次权益' ]) ->metadata(['gender' => 'female']); }
2. 过滤套餐数据(两种可选实现方式)
方式一:后端视图Composer自动过滤
在app/Providers/AppServiceProvider.php的boot方法中添加视图Composer,提前过滤出当前用户匹配的套餐:
use Illuminate\Support\Facades\View; use Laravel\Spark\Spark; public function boot() { View::composer('spark::settings.billing.subscribe', function ($view) { $currentUser = auth()->user(); // 筛选与用户性别匹配的套餐 $filteredPlans = Spark::plans()->filter(function ($plan) use ($currentUser) { return $plan->metadata['gender'] === $currentUser->gender; }); $view->with('plans', $filteredPlans); }); }
方式二:直接修改视图文件做判断
先发布Spark视图到本地:
php artisan vendor:publish --tag=spark-views
打开resources/views/vendor/spark/settings/billing/subscribe.blade.php,在遍历套餐的代码块中添加性别校验:
@foreach ($plans as $plan) {{-- 仅展示与当前用户性别匹配的套餐 --}} @if($plan->metadata['gender'] === auth()->user()->gender) <div class="col-md-4"> <div class="card mb-4"> <div class="card-header">{{ $plan->name }}</div> <div class="card-body"> <h4 class="card-title">${{ $plan->price }} / 月</h4> <ul class="list-unstyled mt-3 mb-4"> @foreach ($plan->features as $feature) <li class="mb-2"> <i class="fa fa-check text-success"></i> {{ $feature }} </li> @endforeach </ul> <button class="btn btn-lg btn-primary btn-block" onclick="subscribe('{{ $plan->id }}')"> 立即订阅 </button> </div> </div> </div> @endif @endforeach
3. 前置校验
确保users表存在gender字段(建议存储male/female字符串值),且用户注册或资料编辑时已正确设置该字段。
内容的提问来源于stack exchange,提问作者Nihilarian
相关产品推荐
相关产品推荐

