当未提供可选参数时,将Laravel options()作为数组返回



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();

最新更新