Как регистрировать объект?
Я вижу, что фасад Log очень полезен.
В документах laravel:
Регистратор предоставляет восемь уровней регистрации, определенных в RFC 5424: аварийный, предупреждающий, критический, ошибка, предупреждение, уведомление, информация и отладка.
Но как я могу зарегистрировать экземпляр модели? например, например:
$user= User::find($user_id);
тогда можно ли зарегистрировать объект $user
?
Ответы
Ответ 1
Это будет работать, хотя регистрация всей модели будет довольно быстро увеличивать ваш журнал.
Log::info(print_r($user, true));
true во втором параметре метода print_r() возвращает информацию вместо ее печати, что позволяет фасаду журнала печатать его как строку.
Ответ 2
Нет.
Первым параметром должна быть строка (или представление строкового объекта). Если вы хотите передать какие-либо другие (необработанные) данные или объекты, вы всегда можете их кодировать JSON и нажимать в контекстных настройках, например:
<?php
$user = User::find($user_id);
\Log::error("Something happened to User {$user_id}.", ['object' => $user->toJson()]);
Или:
<?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()]);
Подробнее о методах подписи здесь.
Ответ 3
Недавно я начал использовать Laravel, поэтому это, безусловно, работает в 5.3 и 5.4, не уверен в более ранних версиях.
Самый быстрый способ, который я могу придумать (подходит для меньших объектов), - это бросить объект в массив:
Log::debug((array) $object);
Возможно, вам интересно, как этот возможный первый параметр метода отладки (а также ошибки, уведомления и другие методы ведения журнала в классе журнала) принимает строку как первый параметр, и мы передаем массив.
Итак, ответ лежит глубоко в классе журнала записи. Существует метод, который каждый раз вызывается для поддержки форматирования сообщений, и он выглядит так:
/**
* 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;
}
Также, чтобы прояснить ситуацию немного, вы можете взглянуть на:
https://github.com/laravel/framework/blob/5.4/src/Illuminate/Log/Writer.php#L199, и вы увидите, что метод formateMessage каждый раз форматирует сообщение.
Ответ 4
Это вызывает исключение "выделенный объем памяти исчерпан" в некоторых случаях. (например, родной класс исключений) - Gokigooooks
Была такая же проблема.
Log::info(print_r($request->user()->with('groups'), true ) );
Добавить ->get()
Log::info(print_r($request->user()->with('groups')->get(), true ) );
Ответ 5
Вы можете войти либо print_r или json_encode. json_encode более читабелен.
например:
use Illuminate\Support\Facades\Log;
Log::info(json_encode($user);