You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过依赖注入调整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();

方案优势

  1. 解决循环依赖:避免Auth自行实例化API导致的循环创建问题。
  2. 保留类独立性:Auth仍可单独实例化使用,不会失去单独配置的灵活性。
  3. 实现预期调用方式:仅需实例化API即可完成验证,简化页面代码。

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:52:54