php - 如何通过访问器将其他字段添加到最终 JSON 中?
问题描述
我需要添加一个永远存在的空集合。我做。
protected $appends = ['additional'];
public function getAdditionalAttribute()
{
return collect();
}
然后我做额外的访问器,例如
public function getSomeAttributeAttribute()
{
//some code
return $something; //bool
}
然后在正确的地方我调用这个访问器->append('some_attribute');
但我需要结果在集合中additional
。我试着这样做:
public function getSomeAttributeAttribute()
{
//some code
return $this->additional['some_attribute'] = $something; //bool
}
但它不起作用,结果与所有元素处于同一级别,而不是在集合内部additional
。我可以做这样的事情:
public function getAdditionalAttribute()
{
return collect([
'some_attribute' => $this->some_attribute
]);
}
它可以工作,但这个值会一直存在,但我只想在有必要时调用它,->append('some_attribute');
但集合虽然是空的,但它会一直保持不变。或者也许有不同的方法来制作它。我该怎么做?
解决方案
也许您更容易覆盖序列化本身:
class YourModel extends Model
{
/**
* Convert the object into something JSON serializable.
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return [
'additional' => [
'some_attribute' => $something
]
];
}
}
如果您需要该集合,您可能需要使用自定义集合( php artisan make:collection \\App\\Collections\\AdditionalCollection
):
class YourModel extends Model
{
public function getAdditionalAttribute()
{
return new App\Collections\AdditionalCollection($something);
}
}
class AdditionalCollection extends Collection
{
private $something;
public function __construct($something)
{
$this->something = $something;
parent::__construct([]);
}
public function __get(string $property)
{
if ($property === 'some_attribute') {
return $this->something;
}
}
}
推荐阅读
- security - 带有 checkmarx 的 CakePhp 3 文件操作漏洞
- python - 设置 QFrame 宽度以匹配 QTableWidget
- spring - 如何为配置中尚不存在的任何 spring 配置文件指定默认 Logback 配置
- r - Should I use mget(), .. or with=FALSE to select columns of a data.table?
- math - 如何解决这种重复:T(n) = 2T(n/3)+n^2?
- python - 如何从 python 进程调用 python 脚本
- jquery - Can I hide only the Bootstrap Modal's content?
- android - 多个连续的权限请求不起作用
- flutter - 如何移动下拉箭头左侧而不是默认情况下颤动的右侧?
- c# - 即使传递了值,标签也不会更新