General principles

  • Modular — Each business domain lives in its own package
  • Multi-tenant — Every model has tenant scoping (company_id or organization_id)
  • Convention over configuration — Follow Laravel naming standards
  • Thin controllers — Business logic lives in services

Naming conventions

Files and classes

Methods

Database

Code organization within a file

Services

Controllers

Patterns to follow

Use enums for constants

Use contracts for cross-package communication

Use helpers for tenant context

Use form requests for validation

What NOT to do

  • Don’t import models directly from other packages — use contracts
  • Don’t hardcode company IDs — use company() helper
  • Don’t put business logic in controllers — use services
  • Don’t skip policies — every model action needs authorization
  • Don’t use auto-incrementing IDs — use KSUID via KsuidTrait
  • Don’t create tables without tenant scoping columns