我总是将用户身份验证放在application/models/user_model.php
中,但这真的是放置该功能的最佳位置吗?
让我对这种编码方式产生怀疑的是,我听说过,模型应该只适用于数据库。 所以这意味着会话相关的东西不能在模型中。真的是这样吗?
我可以通过user_model
中的自动加载config/autoload.php
模型来访问该功能。
答案 0 :(得分:3)
它应该是真实MVC和MVC启发的设计模式中模型层的一部分,因为logged-in
将是domain object的状态,视图应该通过身份验证/识别服务进行检查。
您可能会从阅读this post中受益,但这里有一个快速提示 - 模型与SQL数据库或任何其他特定存储介质无关。会话只是一种不同的存储形式。
不幸的是,CodeIgniter实际上并没有实现MVC或MVC启发的设计模式,而是复制Rails。这意味着,除非您想在CI中实现适当的模型层(这不是很简单),否则您必须执行此检查,CodeIgniter称为“控制器”。
<强>更新强>
您可能希望研究如何将授权检查放在控制器之外(如here所述)。这样,当您检测到当前用户无权访问方法时,您将获得对代码执行的额外控制,并且不会“锁定”在所选控制器中。
如果你在控制器内进行授权检查,你最终会重定向客户端,当你发生变化时你必须重写每个控制器(因此,违反了OCP)。
在控制器外部放置认证服务的初始化和授权检查的性能不会违反MVC的思想,因为在MVC的定义中,视图仅负责改变模型层和当前视图的状态。没有任何关于实例化它们的说法。因此,在对控制器执行操作之前初始化身份验证服务(它是模型层的一部分)是可以的。