Функция report_if
Функция report_if применяется для логирования исключений
только в том случае, если переданное условие истинно.
Она принимает три параметра: условие, исключение
и необязательный строковый контекст. Если условие
выполняется, исключение отправляется в лог-канал
через стандартный механизм отчётов Laravel.
Функция не прерывает выполнение программы, в отличие
от throw_if.
Синтаксис
<?php
report_if($condition, $exception, $context);
?>
Пример
Давайте выполним логирование ошибки только в том случае,
если значение переменной больше 10:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppModelsArticle;
use Exception;
class ArticleController extends Controller
{
public function show($id)
{
$article = Article::find($id);
if ($article === null) {
$value = 15;
$exception = new Exception('Article not found');
report_if($value > 10, $exception, 'Article search error');
return response()->json(['message' => 'Article not found'], 404);
}
return response()->json($article);
}
}
?>
В этом примере, поскольку 15 больше 10,
исключение будет записано в лог с контекстом
'Article search error'. При этом пользователь
получит ответ с кодом 404, а не ошибку
на странице.
Пример
Давайте залогируем исключение только для определённого типа ошибок, используя проверку на экземпляр класса:
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateDatabaseEloquentModelNotFoundException;
use Exception;
class UserController extends Controller
{
public function update($id)
{
try {
$user = User::findOrFail($id);
$user->update(request()->all());
return response()->json($user);
} catch (Exception $e) {
$isNotFound = $e instanceof ModelNotFoundException;
$context = 'User update failed';
report_if($isNotFound, $e, $context);
return response()->json(['error' => 'User not found'], 404);
}
}
}
?>
В данном случае исключение будет записано в лог
только если оно является экземпляром
ModelNotFoundException. Другие типы ошибок
будут проигнорированы функцией.
Пример
Давайте используем функцию report_if без контекста
для логирования ошибок на основе пользовательских данных:
<?php
namespace AppHttpControllers;
use AppModelsProduct;
use Exception;
class ProductController extends Controller
{
public function delete($id)
{
$product = Product::find($id);
if ($product === null) {
$exception = new Exception('Product deletion failed');
$isAdmin = auth()->user()->role === 'admin';
report_if($isAdmin, $exception);
return response()->json(['message' => 'Product not found'], 404);
}
$product->delete();
return response()->json(['message' => 'Product deleted']);
}
}
?>
Здесь исключение будет записано в лог только в том случае, если пользователь является администратором. Обычные пользователи не увидят эту ошибку в логах.
Результат выполнения кода для администратора:
"Exception logged with level error"
Результат выполнения кода для обычного пользователя:
"Exception not logged"