【问题标题】:IN MVC - is session handling & authentication to be handled by User Model?在 MVC 中 - 会话处理和身份验证是否由用户模型处理?
【发布时间】:2012-12-23 06:55:49
【问题描述】:

我想知道像身份验证和登录这样的会话处理是否最好由用户模型处理(假设用户模型指的是用户)并具有电子邮件和密码等属性。还是应该由另一个模型来处理会话?

究竟什么是最好的方法 - 我的代码几乎部分散布在函数文件的控制器中,并希望重构我的代码以更符合 MVC 原则。我的项目基于 Zend 框架。

【问题讨论】:

    标签: model-view-controller zend-framework session


    【解决方案1】:

    在 MVC 概念中,模型代表应用程序的业务部分。

    管理用户的身份验证、保存、删除、激活是业务问题。

    因此,直接在用户模型中创建方法验证、保存、删除、激活是有意义的。

    因此,在您的用户模型中,最好将 static 方法实现为

    public static function authenticate ($ username, $ password)
    {
         $authService = $this-> getServiceLocator()->get('Zend\Authentication\AuthenticationService');
         $adapter = $authService->getAdapter();
         $adapter->setIdentityValue($username);
         $adapter->setCredentialValue($password);
         $authResult = $authService->authenticate();
    
         return $authResult->isValid();
    }
    

    在你的控制器中,你可以直接做:

    User/Entity/User::authenticate($username, $password);
    

    【讨论】:

    • 大声笑,当您必须在静态上下文中调用静态方法时,必须使用静态方法。实例化用户以检查我们是否可以进行身份​​验证并不是很聪明。所以我们处于静态上下文中,我们不知道是否可以在对他进行身份验证之前实例化这个用户。
    • 在 OOP 中,静态方法具有真正的实用性和意义。您只需要明智地使用它。
    • 有道理 - 需要对我的代码进行一些修改 - 感谢您的帮助!
    【解决方案2】:

    我将身份验证和会话管理视为应用程序级别的问题。

    我经常应用的一个通用标准是:“我可以在另一个应用程序(可能是命令行应用程序)或另一个网站中使用我的模型吗?

    例如,在您的情况下,我会将 User 模型视为代表用户。无论他是否实际访问和/或登录/退出您的网站,该用户都存在。他可以在命令行应用程序中被引用(例如:一个在所有用户生日那天向他们发送电子邮件的 cron 作业;一个统计所有个人资料不完整的用户的报告实用程序);等等。因此,我会将身份验证会话管理保持在控制器级别或服务级别的下一级。

    但在大多数情况下,YMMV

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 2020-05-15
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多