Reglas generales
- Las políticas de la aplicación host viven en
app/Policies/; las políticas del paquete viven en el directoriosrc/Policies/del paquete - Solo extiende
BasePolicycuando el modelo tiene su propio CRUD independiente en el frontend de administración (registrado mediante Laravel Front).BasePolicyvalidahasPermissionTo($name)contra los permisos almacenados en la base de datos; si no hay CRUD, el permiso no existe y no hay motivo para crearlo. - No deduzcas que a un modelo le falta un CRUD independiente solo porque una política añade lógica de negocio como
&& $model->can_be_deletedo&& ! $instance->is_paid. Verifica evidencia en rutas/recursos comoRoute::front('ModelName'), un recursoapp/Front/Resources/ModelName.php, o un permiso explícito antes de marcar un error enextends BasePolicy. - Cuando un modelo no tiene su propio CRUD (p. ej.
BillingPrice,BillingPriceVariation), la política solo maneja lógica de negocio (p. ej. "no se puede eliminar si tiene hijos") sin comprobar permisos del usuario por nombre. El acceso se hereda del permiso del modelo padre (p. ej. si el usuario tiene el permisoplans, tiene acceso a precios y variaciones). - No registres políticas manualmente en
AppServiceProvider. Laravel detecta automáticamente las políticas que siguen la convención de nombresApp\Policies\{Model}Policy. Las políticas de paquetes son la excepción: la autodetección solo asignaApp\Models\XaApp\Policies\XPolicy, así que el service provider del paquete las registra conGate::policy(). - Prefiere las políticas para reglas reutilizables de autorización y acceso vinculadas a modelos o recursos protegidos. No crees helpers ad hoc del componente como
canAccessVisitor()ocanManageResource()para contener lógica de autorización cuando exista un sujeto de política útil; coloca la regla en la política y llámala a través de la autorización de Laravel (authorize,can,@can, o helpers equivalentes del proyecto). - Las comprobaciones inline son aceptables para estado local de la UI, flujos públicos o guardas puntuales sin un sujeto de política útil, pero el acceso a recursos protegidos debe usar por defecto autorización respaldada por políticas.
- Cuando una política aplica una regla de negocio sensible a la persistencia, acompáñala con una red de seguridad en un observer para la misma regla.
- Cuando la autorización de borrado tenga lógica de negocio (p. ej. "no se puede eliminar si tiene hijos"), expón esa lógica como el accessor
can_be_deleteden el modelo. La políticadelete()y el observerdeleting()leen$model->can_be_deleteden lugar de duplicar la condición.