Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
EnsureFeatureEnabled
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 handle
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace App\Http\Middleware;
4
5use App\Http\Services\FeatureFlagService;
6use Closure;
7use Illuminate\Http\Request;
8
9/**
10 * Route-level feature flag gate.
11 *
12 * Short-circuits the request with a 404 when the named flag resolves to
13 * false. 404 (not 403) is intentional: to clients without access, a dark
14 * feature should look like it doesn't exist — not like it's forbidden.
15 *
16 * Usage (route alias `feature.enabled`):
17 *
18 *     Route::middleware('feature.enabled:roleplay.corporate_personas')->group(…);
19 */
20class EnsureFeatureEnabled
21{
22    public function __construct(
23        private readonly FeatureFlagService $flags,
24    ) {}
25
26    /**
27     * Handle an incoming request.
28     *
29     * @param  Request  $request
30     * @param  Closure  $next
31     * @param  string  $flagKey  The dot-namespaced feature flag key
32     * @return mixed
33     */
34    public function handle(Request $request, Closure $next, string $flagKey)
35    {
36        if (! $this->flags->enabled($flagKey)) {
37            return response()->json(['error' => 'Not Found'], 404);
38        }
39
40        return $next($request);
41    }
42}