Php isset检查是否应该在依赖于会话有效性的服务中进行?
我正在使用UserSession服务,代码如下 我的问题是,是否需要在get_id方法中执行isset测试,或者在我的情况下,是否应该由调用代码的控制器负责确保会话处于活动状态 如果未设置会话,则失败将导致注销,但我忍不住认为不应该在该服务中检查用户会话的有效性,因为使用该服务无论如何都需要有效的用户会话 我最终不得不在每个人身上都这么做Php isset检查是否应该在依赖于会话有效性的服务中进行?,php,oop,Php,Oop,我正在使用UserSession服务,代码如下 我的问题是,是否需要在get_id方法中执行isset测试,或者在我的情况下,是否应该由调用代码的控制器负责确保会话处于活动状态 如果未设置会话,则失败将导致注销,但我忍不住认为不应该在该服务中检查用户会话的有效性,因为使用该服务无论如何都需要有效的用户会话 我最终不得不在每个人身上都这么做 <?php namespace \App\Services; class UserSession { private $session;
<?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。这样,在调用任何getter之前都可以检查会话的使用情况。如果有50个方法检查有效会话只发生一次,而其他方法不需要重复代码,则应该以这种方式添加用户会话签入
是的,在尝试使用用户会话之前,请始终检查用户会话是否存在。您永远不知道会发生什么导致用户会话为空。首先,您不应该避免混合返回类型。大多数情况下,最好的做法是返回预期的结果/类型或抛出异常 第二,你应该尽快失败。这意味着,一旦您知道需要用户会话才能继续,就应该检查它是否存在。您要么在类构造函数中,要么甚至在尝试实例化UserSession对象之前,例如通过工厂或构建模式
该类可以将$\u SESSION Superglobal的内容注入UserSession,以删除类依赖关系并使其更易于测试 我看不出有什么问题。最好把它放在get__id里,而不是放在不知有多少个地方。许多PHP方法在失败时返回something或false。这并不少见。例如,将CURLOPT_RETURNTRANSFER设置为一个选项。如果成功,它将返回stringon,如果失败,它将返回false。在我看来,双重检查总是更好的。但如果未设置$this->session->user->id,则无法以任何方式调用此脚本。然后,是的,这是没有必要的。我正在努力了解在实例化我使用的Pimple时如何处理错误。如果它在构造时失败,我就无法真正处理容器中的错误。我可以在控制器级别更精确地处理它,因为我可能需要记录导致错误的请求,因为在应用程序中不太可能永远不会设置UserSession。@BugHunterUK只是在不满足条件时抛出错误。这就是我最终要做的。注入$\u会话也有好处。