【问题标题】:Where to put $user->logged_in() function? user_model or user_controller?在哪里放置 $user->logged_in() 函数?用户模型或用户控制器?
【发布时间】:2012-08-26 16:56:00
【问题描述】:

我一直将用户身份验证放在application/models/user_model.php,但这真的是放置该功能的最佳位置吗?

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

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

【问题讨论】:

  • CodeIgniter 希望您创建胖控制器和瘦模型(仅限 DB),但其他框架则以其他方式看待事情。这取决于你;-)
  • Eeek.. 我以为是相反的。我的模型目前死于心脏病。

标签: php codeigniter model-view-controller authentication


【解决方案1】:

它应该是真实 MVC 和受 MVC 启发的设计模式中的模型层的一部分,因为logged-in 将是domain object 的状态,视图应该通过身份验证/识别服务对其进行检查。

您可能会从阅读this post 中受益,但这里有一个快速提示 - 模型与 SQL 数据库或任何其他特定存储介质无关。 Session 只是一种不同的存储形式。

不幸的是,CodeIgniter 实际上并没有实现 MVC 或受 MVC 启发的设计模式,而是复制 Rails。这意味着,除非您想在 CI 中实现适当的模型层(这并不容易),否则您必须执行此检查,CodeIgniter 将其称为“控制器”。


更新

您可能想研究将授权检查放在控制器外部的方法(如here 所述)。这样,当您检测到当前用户无权访问方法时,您将获得对代码执行的额外控制,并且不会“锁定”所选控制器。

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

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

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多