Функция report
Функция report предназначена для регистрации исключений
и ошибок в лог-файлах приложения. Она принимает на вход
экземпляр исключения, строку с сообщением об ошибке или
другие данные, которые необходимо записать в лог.
По умолчанию функция записывает информацию в канал
логирования, указанный в конфигурации приложения.
Функция особенно полезна в пользовательском коде, когда
нужно залогировать ошибку без остановки выполнения
программы. В отличие от метода Log, функция
report может принимать любые типы данных
и автоматически обрабатывает их преобразование в
строковое представление.
Синтаксис
<?php
report($exception);
report($message, $context);
report_if($condition, $exception);
?>
Параметры функции:
-
$exception- экземпляр исключения или строка с сообщением об ошибке -
$message- строковое сообщение для логирования -
$context- массив дополнительных данных для логирования
Пример
Давайте залогируем исключение в обработчике ошибок:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Exception;
class UserController extends Controller
{
public function show($id)
{
try {
$user = User::findOrFail($id);
return response()->json($user);
} catch (Exception $e) {
report($e);
return response()->json(['error' => 'User not found'], 404);
}
}
}
?>
В этом примере при возникновении исключения оно будет записано в лог, а пользователь получит сообщение об ошибке.
Пример
Давайте залогируем текстовое сообщение с дополнительными данными:
<?php
namespace App\Http\Controllers;
use App\Models\Order;
use Illuminate\Http\Request;
class OrderController extends Controller
{
public function store(Request $request)
{
$order = new Order();
$order->user_id = $request->user_id;
$order->total = $request->total;
if ($order->total < 0) {
report('Invalid order total: ' . $order->total, [
'user_id' => $order->user_id,
'total' => $order->total
]);
return response()->json(['error' => 'Invalid order total'], 400);
}
$order->save();
return response()->json($order, 201);
}
}
?>
Результат выполнения кода:
"Invalid order total: -10.00"
Сообщение будет записано в лог вместе с контекстными данными для последующего анализа.
Пример
Давайте используем функцию report⁅/⁆ для логирования
ошибок в фоновых задачах:
<?php
namespace App\Jobs;
use App\Models\User;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle()
{
try {
Mail::to($this->user->email)->send(new WelcomeEmail($this->user));
} catch (Exception $e) {
report($e);
$this->fail($e);
}
}
}
?>
Логирование ошибок в очередях позволяет отслеживать проблемы с отправкой писем без прерывания выполнения других задач.
Пример
Давайте залогируем ошибку с использованием условной
функции report_if⁅/⁆:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Exception;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function update(Request $request, $id)
{
$product = Product::find($id);
if (!$product) {
report_if(true, new Exception('Product not found: ' . $id));
return response()->json(['error' => 'Product not found'], 404);
}
$product->update($request->all());
return response()->json($product);
}
}
?>
Функция report_if⁅/⁆ принимает условие в качестве
первого параметра и исключение в качестве второго.
Исключение будет залогировано только если условие
выполняется.