我正在开发UserSession
服务,代码如下。
我的问题是,是否需要在get_id
方法中进行isset
测试,或者是否应由调用代码(在我的情况下是控制器)负责确保会话处于活动状态?
如果没有设置会话,失败将导致注销,但我忍不住认为不应该在该服务中检查用户会话的有效性,因为使用该服务无论如何都需要有效的用户会话。
我最终不得不在每个吸气者身上都这样做。
<?php
namespace 'App'Services;
class UserSession {
private $session;
public function __construct()
{
$this->session = (object) $_SESSION;
}
public function get_id()
{
if(!isset($this->session->user->id))
return false;
return $this->session->user->id;
}
}
有什么建议吗?
我想可能需要一个返回true
或false
的方法is_valid()
。这样,可以在调用任何getter之前检查会话的使用情况。
首先,不应该避免混合返回类型。大多数时候,最佳做法是返回预期的结果/类型或抛出异常。
第二,你应该尽快失败。这意味着,一旦你知道你需要一个UserSession来继续,你就应该检查它是否存在。您要么在类构造函数中,要么甚至在尝试实例化UserSession对象之前,例如通过工厂或构建模式。
尽管该类可以将$_SESSION
Superglobal的内容注入UserSession,以删除类依赖关系,并使其更易于测试。
如果您有50个方法,则应该以这种方式在__construct
中添加用户会话检查。有效会话检查只发生一次,其他方法不需要重复代码。
是的,在尝试使用用户会话之前,请始终检查用户会话是否存在(您永远不知道会发生什么导致用户会话为空)。