Laravel如何将$this
重新分配给Api资源中给出的模型并从技术上返回类中的just方法?
假设我们有这个:
new TeamResource(Team::first());
然后,在TeamResrouce
中,当我们调用$this
时,它的Team
模型实例。
并自动在toArray()
类中调用了TeamResource
方法。
在确切的类中没有任何构造函数,怎么办?
答案 0 :(得分:1)
魔术方法(__get
):
public function __get($key)
{
return $this->resource->{$key};
}
API资源(Illuminate\Http\Resources\Json\JsonResource
)定义了此方法,因此您可以通过访问资源本身的属性来访问基础模型的属性。
$this->something === $this->resource->something;
请注意,我们可以直接从
$this
变量访问模型属性。这是因为资源类将自动将属性和方法访问代理到基础模型,以方便访问。 Laravel 5.8 Docs - Eloquent - API Resources
答案 1 :(得分:1)
作为模型实例上的toArray()
调用的toJson()
调用是在laravel内核和请求管道中完成的。这是一些代码
Illuminate\Routing\Router
@ toResponse()
public static function toResponse($request, $response)
{
if ($response instanceof Responsable) {
$response = $response->toResponse($request);
}
if ($response instanceof PsrResponseInterface) {
$response = (new HttpFoundationFactory)->createResponse($response);
} elseif ($response instanceof Model && $response->wasRecentlyCreated) {
$response = new JsonResponse($response, 201);
} elseif (! $response instanceof SymfonyResponse &&
($response instanceof Arrayable ||
$response instanceof Jsonable ||
$response instanceof ArrayObject ||
$response instanceof JsonSerializable ||
is_array($response))) {
$response = new JsonResponse($response);
} elseif (! $response instanceof SymfonyResponse) {
$response = new Response($response);
}
if ($response->getStatusCode() === Response::HTTP_NOT_MODIFIED) {
$response->setNotModified();
}
return $response->prepare($request);
}
答案 2 :(得分:0)
我看到了两种可能的情况,一是我还没有真正看到有人使用另一个类模型来初始化完全不同的类。您的问题可能在于您进行初始化的方式。
同样,您可以尝试分配$this = TeamsResource(Team::first())