0
votes

Comment laravel attribue cela au modèle donné dans les ressources

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());


2 commentaires

où est-ce ceci ? voulez-vous dire $ this ?


ouais $ ce que je voulais dire


3 Réponses :


0
votes

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


0 commentaires

1
votes

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


2 commentaires

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 est JsonSerializable



1
votes

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);
    }


0 commentaires