Los controladores generalmente se crean para un determinado recurso (una clase de entidad, una tabla en la base de datos), pero también se pueden crear para agrupar acciones que son responsables de una determinada parte de la aplicación. En sus ejemplos, ese sería un controlador que maneja la seguridad de la aplicación:
class SecurityController
{
// can handle both the login page display and
// the login page submission
login();
logout();
register();
// optional: confirm account after registration
confirm();
// displays the forgot password page
forgotPassword();
// displays the reset password page
// and handle the form submission
resetPassword();
}
Nota : no coloque las acciones relacionadas con la seguridad y las acciones del perfil de usuario en el mismo controlador; puede tener sentido porque están relacionados con el usuario, pero uno debe manejar la autenticación y el otro debe manejar las actualizaciones de correo electrónico, nombre, etc.
Con los controladores creados para los recursos (digamos Task
), tendría las acciones CRUD habituales :
class TasksController
{
// usually displays a paginated list of tasks
index();
// displays a certain task, based on an identifier
show(id);
// displays page with form and
// handles form submission for creating
// new tasks
create();
// same as create(), but for changing records
update(id);
// displays confirmation message
// and handles submissions in case of confirmation
delete()
}
Por supuesto, tiene la posibilidad de agregar recursos relacionados al mismo controlador. Digamos, por ejemplo, que tiene la entidad Business
, y cada una tiene varias BusinessService
entidades. Un controlador para esto podría verse así:
class BusinessController
{
index();
show(id);
create();
update(id);
delete();
// display the business services for a certain business
listBusinessServices(businessId);
// displays a certain business service
showBusinessService(id);
// create a new business service for a certain business
createBusinessService(businessId);
// updates a certain business service
updateBusinessService(id);
// deletes a certain business service
deleteBusinessService(id);
}
Este enfoque tiene sentido cuando las entidades secundarias relacionadas no pueden existir sin la entidad principal.
Estas son mis recomendaciones:
- crear controladores basados en un grupo de operaciones relacionadas (manejo de ciertas responsabilidades como seguridad u operaciones CRUD en recursos, etc.);
- para controladores basados en recursos, no agregue acciones innecesarias (si se supone que no debe actualizar el recurso, no agregue la acción de actualización);
- puede agregar acciones "personalizadas" para simplificar las cosas (por ejemplo, tiene una
Subscription
entidad que tiene una disponibilidad basada en un número limitado de entradas, puede agregar una nueva acción al controlador nombrado use()
que tiene el único propósito de restar una entrada de la Subscription
)
- mantenga las cosas simples: no desordene su controlador con una gran cantidad de acciones y una lógica compleja, intente simplificar las cosas disminuyendo la cantidad de acciones o haciendo dos controladores;
- Si está utilizando un marco centrado en MVC, siga sus pautas de mejores prácticas (si lo tienen).
Algunos recursos para leer más aquí .