Dónde va el código
Antes de escribir una clase, decide dónde va el código siguiendo este orden y deteniéndote en la primera coincidencia:
- Package — el código pertenece a un dominio que se está aislando (p. ej. billing), así que vive en el paquete junto con todo lo que ese dominio necesita.
- Modelo — el código trata sobre un registro, o sobre los registros almacenados para él.
$user->markLoggedIn(),User::emailExists($email),$plan->can_be_deleted. - Servicio — el código se comunica con un sistema externo: un proveedor de pagos, una API, una pasarela SMS, una búsqueda de geolocalización. Consulta el estándar de Services.
- Helper — el código es una función pura que solo transforma sus argumentos, y más de un lugar la necesita. Consulta "Las utilidades compartidas van en Helpers" en el estándar de PHP.
- Componente Livewire, middleware, observer o job — el código es el punto de entrada que recibe la solicitud o reacciona a un evento, y el trabajo es lo bastante pequeño como para leerse ahí.
- Action — una única operación síncrona que debe devolver su resultado al llamador. Una clase por operación, en app/Actions/ para la aplicación anfitriona o src/Actions/ dentro de un paquete, con un método handle() que devuelve el resultado; se ejecuta en proceso y devuelve un valor, a diferencia de un job, que puede encolarse.
- Clase de aplicación en
app/Classes/— nada de lo anterior encaja, y el código tiene un propósito propio que merece nombre.
Una clase de aplicación es para lógica que pertenece a la aplicación pero no a un único registro, y que no alcanza ningún sistema externo: un objeto de valor, un cálculo de dominio que abarca varios modelos, un motor o un flujo controlado desde un middleware donde no hay ningún componente Livewire para contenerlo.
// Correct — the referral program owns capturing a code and registering the referral
App\Classes\Referrals
// Correct — plan limits are a domain calculation that no single model owns
App\Classes\PlanLimits
// Incorrect — this is a question about stored users, so it belongs on the model
App\Classes\UserEmailChecker