Большинство моих компонентов расширяются из абстрактного класса, в котором я регистрирую некоторую обработку исключений с помощью перехватчика жизненного цикла исключений
use App\Livewire\BaseComponent;
class MyComponent extends BaseComponent
{
...
}
abstract class BaseComponent extends \Livewire\Component
{
public function exception(\Throwable $e, \Closure $stopPropagation): void
{
if ($e instanceof ModelNotFoundException) {
Flux::toast(text: '...'));
$stopPropagation();
}
if ($e instanceof AuthorizationException) {
Flux::toast(text: 'Unauthorized'));
$stopPropagation();
}
}
}
Пока это работает. например
#[On('show-thing')]
public function showThing($id)
{
$thing = ThingModel::findOrFail($id);
}
Вместо общей ошибки 404 будет отображаться всплывающее сообщение в странном модальном окне.
public function doThing(): void
{
Gate::authorize('do-thing');
}
Вместо общей ошибки 403 будет отображаться всплывающее сообщение в странном модальном окне.
Это также работает в JavaScript.
window.dispatchEvent(new CustomEvent('show-thing', { detail: { id: -999 } })); // makes a toast pop up if -999 is not a valid id
Livewire.find('....').doThing() // makes a toast pop up if I'm not authorized
Пока все хорошо.
То, что я пытаюсь предотвратить (или, скорее, обработать), — это исключения, возникающие из-за неправильного вызова метода.
Например, если попытаться открыть консоль js и сделать
Livewire.first().unexistentMethod();
Это вызовет исключение Livewire\Exceptions\MethodNotFoundException, но даже если я добавлю
if ($e instanceof MethodNotFoundException) {
Log::warning('...')
$stopPropagation();
}
к моему обработчику исключений он вообще не попадает. Нужно ли мне обрабатывать это каким-то другим способом?
Само исключение запускается внутри класса поставщика Livewire.
namespace Livewire\Mechanisms;
class HandleComponents extends Mechanism
{
...
protected function callMethods($root, $calls, $context)
{
$returns = [];
foreach ($calls as $idx => $call) {
$method = $call['method'];
$params = $call['params'];
$earlyReturnCalled = false;
$earlyReturn = null;
$returnEarly = function ($return = null) use (&$earlyReturnCalled, &$earlyReturn) {
$earlyReturnCalled = true;
$earlyReturn = $return;
};
$finish = trigger('call', $root, $method, $params, $context, $returnEarly);
if ($earlyReturnCalled) {
$returns[] = $finish($earlyReturn);
continue;
}
$methods = Utils::getPublicMethodsDefinedBySubClass($root);
// Also remove "render" from the list...
$methods = array_values(array_diff($methods, ['render']));
// @todo: put this in a better place:
$methods[] = '__dispatch';
if (! in_array($method, $methods)) {
throw new MethodNotFoundException($method);
}
if (config('app.debug')) $start = microtime(true);
$return = wrap($root)->{$method}(...$params);
if (config('app.debug')) trigger('profile', 'call'.$idx, $root->getId(), [$start, microtime(true)]);
$returns[] = $finish($return);
}
$context->addEffect('returns', $returns);
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-livewire
Есть ли хороший способ изящно обрабатывать неправильные вызовы методов в LiveWire? ⇐ Php
Кемеровские программисты php общаются здесь
1761754225
Anonymous
Большинство моих компонентов расширяются из абстрактного класса, в котором я регистрирую некоторую обработку исключений с помощью перехватчика жизненного цикла исключений
use App\Livewire\BaseComponent;
class MyComponent extends BaseComponent
{
...
}
abstract class BaseComponent extends \Livewire\Component
{
public function exception(\Throwable $e, \Closure $stopPropagation): void
{
if ($e instanceof ModelNotFoundException) {
Flux::toast(text: '...'));
$stopPropagation();
}
if ($e instanceof AuthorizationException) {
Flux::toast(text: 'Unauthorized'));
$stopPropagation();
}
}
}
Пока это работает. например
#[On('show-thing')]
public function showThing($id)
{
$thing = ThingModel::findOrFail($id);
}
Вместо общей ошибки 404 будет отображаться всплывающее сообщение в странном модальном окне.
public function doThing(): void
{
Gate::authorize('do-thing');
}
Вместо общей ошибки 403 будет отображаться всплывающее сообщение в странном модальном окне.
Это также работает в JavaScript.
window.dispatchEvent(new CustomEvent('show-thing', { detail: { id: -999 } })); // makes a toast pop up if -999 is not a valid id
Livewire.find('....').doThing() // makes a toast pop up if I'm not authorized
Пока все хорошо.
То, что я пытаюсь предотвратить (или, скорее, обработать), — это исключения, возникающие из-за неправильного вызова метода.
Например, если попытаться открыть консоль js и сделать
Livewire.first().unexistentMethod();
Это вызовет исключение Livewire\Exceptions\MethodNotFoundException, но даже если я добавлю
if ($e instanceof MethodNotFoundException) {
Log::warning('...')
$stopPropagation();
}
к моему обработчику исключений он вообще не попадает. Нужно ли мне обрабатывать это каким-то другим способом?
Само исключение запускается внутри класса поставщика Livewire.
namespace Livewire\Mechanisms;
class HandleComponents extends Mechanism
{
...
protected function callMethods($root, $calls, $context)
{
$returns = [];
foreach ($calls as $idx => $call) {
$method = $call['method'];
$params = $call['params'];
$earlyReturnCalled = false;
$earlyReturn = null;
$returnEarly = function ($return = null) use (&$earlyReturnCalled, &$earlyReturn) {
$earlyReturnCalled = true;
$earlyReturn = $return;
};
$finish = trigger('call', $root, $method, $params, $context, $returnEarly);
if ($earlyReturnCalled) {
$returns[] = $finish($earlyReturn);
continue;
}
$methods = Utils::getPublicMethodsDefinedBySubClass($root);
// Also remove "render" from the list...
$methods = array_values(array_diff($methods, ['render']));
// @todo: put this in a better place:
$methods[] = '__dispatch';
if (! in_array($method, $methods)) {
throw new MethodNotFoundException($method);
}
if (config('app.debug')) $start = microtime(true);
$return = wrap($root)->{$method}(...$params);
if (config('app.debug')) trigger('profile', 'call'.$idx, $root->getId(), [$start, microtime(true)]);
$returns[] = $finish($return);
}
$context->addEffect('returns', $returns);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79795008/is-there-a-good-way-to-gracefully-handle-bad-method-calls-in-livewire[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия