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

Laravel中如何从Spatie\Dns\Records\A对象提取IP地址?

Laravel中使用Spatie DNS Retriever获取IP的问题解决

问题重现

控制器代码:

public function getDomainInfo($domain)
{
    $dns = new Dns();
    $recordsA = $dns->getRecords($domain, ['A', 'CNAME']);

    $ip = $recordsA[0]->ip;
    dd($ip);

    return view('client.domain', compact('records','recordsA','recordsMX','recordsMX','recordsAll'));
}

执行时触发错误:

Cannot access protected property Spatie\Dns\Records\A::$ip

尝试以数组方式访问$recordsA[0]['ip']时,再次报错:

Cannot use object of type Spatie\Dns\Records\A as array

dd($recordsA)的输出显示A记录对象的#ip为受保护属性:

array:1 [▼
  0 => Spatie\Dns\Records\A {#294 ▼
    #host: "google.com"
    #ttl: 418
    #class: "IN"
    #type: "A"
    #ip: "216.239.38.120"
  }
]

问题原因

  1. #ip是Spatie\Dns\Records\A类的受保护属性,PHP中受保护属性仅允许类内部或子类访问,外部代码直接通过->ip访问会触发权限错误。
  2. $recordsA[0]是对象实例,并非数组,因此不能用数组下标['ip']的方式访问属性。

正确解决方法

Spatie DNS Retriever的每个记录类都提供了对应的公共访问方法,针对A记录,直接调用ip()方法即可获取IP地址:

修改后的控制器代码:

public function getDomainInfo($domain)
{
    $dns = new Dns();
    $recordsA = $dns->getRecords($domain, ['A', 'CNAME']);

    // 先检查是否存在有效记录
    if (!empty($recordsA)) {
        $ip = $recordsA[0]->ip();
        dd($ip);
    }

    return view('client.domain', compact('records','recordsA','recordsMX','recordsAll'));
}

如果需要获取记录的所有属性,也可以调用toArray()方法将对象转为数组后访问:

$recordArray = $recordsA[0]->toArray();
$ip = $recordArray['ip'];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:31:00