web-dev-qa-db-fra.com

Comment enregistrer un objet?

Je peux voir que Log façade est très utile . Dans la documentation de Laravel:

L'enregistreur fournit les huit niveaux de journalisation définis dans la RFC 5424: urgence, alerte, critique, erreur, avertissement, avis, information et débogage.

Mais, comment pourrais-je consigner une instance d'un modèle? comme par exemple:

$user= User::find($user_id);

dans ce cas, serait-il possible de consigner l'objet $user?

15
simo

Cela fonctionnera, même si la journalisation de l'intégralité du modèle augmentera votre journal assez rapidement.

Log::info(print_r($user, true));

True dans le deuxième paramètre de la méthode print_r () renvoie les informations au lieu de les imprimer, ce qui permet à la façade Journal de les imprimer comme une chaîne.

42
Rob Fonseca

Non.

Le premier paramètre doit être une chaîne (ou une représentation d'objet chaîne). Si vous souhaitez transmettre tout autre type de données ou d'objets (bruts), vous pouvez toujours les encoder en JSON et les insérer dans les paramètres de contexte, comme suit:

<?php 

$user = User::find($user_id);

\Log::error("Something happened to User {$user_id}.", ['object' => $user->toJson()]);

Ou:

<?php

// User.php
[...]

class User 
{
    [...]

    public function __toString()
    {
        return "{$this->id}";
    }
}

// [...]
$user = User::find($user_id);

\Log::error("Something happened to User {$user}.", ['object' => $user->toJson()]);

Vous pouvez trouver plus d'informations sur les signatures de méthode ici .

1
GiamPy

J'ai récemment commencé à utiliser Laravel, donc cela fonctionne certainement dans les versions 5.3 et 5.4, pas certain pour les versions précédentes. 

Le moyen le plus rapide auquel je peux penser (qui convient à des objets plus petits) serait de convertir un objet en tableau:

Log::debug((array) $object);

Vous vous demandez peut-être comment cela est possible. Le premier paramètre de la méthode de débogage (ainsi que les méthodes error, notice et autres méthodes de journalisation de la classe Log) accepte la chaîne en tant que premier paramètre et nous transmettons le tableau.

Ainsi, la réponse se situe au plus profond de la classe des rédacteurs de journaux. Il existe une méthode qui est appelée à chaque fois pour prendre en charge le formatage des messages, et qui se présente comme suit:

/**
 * Format the parameters for the logger.
 *
 * @param  mixed  $message
 * @return mixed
 */
protected function formatMessage($message)
{
    if (is_array($message)) {
        return var_export($message, true);
    } elseif ($message instanceof Jsonable) {
        return $message->toJson();
    } elseif ($message instanceof Arrayable) {
        return var_export($message->toArray(), true);
    }

    return $message;
}

Pour clarifier un peu les choses, vous pouvez jeter un coup d’œil sur: https://github.com/laravel/framework/blob/5.4/src/Illuminate/Log/Writer.php#L199 et vous verrez que la méthode formateMessage met en forme le message à chaque fois.

1
Vladimir Kovic