laravel如何将其分配给资源中给定的模型

时间:2019-10-01 10:04:16

标签: php laravel api class controller

Laravel如何将$this重新分配给Api资源中给出的模型并从技术上返回类中的just方法?

假设我们有这个:

new TeamResource(Team::first());

然后,在TeamResrouce中,当我们调用$this时,它的Team模型实例。

并自动在toArray()类中调用了TeamResource方法。

在确切的类中没有任何构造函数,怎么办?

3 个答案:

答案 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())

相关问题