通常为特定资源(实体类,数据库中的表)创建控制器,但也可以创建控制器以将负责应用程序特定部分的动作组合在一起。在您的示例中,这将是一个处理应用程序安全性的控制器:
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();
}
注意:请勿将与安全性相关的操作和用户配置文件操作放在同一控制器中;这可能是有道理的,因为它们与用户有关,但一个应处理身份验证,另一个应处理电子邮件,名称等更新。
使用为资源创建的控制器(假设Task
),您将具有通常的CRUD操作:
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()
}
当然,您可以将相关资源添加到同一控制器。假设您有个实体Business
,每个BusinessService
实体都有几个实体。一个控制器可能看起来像这样:
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);
}
当相关的子实体没有父实体不能存在时,这种方法很有意义。
这些是我的建议:
- 根据一组相关的操作创建控制器(处理某些职责,例如安全性或对资源的CRUD操作等);
- 对于基于资源的控制器,请不要添加不必要的操作(如果不应该更新资源,请不要添加更新操作);
- 您可以添加“自定义”操作以简化操作(例如,您的
Subscription
实体具有基于有限数量的条目的可用性,您可以向名为的控制器添加新操作use()
,其唯一目的是从中减去一个条目Subscription
)
- 保持简单-不要用大量的动作和复杂的逻辑使控制器混乱,尝试通过减少动作数或设置两个控制器来简化事物;
- 如果您使用的是关注MVC的框架,请遵循他们的最佳实践准则(如果有的话)。
一些资源可以在这里进一步阅读。