Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t
В этом посте в блоге я расскажу вам все о зажигании.
Давайте посмотрим, что в PHP по умолчанию. PHP предоставляет эту возможность без использования фреймворка. Вы получаете только ошибки: нет трассировки стека, нет запроса или сведений о приложении.
Страница ошибок Symfony немного лучше, она показывает трассировки стека, но это не сильно помогает.
На скриншоте ниже изображен whoops, который является стандартом в laravel 5. Это намного лучше, чем symfony по умолчанию, с отображением трассировок стека и некоторой информацией о запросах. Хотя whoops используется по умолчанию в laravel, он не зависит от платформы (представление коллекции ошибок). В нем отображается только общая информация.
Это скриншот ignition, нового представления ошибок, которое мы создали. Поскольку это уникально для laravel, мы можем делать много крутых вещей.
Обнаружение возгорания
Давайте рассмотрим все детали зажигания. Это с открытым исходным кодом, и вы можете увидеть код здесь (https://github.com/facade/ign.
Если в представлении есть ошибки, вот как их отображает whoops. Обратите внимание, что сообщение об исключении не подходит для выделенного пространства. Вам нужно навести на него курсор, чтобы увидеть все целиком. В трассировке стека вы можете видеть, что используются скомпилированное представление блейда и содержимое. Это затрудняет отслеживание того, какой файл блейд-представления содержит ошибки, а само содержимое представления недоступно для чтения.
Зажигание-это страница с конкретной ошибкой laravel. В результате он может “монтироваться” в фреймворк как крючок, отображая путь к несжатому виду и ваш блейд-вид. Вверху достаточно места, чтобы отобразить всю страницу исключений без дополнительных кликов. Мы также показываем только фреймы приложений по умолчанию, потому что они могут представлять для вас интерес.
Если вы нажмете трассировка стека
Значок карандаша рядом с именем файла в правой части вкладки, мы автоматически откроем файл в вашем любимом редакторе. По умолчанию используется Phpstorm. Вы можете быть в зажигании
Настроить его как свой любимый редактор в файле конфигурации.
Вы заметили маленькую ссылку “телескоп” в правом верхнем углу? Мы покажем его только в том случае, если вы установили телескоп laravel (первый помощник по отладке). Если вы нажмете на эту ссылку, вы попадете в телескоп, где произошла ошибка.
Темный режим
Если наш экран ошибок по умолчанию слишком яркий, вы будете рады узнать, что на нашей странице ошибок также есть темный режим.
Стол зажигания
Давайте исследуем Зажигание
Вкладка, отображаемая на странице.
Вкладка Запросы
Рядом с вкладкой трассировка стека вы увидите вкладку запросы. Он показывает вам всю ожидаемую информацию о запросе.
Предположим, у вас есть определение маршрутизации, подобное этому:
Route::get('/posts/{post}', function (Post $post) { // });
Если этот маршрут ненормален, мы напечатаем параметры маршрута в post
Model ( $post
Переменная), чтобы преобразовать представление массива( toArray
(1). Это также верно для “простых” параметров маршрутизации, которые не требуют никакой привязки. Это хороший способ узнать, какую информацию laravel получает для данного конкретного маршрута.
После параметров маршрутизации мы также покажем вам список промежуточного программного обеспечения, используемого в этом запросе.
Далее идет раздел “Просмотр”. Если в представлении возникнет исключение, мы покажем здесь имя представления. Даже: мы дадим список всех данных, переданных в представление.
Вкладка “Пользователь”
Вкладка пользователи содержит дополнительную информацию о пользователях и браузерах, использующих приложение.
Контекстная вкладка
оставайтесь Контекст
Вкладка, мы покажем вам репо
(где находится репо, проверьте хэш фиксации) и среду (какую версию PHP и laravel вы используете).
вкладка “отладка”
оставайтесь на вкладке Debug
, мы покажем, что произошло до возникновения исключения. Например, запросы, журналы и дампы. Рядом с дампом мы также показываем, что вы будете сбрасывать
Имя файла, в котором размещается оператор. Нажав на значок карандаша, вы можете получить прямой доступ к файлу и исправить номер строки в своем любимом редакторе.
Предложенное решение
Давайте рассмотрим еще одну ошибку. На этот раз мы забудем импортировать класс. Страница ошибок зажигания выглядит следующим образом.
Итак, когда зажигание видит, что исключение касается класса, который не найден. Он попытается выяснить, существует ли этот класс в других пространствах имен. Если он существует, это предполагает, что мы его импортируем.
Зажигание поставляется с решениями целого ряда распространенных проблем. Если вид блейда не найден, то недопустимое представление принимается следующим образом.
Вы также можете настроить решения для исключений. Требуется реализация класса исключений Фасад\Контракты на зажигание\Предоставляет решения
Интерфейс. Для этого требуется добавить метод getSolution
. Вот возможная реализация.
namespace App\Exceptions; use Exception; use Facade\IgnitionContracts\Solution; use Facade\IgnitionContracts\BaseSolution; use Facade\IgnitionContracts\ProvidesSolution; class CustomException extends Exception implements ProvidesSolution { public function getSolution(): Solution { return BaseSolution::create("You're doing it wrong") ->setSolutionDescription('You are obviously doing something wrong. Check your code and try again.') ->setDocumentationLinks([ 'Laracasts' => 'https://laracasts.com', 'Use Flare' => 'https://flareapp.io', ]); } }
Вот как выглядит исключение в зажигании.
Запущенные решения
В дополнение к просто предложенным решениям, мы также можем их запустить. Представьте, например, что вы забыли настроить ключ приложения
. Вот как это выглядит, чтобы показать ошибки с зажиганием.
Если вы нажмете кнопку “создать ключ приложения”, мы сгенерируем и установим его в фоновом режиме ключ приложения
.
После обновления страницы приложение будет работать (если только оно не содержит других исключений).
Вы можете сделать это с помощью Фасад\Контракты на зажигание\Предоставляет решение
Для создания работоспособного решения, очень похожего на нерабочее решение). getSolution
Метод может возвращать либо выполняемое решение, либо не выполняемое решение.
namespace App\Exceptions; use Exception; use Facade\IgnitionContracts\ProvidesSolution; class CustomException extends Exception implements ProvidesSolution { public function getSolution(): Solution { return new MyRunnableSolution(); } }
Вот пример класса реализации MyRunnable решения
.
namespace App\Solutions; use Facade\IgnitionContracts\RunnableSolution; class MyRunnableSolution implements RunnableSolution { public function getSolutionTitle(): string { return 'You are doing it wrong'; } public function getSolutionDescription(): string { return 'You are doing something wrong, but we can fix it for you.'; } public function getDocumentationLinks(): array { return []; } public function getSolutionActionDescription(): string { return 'To fix this issue, all you need to do is press the button below.'; } public function getRunButtonText(): string { return 'Fix this for me'; } public function run(array $parameters = []) { // Your solution implementation } public function getRunParameters(): array { return []; } }
Вот как создать пользовательское исключение в зажигании Пользовательское исключение
То, как это выглядит.
Когда пользователь нажимает Исправьте это для меня
При восстановлении кнопки запустите
Функция будет выполнена.
Вы можете передать параметры из запроса, в котором произошло исключение, в запрос, который будет запускать решение. Уступите дорогу получите параметры запуска
Возвращает массив. Массив будет передан в run
.
Сделайте зажигание умнее
В результате у вас есть возможность использовать текстовые или выполняемые решения для улучшения ваших исключений, но иногда вам необходимо предоставлять удобные решения для встроенных исключений PHP, даже для исключений сторонних производителей, которые вы не можете контролировать своим кодом.
Мы разрешаем вам использовать “поставщиков решений” для решения проблем, упомянутых выше. Поставщики решений-это классы, которые могут быть подключены к процессу поиска решений с помощью зажигания. Когда возникает исключение и зажигание получает исключение, вы можете позвонить поставщику пользовательских решений, чтобы вернуть одно или несколько возможных решений для исключения.
Например, вы можете создать пользовательский поставщик решений для переполнения стека, который попытается найти соответствующие результаты переполнения стека для данного исключения и вернет их в качестве решения.
Мы также используем поставщиков решений для самого зажигания. Вот как выглядит поставщик решений:
use Throwable; use RuntimeException; use Facade\IgnitionContracts\Solution; use Facade\Ignition\Solutions\GenerateAppKeySolution; use Facade\IgnitionContracts\HasSolutionForThrowable; class MissingAppKeySolutionProvider implements HasSolutionForThrowable { public function canSolve(Throwable $throwable): bool { if (! $throwable instanceof RuntimeException) { return false; } return $throwable->getMessage() === 'No application encryption key has been specified.'; } public function getSolutions(Throwable $throwable): array { return [ new GenerateAppKeySolution() ]; } }
Эти поставщики решений могут автоматически зарегистрироваться в ignition следующим образом:
namespace App\Providers; use App\Solutions\GenerateAppKeySolution; use Facade\IgnitionContracts\SolutionProviderRepository; use Illuminate\Support\ServiceProvider; class YourServiceProvider extends ServiceProvider { /** * Register services. * * [@return](https://learnku.com/users/31554) void */ public function register(SolutionProviderRepository $solutionProviderRepository) { $solutionProviderRepository->registerSolutionProvider(GenerateAppKeySolution::class); } }
Таким образом, поставщик решений будет продолжать расширять возможности igniters для предоставления решений для ваших исключений, и мы не можем дождаться, чтобы увидеть, что предоставит сообщество!
Индивидуальное зажигание
Зажигание обладает масштабируемостью. Вы можете добавить новую вкладку или заменить вкладку по умолчанию.
Давайте взглянем на вкладку “фасад/обозначение” при условии, что этот пакет представляет собой оболочку, основанную на пространственном/laravel web tinker, которая позволяет использовать Artisan tinker
。
С установленной вкладкой “фасад/обозначение” вы можете использовать ее на странице ошибок Ремесленник тинкер
。
Мы также создали второй пакет, называемый редактором кода фасада/обозначения. Эта вкладка заменяет вкладку трассировки стека по умолчанию пользовательской вкладкой, которая позволяет редактировать код на экране ошибок. Он работает следующим образом.
Чтобы узнать, как добавлять пользовательские вкладки, посетите документацию по добавлению вкладок.