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" } ]
问题原因
#ip是Spatie\Dns\Records\A类的受保护属性,PHP中受保护属性仅允许类内部或子类访问,外部代码直接通过->ip访问会触发权限错误。$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
相关产品推荐
相关产品推荐

