【发布时间】:2010-09-15 07:18:51
【问题描述】:
我一直在使用会话、MVC 设计和面向对象的 PHP。我应该在哪里保存或检索会话中的数据?我想从方法中检索它,所以我不必将数据传递给方法。最佳做法是什么?
【问题讨论】:
我一直在使用会话、MVC 设计和面向对象的 PHP。我应该在哪里保存或检索会话中的数据?我想从方法中检索它,所以我不必将数据传递给方法。最佳做法是什么?
【问题讨论】:
就个人而言,我是Zend_Session 包装类的忠实粉丝。我更喜欢以面向对象的方式处理数据,而使用包装器的命名空间优势是一个巨大的优势。
你觉得哪个更好看?
$_SESSION['Zend_Auth']['user'] = "myusername";
或
$authNamespace = new Zend_Session_Namespace('Zend_Auth');
$authNamespace->user = "myusername";
我更喜欢使用访问器的外观。
注意:在 MVC 系统中,无论您选择哪种方法,您都应该始终在控制器中获取/设置会话数据。
【讨论】:
我不会打扰会话包装器。您将不会获得足够的收益来满足这些限制。通过超全局允许您使用任何类型的(希望是理智的)您想要的数据结构。我的会话数据总是以 2 级或更多级别的数组数据告终,这对于通过会话包装器进行管理来说太繁琐了。
超全局甚至不限制您让 PHP 使用 save handler 将会话数据存储在数据库中,这对于可扩展性非常有利。
【讨论】:
我通常把它放在控制器中。这是有道理的。控制器决定发生什么以及为什么不让它决定是否允许人们执行请求的操作。 通常,您在 MVC 系统中有多个控制器。例如。 BaseController(抽象 - 通用),NonSessionController 扩展 BaseController(例如:用于静态页面),SessionController 扩展 BaseController(这里主要会话处理 - 这可能是抽象的)。例如,如果您有不同的用户类型,您可能希望对这个控制器进行多态化,例如:AdminController、UserController 等。
【讨论】:
我认为这取决于检索数据的使用范围,如果它仅在方法内部使用,那么为什么要在外部检索它,并且会话始终在超全局变量中可用,最好将其本地化仅在需要时。
【讨论】:
我已经尝试了几种方法,包括使用静态包装类来处理它,但我总是回到只使用超全局数组本身。我仍然使用包装器进行身份验证检查和其他重复性任务,但最终,使用库存设置对我来说更容易且不那么冗长。
【讨论】: