Laravel有一个超级方便的optional((助手。
我想把它和一个自定义的Model属性结合起来,如下所示:
// this method is on the User model
public function getDataAttribute()
{
// this data comes from another service
$data = [
'one' => 1,
'two' => 2,
];
return optional($data);
}
所以我可以这样使用它:
$user->data->one // 1
$user->data->two // 2
$user->data->three // null
然而,我也试图通过以下操作返回整个阵列:
dump($user->data); // this should dump the internal $data array
但这将返回一个具有value
属性的Illuminate\Support\Optional实例。
IlluminateSupportOptional {#1416 ▼
#value: {#2410 ▼
+"one": 1
+"two": 2
}
}
如果否,是否可以返回原始$data数组;sub";是否给定参数(=$user->data的子属性(?或者是否有可能在getDataAttribute((中检测到子参数?
我希望清楚地表明我正在努力实现的目标。
你所要求的是无法实现的。
我的建议是保持简单,定义一个getter
方法,并传递你想要的数组的密钥,然后从那里分别返回你的数据,例如:
public function getData($key = null) {
$data = [
'one' => 1,
'two' => 2,
];
if (!$key) {
return $data;
}
return $data[$key] ?? null;
}
还要注意这个方法不再是一个属性,这是因为AFAIR不能将args传递给属性方法。
阅读材料
空合并运算符
感谢lagbox把我推向了正确的方向。我已经通过使用以下宏解决了这个问题:
IlluminateSupportOptional::macro('toArray', function()
{
return (array) $this->value;
});
通过这种方式,我可以使用访问所有数据
$user->data->toArray();