Comment Laravel réattribue $ this
au modèle donné dans les ressources Api et renvoie techniquement la méthode juste dans la classe?
Supposons que nous ayons ceci:
new TeamResource(Team::first());
3 Réponses :
Je vois deux choses possibles, l'une est que je n'ai vraiment vu personne utiliser un autre modèle de classe pour initialiser une classe complètement différente. Votre problème est peut-être de cette manière que vous initialisez.
Vous pouvez également essayer d'attribuer $ this = TeamsResource (Team :: first ())
Méthode magique ( __get code>
):
$this->something === $this->resource->something;
La ressource API ( Illuminate \ Http \ Resources \ Json \ JsonResource
) définit cette méthode afin que vous puissiez accéder au modèle sous-jacent attributs en accédant aux propriétés de la ressource elle-même.
public function __get($key) { return $this->resource->{$key}; }
Notez que nous pouvons accéder aux propriétés du modèle directement à partir de la variable
$ this
. Cela est dû au fait qu'une classe de ressources procurera automatiquement l'accès aux propriétés et aux méthodes au modèle sous-jacent pour un accès pratique. Laravel 5.8 Docs - Eloquent - Ressources API
C'est bon, mais comment laravel appelle toArray ()
func lors de la création de new TeamResource ()
?
il n'appelle pas toArray
lorsque vous créez une nouvelle instance de TeamResource
, il est résolu ultérieurement, probablement selon la réponse de N69S sous la forme JsonResource code> est
JsonSerializable
L'appel toArray ()
en tant qu'appel toJson ()
sur les instances de modèle est effectué dans le noyau laravel et dans le pipeline de requêtes. voici du code
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); }
où est-ce
ceci
? voulez-vous dire$ this
?ouais $ ce que je voulais dire