是否应该在依赖于会话有效性的服务内进行isset检查


Should isset checks be done within a service that depends on a session being valid?

我正在开发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;
    }
}

有什么建议吗?

我想可能需要一个返回truefalse的方法is_valid()。这样,可以在调用任何getter之前检查会话的使用情况。

首先,不应该避免混合返回类型。大多数时候,最佳做法是返回预期的结果/类型或抛出异常。

第二,你应该尽快失败。这意味着,一旦你知道你需要一个UserSession来继续,你就应该检查它是否存在。您要么在类构造函数中,要么甚至在尝试实例化UserSession对象之前,例如通过工厂或构建模式。

尽管该类可以将$_SESSION Superglobal的内容注入UserSession,以删除类依赖关系,并使其更易于测试。

如果您有50个方法,则应该以这种方式在__construct中添加用户会话检查。有效会话检查只发生一次,其他方法不需要重复代码。

是的,在尝试使用用户会话之前,请始终检查用户会话是否存在(您永远不知道会发生什么导致用户会话为空)。