Есть ли хороший способ изящно обрабатывать неправильные вызовы методов в LiveWire?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Есть ли хороший способ изящно обрабатывать неправильные вызовы методов в LiveWire?

Сообщение 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);
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... n-livewire
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»