Where to put $user->logged_in() function? user_model or u


Where to put $user->logged_in() function? user_model or user_controller?

我一直把用户身份验证放在application/models/user_model.php中,但那真的是放置函数的最佳位置吗?

让我怀疑这种编码方式的是,我听说,模型应该只和数据库一起工作。所以这意味着与会话相关的东西不能在模型中。真的是这样吗?

我通过在config/autoload.php中自动加载user_model模型来访问该功能。

在真正的MVC和MVC启发的设计模式中,它应该是模型层的一部分,因为logged-in将是域对象的状态,视图应该通过身份验证/识别服务来检查它。

您可能会从阅读这篇文章中受益,但这里有一个快速提示——模型并没有绑定到SQL数据库或任何其他特定的存储介质。会话只是一种不同形式的存储。

不幸的是,CodeIgniter实际上并没有实现MVC或MVC启发的设计模式,而是在复制Rails。这意味着,除非您想在CI中实现一个合适的模型层(这并不简单),否则您必须执行此签入,CodeIgniter称之为"控制器"。


更新

您可能需要研究将授权检查放置在控制器之外的方法(如本文所述)。这样,当您检测到当前用户没有访问方法的权限时,您将获得对代码执行的额外控制,并且不会被"锁定"在所选控制器中。

如果您在控制器内部进行授权检查,那么最终会重定向客户端,并且当某些内容发生变化时,您必须重写每个控制器(从而违反OCP)。

将身份验证服务的初始化和授权检查的性能放在控制器之外不会违背MVC的思想,因为在MVC的定义中,视图只负责更改模型层和当前视图的状态。没有任何关于实例化它们的内容。因此,在对控制器执行操作之前,初始化身份验证服务(它是模型层的一部分)是可以的。