如何通过依赖注入调整Auth类,实现从API实例调用其方法?
实现API类内嵌Auth实例的PHP解决方案
问题概述
现有两个PHP类:
Auth:负责与外部API的身份验证,依赖API实例并调用其私有属性,核心方法handleSession()用于检查会话令牌,无令牌则重定向到验证页。API:负责向外部API发送常规POST请求。
当前每个页面需单独实例化Auth完成验证:
$api_auth = new Auth(); $api_auth->handleSession();
期望实现仅实例化API类,即可通过$api->auth->handleSession()调用验证方法,同时保留Auth类的独立性(可单独配置使用)。
解决方案:双向依赖注入+封装Auth实例
步骤1:重构Auth类,改用构造注入API实例
修改Auth的构造函数,不再自行创建API实例,而是通过参数传入,避免循环依赖:
class Auth { private $api; // 构造函数接收API实例 public function __construct(API $api) { $this->api = $api; } public function handleSession() { if (!isset($_SESSION)) { session_start(); } if (!isset($_SESSION["ACCESS_TOKEN"])) { $_SESSION["REFERER"] = $_SERVER["PHP_SELF"]; header("Location: auth.php"); exit; } else { unset($_SESSION["REFERER"]); } } // 示例:调用API的私有属性方法 public function getApiAttr() { return $this->api->getAttr(); } }
步骤2:修改API类,内嵌Auth实例并传入自身
在API的构造函数中创建Auth实例,同时将当前API对象传入,最后提供公共的auth属性或getter方法供外部访问:
方式A:直接暴露公共auth属性(简洁直观)
class API { private $id; private $attr; // 公共Auth实例,允许外部直接访问 public $auth; public function __construct() { // 创建Auth时传入当前API实例 $this->auth = new Auth($this); // 初始化API自身属性 $this->id = "your-api-id"; $this->attr = "your-api-attribute"; } // 提供访问私有属性的方法 public function getAttr() { return $this->attr; } // API核心方法:发送POST请求 public function sendPost($endpoint, $payload) { // 实现POST请求逻辑 } }
方式B:用Getter方法封装(更符合面向对象封装原则)
如果不想直接暴露auth属性,可通过getter方法提供访问:
class API { private $auth; private $id; private $attr; public function __construct() { $this->auth = new Auth($this); $this->id = "your-api-id"; $this->attr = "your-api-attribute"; } public function getAuth() { return $this->auth; } public function getAttr() { return $this->attr; } public function sendPost($endpoint, $payload) { // 实现POST请求逻辑 } }
步骤3:使用方式
对应方式A的调用:
$api = new API(); // 直接通过API实例访问Auth的方法 $api->auth->handleSession(); // 如需单独使用Auth类(保留独立性) $standaloneApi = new API(); $standaloneAuth = new Auth($standaloneApi); $standaloneAuth->handleSession();
对应方式B的调用:
$api = new API(); $api->getAuth()->handleSession();
方案优势
- 解决循环依赖:避免
Auth自行实例化API导致的循环创建问题。 - 保留类独立性:
Auth仍可单独实例化使用,不会失去单独配置的灵活性。 - 实现预期调用方式:仅需实例化
API即可完成验证,简化页面代码。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

