Download the PHP package orebarranco/filament-ddd-starter without Composer
On this page you can find all versions of the php package orebarranco/filament-ddd-starter. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download orebarranco/filament-ddd-starter
More information about orebarranco/filament-ddd-starter
Files in orebarranco/filament-ddd-starter
Package filament-ddd-starter
Short Description Starter kit Laravel para proyectos en español, con FilamentPHP v5 y arquitectura Domain-Driven Design.
License MIT
Homepage https://github.com/orebarranco/filament-ddd-starter
Informations about the package filament-ddd-starter
filament-ddd-starter
Starter kit de producción para Laravel basado en FilamentPHP v5 con arquitectura Domain-Driven Design.
Pensado para proyectos en español: el panel, los mensajes de validación y los datos
de prueba vienen en español de fábrica (APP_LOCALE=es, APP_FAKER_LOCALE=es_ES).
Para cambiarlo, ajusta esas variables en tu .env.
La lógica de negocio se escribe una vez
Un caso de uso vive en una Action, y la Action no sabe quién la llama. El panel de Filament la consume hoy; una API, un comando de consola o un job la consumen mañana sin reescribir ni adaptar nada.
Así crea un usuario el panel — es el fichero completo, no un extracto:
Y así lo haría un controlador de API. Este fichero no está en el kit —no trae capa HTTP— pero no hace falta tocar el dominio para escribirlo:
La misma Action, el mismo DTO, la misma línea. Lo único que cambia es de dónde salen los datos: del formulario o de la petición. Ahí está la diferencia con un CRUD de Filament donde la lógica vive dentro de la Page: ese código no se puede llamar desde otro sitio, y cuando llega la API se copia.
Las Actions no importan nada de Filament ni de HTTP:
No es una promesa: los tests unitarios ya son ese segundo consumidor. Llaman a
resolve(CreateUserAction::class)->execute($data) sin panel, sin Livewire y sin HTTP.
La costura honesta: Domain\Identity\Models\User sí implementa FilamentUser y su
canAccessPanel() recibe un Filament\Panel. Es el único punto de todo src/Domain/
que conoce Filament, y es deliberado: el contrato de acceso al panel tiene que vivir en
el modelo. Las Actions y los DTO quedan limpios.
Arquitectura
Basada en Laravel Beyond CRUD de Brent Roose (Spatie).
La lógica de negocio vive en src/Domain/, completamente separada de la capa HTTP y de Filament:
Flujo de una operación
Las Pages de Filament solo construyen el DTO y delegan. Nunca contienen lógica de negocio.
Stack
| Capa | Tecnología |
|---|---|
| Framework | Laravel 13, PHP 8.4 |
| Admin UI | Filament 5 (Livewire 4 + Alpine.js + Tailwind v4) |
| Auth / RBAC | Spatie Permission + Filament Shield |
| Testing | Pest 4 |
| Formatter | Laravel Pint |
| Análisis estático | Rector 2 + Larastan 3 (PHPStan) |
Instalación
laravel new ya deja el proyecto arrancado: copia .env, genera la clave,
migra y siembra. Esos pasos viven en post-create-project-cmd dentro de
composer.json; no hace falta repetirlos a mano.
El panel de administración queda en /admin.
Primer arranque
El sembrado crea el catálogo de permisos, el rol super_admin y el primer
administrador:
El catálogo lo siembra database/seeders/ShieldSeeder.php. super_admin no
lleva ninguno de esos permisos y no le hacen falta: entra por el gate de Shield,
que se resuelve antes de consultar cualquier policy. Están ahí para los roles
limitados que definas tú.
Cámbialos antes de exponer el panel a cualquier red. Están en
database/seeders/SuperAdminSeeder.php.
Para entrar al panel hace falta un rol
User::canAccessPanel() exige dos cosas: que la cuenta esté activa y que tenga
al menos un rol asignado. Un usuario recién creado sin rol no entra, y es
deliberado: el rol es lo que responde qué puede hacer, y la columna active es
el interruptor de la cuenta. Son dos preguntas distintas.
Eso tiene dos efectos que conviene saber, porque no parecen lo que son:
- La recuperación de contraseña no avisa a quien no puede entrar. Filament comprueba el acceso antes de enviar el correo y, si falla, no envía nada y responde igual que si lo hubiera enviado, para no revelar qué direcciones existen. Si el enlace no llega, asigna un rol o reactiva la cuenta.
- Con
MAIL_MAILER=log, que es el valor de.env.example, el correo de recuperación se escribe enstorage/logs/laravel.logen vez de enviarse. En una instalación nueva es ahí donde hay que buscarlo.
Al añadir un Resource, regenera los permisos
El segundo comando es el que se olvida. shield:generate crea los permisos en
tu base de datos; shield:seeder los vuelca a ShieldSeeder.php para que
viajen en el repositorio y existan también en las demás instalaciones. Sin él,
el resource nuevo funciona en tu máquina y en ningún otro sitio.
No hace falta que te acuerdes: ShieldSeederTest compara lo que Shield descubre
hoy contra lo que el seeder siembra, y falla nombrando los permisos que falten.
Y conecta la policy al modelo con #[UsePolicy(...)]. Sin ese atributo la
autorización falla abierto: los modelos viven en Domain\{Dominio}\Models\,
el autodescubrimiento de Laravel no los encuentra, y Filament interpreta la
ausencia de policy como permiso concedido. El paso a paso está en
.claude/rules/ddd.md.
Copias de seguridad
Vienen programadas pero apagadas. Para encenderlas:
El calendario está en routes/console.php: limpieza y monitorización diarias,
y dos copias al día.
Crear un nuevo dominio
Ver .claude/rules/ddd.md para el paso a paso completo.
Comandos frecuentes
Convenciones
- Usar
resolve()(noapp()ninew) para instanciar Actions. - Toda nueva funcionalidad requiere test Pest antes de hacer merge.
- Las convenciones de código viven en
.claude/rules/:ddd.md,filament.md,testing.mdycomments.md. Aplican con agente y sin él.
Contribuir
El flujo de trabajo —ramas, commits, orden de los quality gates y estrategia de merge— está en CONTRIBUTING.md. Los cambios de cada versión, en CHANGELOG.md.
Licencia
MIT. Ver LICENSE.
All versions of filament-ddd-starter with dependencies
ext-zip Version *
bezhansalleh/filament-shield Version ^4.2
filament/filament Version ^5.4.3
laravel-lang/common Version >=6.8
laravel/framework Version ^13.0
laravel/pulse Version ^1.7
laravel/tinker Version ^3.0
spatie/laravel-backup Version ^10.2
stechstudio/filament-impersonate Version ^5.6