# Detection Checklist
Every dimension here is a genuine fork: Laravel offers two or more valid approaches, the app's choice changes what the next agent writes, and no active project tool can pick for you. Left out on purpose: pure formatting (Pint owns it), any form an installed and enabled Rector rule rewrites to one canonical shape (___SINGLE_BACKTICK___$casts___SINGLE_BACKTICK___ to ___SINGLE_BACKTICK___casts()___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___$fillable___SINGLE_BACKTICK___ to attributes, pipe-string rules to arrays, named to anonymous migrations, ___SINGLE_BACKTICK___$signature___SINGLE_BACKTICK___ to ___SINGLE_BACKTICK___#[Signature]___SINGLE_BACKTICK___), and framework defaults any agent writes unprompted (___SINGLE_BACKTICK___ShouldQueue___SINGLE_BACKTICK___ jobs, relation return types, ___SINGLE_BACKTICK___HasFactory___SINGLE_BACKTICK___).
Each item gives the fork, then a hint (a grep or dir to spot which side the app takes). Hints are only a start. Read the matched files, never record on a raw count. Apply the ground rules to every verdict: a consistent choice that is a default or a tool's target form is not a pattern. Rows tagged (architecture) are the highest-signal, so record presence and deliberate absence.
---
## A. Validation & HTTP input
1. Validation entry point: inline ___SINGLE_BACKTICK___$request->validate()___SINGLE_BACKTICK___ vs Form Request classes vs ___SINGLE_BACKTICK___Validator::make()___SINGLE_BACKTICK___.
- Hint: ___SINGLE_BACKTICK___ls app/Http/Requests___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___->validate(___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___Validator::make(___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Http/Controllers___SINGLE_BACKTICK___.
2. Custom rule location: invokable rule objects in ___SINGLE_BACKTICK___app/Rules___SINGLE_BACKTICK___ vs inline closures vs ___SINGLE_BACKTICK___Validator::extend()___SINGLE_BACKTICK___ in a provider. Rule objects are the default ___SINGLE_BACKTICK___make:rule___SINGLE_BACKTICK___ path, so record only if the app leans on closures or ___SINGLE_BACKTICK___Validator::extend___SINGLE_BACKTICK___ instead. "No rule objects" alone is just no-signal.
- Hint: ___SINGLE_BACKTICK___ls app/Rules___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___Validator::extend___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Providers___SINGLE_BACKTICK___.
3. Typed input retrieval: typed getters (___SINGLE_BACKTICK___$request->string()___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___->integer()___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___->enum()___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___->date()___SINGLE_BACKTICK___) vs raw ___SINGLE_BACKTICK___$request->input()___SINGLE_BACKTICK___ / dynamic properties.
- Hint: grep ___SINGLE_BACKTICK___->string(___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___->integer(___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___->enum(___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___->input(___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Http___SINGLE_BACKTICK___.
4. Custom messages/attributes: ___SINGLE_BACKTICK___lang/*/validation.php___SINGLE_BACKTICK___ vs Form Request ___SINGLE_BACKTICK___messages()___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___attributes()___SINGLE_BACKTICK___ methods.
- Hint: ___SINGLE_BACKTICK___ls lang___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___function messages___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___function attributes___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Http/Requests___SINGLE_BACKTICK___.
## B. Controllers & routing
5. Controller shape: invokable single-action (___SINGLE_BACKTICK_____invoke___SINGLE_BACKTICK___) vs resource controllers vs plain multi-method.
- Hint: grep ___SINGLE_BACKTICK_____invoke___SINGLE_BACKTICK___ in controllers; ___SINGLE_BACKTICK___Route::resource___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___apiResource___SINGLE_BACKTICK___ vs verb routes.
6. Business-logic location (architecture): fat controllers vs delegated to Actions / Services / Jobs.
- Hint: read a few controller methods; ___SINGLE_BACKTICK___ls app/Actions app/Services___SINGLE_BACKTICK___.
7. Route handler style: closures in ___SINGLE_BACKTICK___routes/*.php___SINGLE_BACKTICK___ vs controller classes.
- Hint: count ___SINGLE_BACKTICK___function ()___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___::class___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___routes/web.php___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___routes/api.php___SINGLE_BACKTICK___.
8. Middleware assignment: route/group ___SINGLE_BACKTICK___->middleware()___SINGLE_BACKTICK___ vs controller ___SINGLE_BACKTICK___HasMiddleware::middleware()___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___#[Middleware]___SINGLE_BACKTICK___ attribute.
- Hint: grep ___SINGLE_BACKTICK___implements HasMiddleware___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___#[Middleware(___SINGLE_BACKTICK___ in controllers vs ___SINGLE_BACKTICK___->middleware(___SINGLE_BACKTICK___ in routes.
9. Route model binding: implicit (type-hinted models) vs explicit ___SINGLE_BACKTICK___Route::bind___SINGLE_BACKTICK___ vs manual ___SINGLE_BACKTICK___findOrFail___SINGLE_BACKTICK___.
- Hint: typed model params in signatures vs ___SINGLE_BACKTICK___findOrFail(___SINGLE_BACKTICK___ in controllers; grep ___SINGLE_BACKTICK___Route::bind___SINGLE_BACKTICK___.
10. Rate limiting: named ___SINGLE_BACKTICK___RateLimiter::for()___SINGLE_BACKTICK___ + ___SINGLE_BACKTICK___throttle:name___SINGLE_BACKTICK___ vs inline ___SINGLE_BACKTICK___throttle:60,1___SINGLE_BACKTICK___.
- Hint: grep ___SINGLE_BACKTICK___RateLimiter::for___SINGLE_BACKTICK___ in providers vs ___SINGLE_BACKTICK___throttle:___SINGLE_BACKTICK___ in route files.
## C. Authorization
11. Authorization home: Gates (___SINGLE_BACKTICK___Gate::define___SINGLE_BACKTICK___) vs Policy classes in ___SINGLE_BACKTICK___app/Policies___SINGLE_BACKTICK___.
- Hint: ___SINGLE_BACKTICK___ls app/Policies___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___Gate::define___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Providers___SINGLE_BACKTICK___.
12. Authorization call site: ___SINGLE_BACKTICK___$this->authorize()___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___Gate::authorize()___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___$user->can()___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___can___SINGLE_BACKTICK___ middleware vs ___SINGLE_BACKTICK___#[Authorize]___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK______CAN_DIRECTIVE______SINGLE_BACKTICK___ in Blade.
- Hint: grep ___SINGLE_BACKTICK___authorize(___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___->can(___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___middleware('can:___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___#[Authorize(___SINGLE_BACKTICK___, ___SINGLE_BACKTICK______CAN_DIRECTIVE___(___SINGLE_BACKTICK___.
## D. Eloquent & models
13. Mass assignment: ___SINGLE_BACKTICK___$fillable___SINGLE_BACKTICK___ allow-list vs ___SINGLE_BACKTICK___$guarded___SINGLE_BACKTICK___ block-list.
- Hint: grep ___SINGLE_BACKTICK___protected $fillable___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___protected $guarded___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Models___SINGLE_BACKTICK___.
14. Accessors/mutators: modern ___SINGLE_BACKTICK___Attribute___SINGLE_BACKTICK___ class vs legacy ___SINGLE_BACKTICK___getXxxAttribute()___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___setXxxAttribute()___SINGLE_BACKTICK___. Record a legacy hold, it goes against the tool's grain.
- Hint: grep ___SINGLE_BACKTICK___: Attribute___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___Attribute::make___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___function get[A-Z].*Attribute___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Models___SINGLE_BACKTICK___.
15. Primary keys: auto-increment vs ___SINGLE_BACKTICK___HasUuids___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___HasUlids___SINGLE_BACKTICK___.
- Hint: grep ___SINGLE_BACKTICK___HasUuids___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___HasUlids___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/Models___SINGLE_BACKTICK___; migration ___SINGLE_BACKTICK___id()___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___uuid('id')___SINGLE_BACKTICK___.
16. Custom casts: dedicated ___SINGLE_BACKTICK___CastsAttributes___SINGLE_BACKTICK___ classes (___SINGLE_BACKTICK___app/Casts___SINGLE_BACKTICK___) vs inline ___SINGLE_BACKTICK___Attribute___SINGLE_BACKTICK___ vs built-in cast strings.
- Hint: ___SINGLE_BACKTICK___ls app/Casts___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___Cast::class___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___AsStringable::class___SINGLE_BACKTICK___ in models.
17. Data/query layer (architecture): Eloquent directly in controllers vs repositories vs dedicated query objects (e.g. classes exposing ___SINGLE_BACKTICK___builder(): Builder___SINGLE_BACKTICK___).
- Hint: ___SINGLE_BACKTICK___ls app/Repositories app/Queries___SINGLE_BACKTICK___; see where non-trivial queries are built.
18. Query scopes: local ___SINGLE_BACKTICK___scope___SINGLE_BACKTICK___/___SINGLE_BACKTICK___#[Scope]___SINGLE_BACKTICK___ methods vs dedicated builder classes.
- Hint: grep ___SINGLE_BACKTICK___function scope___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___#[Scope]___SINGLE_BACKTICK___ in models; ___SINGLE_BACKTICK___ls app/*/Builders___SINGLE_BACKTICK___.
19. Model events: observers (___SINGLE_BACKTICK___app/Observers___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___#[ObservedBy]___SINGLE_BACKTICK___) vs ___SINGLE_BACKTICK___booted()___SINGLE_BACKTICK___ closures vs event classes.
- Hint: ___SINGLE_BACKTICK___ls app/Observers___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___booted___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___::observe___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___#[ObservedBy]___SINGLE_BACKTICK___.
20. Eager-load posture: explicit per-query ___SINGLE_BACKTICK___->with()___SINGLE_BACKTICK___ vs model-level ___SINGLE_BACKTICK___$with___SINGLE_BACKTICK___ defaults. Treat ___SINGLE_BACKTICK___preventLazyLoading()___SINGLE_BACKTICK___ separately as a development guard because it can complement either posture.
- Hint: grep ___SINGLE_BACKTICK___protected $with___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___->with(___SINGLE_BACKTICK___, and separately ___SINGLE_BACKTICK___preventLazyLoading___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/___SINGLE_BACKTICK___.
## E. Architecture & organization
21. Action/Service structure (architecture): Action classes (invoked via ___SINGLE_BACKTICK___handle___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___execute___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK_____invoke___SINGLE_BACKTICK___) vs service objects vs neither. Cross-check the Step 0 ___SINGLE_BACKTICK___app/___SINGLE_BACKTICK___ map: any ___SINGLE_BACKTICK___Actions___SINGLE_BACKTICK___/___SINGLE_BACKTICK___Services___SINGLE_BACKTICK___/___SINGLE_BACKTICK___Pipelines___SINGLE_BACKTICK___/___SINGLE_BACKTICK___Jobs___SINGLE_BACKTICK___-as-actions folder is this pattern, so record how it is invoked.
- Hint: ___SINGLE_BACKTICK___ls app/___SINGLE_BACKTICK___ (the whole tree, not just ___SINGLE_BACKTICK___Actions___SINGLE_BACKTICK___/___SINGLE_BACKTICK___Services___SINGLE_BACKTICK___); grep the invocation method in the folder you find.
22. DTOs (architecture): spatie/laravel-data vs plain readonly classes vs arrays everywhere.
- Hint: ___SINGLE_BACKTICK___ls app/Data___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___extends Data___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___readonly class___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/___SINGLE_BACKTICK___.
23. Dependency acquisition: constructor/method injection vs ___SINGLE_BACKTICK___app()___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___resolve()___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___App::make()___SINGLE_BACKTICK___ service location.
- Hint: grep ___SINGLE_BACKTICK___app(___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___resolve(___SINGLE_BACKTICK___ / ___SINGLE_BACKTICK___::make(___SINGLE_BACKTICK___ in ___SINGLE_BACKTICK___app/___SINGLE_BACKTICK___ vs promoted constructor deps.
24. Decoupling: events + listeners vs direct service calls.
- Hint: ___SINGLE_BACKTICK___ls app/Events app/Listeners___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___event(___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___::dispatch(___SINGLE_BACKTICK___.
25. Helper vs facade idiom: global helpers (___SINGLE_BACKTICK___config()___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___auth()___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___response()___SINGLE_BACKTICK___) vs facades (___SINGLE_BACKTICK___Config::___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___Auth::___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___Response::___SINGLE_BACKTICK___).
- Hint: ratio of ___SINGLE_BACKTICK___config(___SINGLE_BACKTICK___ vs ___SINGLE_BACKTICK___Config::___SINGLE_BACKTICK___ (etc.) across ___SINGLE_BACKTICK___app/___SINGLE_BACKTICK___.
26. Namespace layout (architecture): default ___SINGLE_BACKTICK___app/___SINGLE_BACKTICK___ skeleton vs domain/module folders (___SINGLE_BACKTICK___app/Domain/**___SINGLE_BACKTICK___, modules).
- Hint: ___SINGLE_BACKTICK___ls app/___SINGLE_BACKTICK___, look for ___SINGLE_BACKTICK___Domain/___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___Modules/___SINGLE_BACKTICK___, bounded-context folders.
27. Enums: backed vs pure; case naming; where they live.
- Hint: ___SINGLE_BACKTICK___ls app/Enums___SINGLE_BACKTICK___; grep ___SINGLE_BACKTICK___enum .*: string___SINGLE_BACKTICK___, ___SINGLE_BACKTICK___enum .*: int___SINGLE_BACKTICK___.
## F. Frontend & views
Fatal error: Call to a member function hasPackage() on null in /var/www/devel/md/product-db/storage/framework/views/6da1a7c3c334eaecc1697d41ef67e735.php on line 83