style
esc
  • Loading…

Start hereLaravel Style Guide template

Conventions for writing, structuring, testing and shipping Laravel 13 apps on PHP 8.5, with attribute-first models and a Livewire or Inertia frontend.

Laravel 13PHP 8.5Livewire · Inertia

A ready-to-run Laravel 13 / PHP 8.5 app on Livewire 4 and Flux with a sample invoices feature (attribute-first UUIDv7 models, actions, a DTO, a form request, a policy and a versioned API resource), the appendix configs and Composer scripts, Pest unit, feature and arch tests, and a CI workflow.

  1. 1

    Download

    Pick a PascalCase name; the app name, database name and README title are renamed for you.

  2. 2

    Install

    Run composer setup to install dependencies, create .env and the SQLite database, migrate with demo data and build assets.

  3. 3

    Run

    Start the app with composer dev, log in as test@example.com, then check with composer lint and composer test.

What you get

project/
├── .github/
│   └── workflows/
│       └── ci.yml
├── app/
│   ├── Actions/
│   │   └── Invoices/
│   │       ├── CreateInvoice.php
│   │       └── MarkInvoicePaid.php
│   ├── Data/
│   │   └── CreateInvoiceData.php
│   ├── Enums/
│   │   └── InvoiceStatus.php
│   ├── Exceptions/
│   │   └── InvoiceAlreadyPaid.php
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Api/
│   │   │   │   └── V1/
│   │   │   │       └── InvoiceController.php
│   │   │   └── Auth/
│   │   │       └── LogoutController.php
│   │   ├── Middleware/
│   │   │   └── SetSecurityHeaders.php
│   │   ├── Requests/
│   │   │   └── StoreInvoiceRequest.php
│   │   └── Resources/
│   │       └── InvoiceResource.php
│   ├── Livewire/
│   │   └── Forms/
│   │       └── InvoiceForm.php
│   ├── Models/
│   │   ├── Invoice.php
│   │   └── User.php
│   ├── Observers/
│   │   └── InvoiceObserver.php
│   ├── Policies/
│   │   └── InvoicePolicy.php
│   └── Providers/
│       └── AppServiceProvider.php
├── bootstrap/
│   ├── cache/
│   │   └── .gitignore
│   ├── app.php
│   └── providers.php
├── config/
│   └── invoices.php
├── database/
│   ├── factories/
│   │   ├── InvoiceFactory.php
│   │   └── UserFactory.php
│   ├── migrations/
│   │   ├── 0001_01_01_000000_create_users_table.php
│   │   ├── 0001_01_01_000001_create_cache_table.php
│   │   ├── 0001_01_01_000002_create_jobs_table.php
│   │   ├── 0001_01_01_000003_create_personal_access_tokens_table.php
│   │   └── 2026_01_01_000000_create_invoices_table.php
│   ├── seeders/
│   │   └── DatabaseSeeder.php
│   └── .gitignore
├── public/
│   ├── .htaccess
│   └── index.php
├── resources/
│   ├── css/
│   │   └── app.css
│   └── views/
│       ├── components/
│       │   └── invoices/
│       │       └── status-badge.blade.php
│       ├── layouts/
│       │   └── app.blade.php
│       ├── pages/
│       │   ├── auth/
│       │   │   └── ⚡login.blade.php
│       │   └── invoices/
│       │       └── ⚡index.blade.php
│       └── welcome.blade.php
├── routes/
│   ├── api.php
│   ├── console.php
│   └── web.php
├── storage/
│   ├── app/
│   │   └── .gitignore
│   ├── framework/
│   │   ├── views/
│   │   │   └── .gitignore
│   │   └── .gitignore
│   └── logs/
│       └── .gitignore
├── tests/
│   ├── Feature/
│   │   ├── Http/
│   │   │   └── Controllers/
│   │   │       └── Api/
│   │   │           └── V1/
│   │   │               └── InvoiceControllerTest.php
│   │   ├── Livewire/
│   │   │   └── Pages/
│   │   │       ├── InvoicesIndexTest.php
│   │   │       └── LoginTest.php
│   │   └── Policies/
│   │       └── InvoicePolicyTest.php
│   ├── Unit/
│   │   ├── Actions/
│   │   │   └── Invoices/
│   │   │       ├── CreateInvoiceTest.php
│   │   │       └── MarkInvoicePaidTest.php
│   │   ├── Data/
│   │   │   └── CreateInvoiceDataTest.php
│   │   └── ArchTest.php
│   ├── Pest.php
│   └── TestCase.php
├── .editorconfig
├── .env.example
├── .gitattributes
├── .gitignore
├── .npmrc
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpstan-baseline.neon
├── phpstan.neon
├── phpunit.xml
├── pint.json
├── README.md
├── rector.php
└── vite.config.js