Как Laravel присваивает это модели, приведенной в ресурсах - PullRequest
0 голосов
/ 01 октября 2019

Как Laravel переназначил $this на модель, заданную в ресурсах Api, и технически вернул метод just в классе?

Предположим, у нас есть это:

new TeamResource(Team::first());

затем вTeamResrouce когда мы вызываем $this, его Team экземпляр модели.

и автоматически он вызывает метод toArray() в классе TeamResource.

без какого-либо конструктора в точном классекак?

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Магический метод (__get):

public function __get($key)
{
    return $this->resource->{$key};
}

Ресурс API (Illuminate\Http\Resources\Json\JsonResource) определяет этот метод, поэтому вы можете получить доступ к атрибутам базовой модели, открыв свойства всам ресурс.

$this->something === $this->resource->something;

Обратите внимание, что мы можем получить доступ к свойствам модели напрямую из переменной $this. Это связано с тем, что класс ресурсов автоматически проксирует доступ к свойствам и методам до базовой модели для удобного доступа. Документация Laravel 5.8 - Eloquent - Ресурсы API

1 голос
/ 02 октября 2019

Вызов 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);
    }
0 голосов
/ 01 октября 2019

Я вижу две возможные вещи, во-первых, я действительно не видел, чтобы кто-нибудь использовал другую модель класса для инициализации совершенно другого класса. Ваша проблема может быть в том, как вы инициализируете.

Также вы можете попробовать назначить $this = TeamsResource(Team::first())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...