preset()->php(); arch()->preset()->laravel(); arch()->preset()->security(); arch('controllers') ->expect('App\Http\Controllers') ->not->toBeUsed(); arch('avoid mutation') ->expect('App') ->classes() ->toBeReadonly() ->ignoring([ 'App\Exceptions', 'App\Jobs', 'App\Livewire', 'App\Models', 'App\Providers', 'App\Services', ]); arch('avoid inheritance') ->expect('App') ->classes() ->toExtendNothing() ->ignoring([ 'App\Exceptions', 'App\Jobs', 'App\Livewire', 'App\Models', 'App\Providers', 'App\Services', ]); arch('avoid open for extension') ->expect('App') ->classes() ->toBeFinal() ->ignoring([ 'App\Livewire', ]); arch('avoid abstraction') ->expect('App') ->not->toBeAbstract(); arch('factories') ->expect('Database\Factories') ->toExtend(Factory::class) ->toHaveMethod('definition') ->toOnlyBeUsedIn([ 'App\Models', ]); arch('models') ->expect('App\Models') ->toHaveMethod('casts') ->toOnlyBeUsedIn([ 'App\Actions', 'App\Http', 'App\Jobs', 'App\Livewire', 'App\Models', 'App\Observers', 'App\Policies', 'App\Providers', 'App\Services', 'Database\Factories', 'Database\Seeders', ]); arch('actions') ->expect('App\Actions') ->toHaveMethod('handle');