(Явное связывание) Настройка логики разрешения & amp; Настройка & quot; Не найдено & quot; Поведение

Чтобы явно связать параметр с моделью и создать пользовательское исключение, я должен (среди прочего) добавить следующее к RouteServiceProvider:

$router->model('parameter', 'App\Model', function () {
throw new CustomNotFoundException;
});

Чтобы настроить логику разрешения явного связывания, я должен добавить следующее к RouteServiceProvider:

$router->bind('parameter', function ($parameter) {
return App\Model::where('field', $parameter)->first();
});

Моя проблема в том, что мне нужны оба, но, видимо, не могу. Если я свяжу параметр с моделью, а также настрою логику разрешения, это не приведет к CustomNotFoundExceptionвместо этого будет выброшено значение по умолчанию ModelNotFoundException,

Чтобы четко подвести итог моей цели: я хочу настроить логику разрешения и выдать пользовательское исключение, если не удается найти запись.

РЕДАКТИРОВАТЬ Я попробовал это согласно предложению от @Maraboc:

$router->bind('parameter', function ($parameter) {
try {
return App\Model::where('field' => $parameter)->first();
} catch (Exception $e) {
throw new CustomNotFoundException;
}
});

Это все равно бросит ModelNotFoundException по причине, которую я не знаю.

2

Решение

Попробуйте это так:

$router->bind('parameter', function ($parameter) {
try {
return App\Model::where('field' => $parameter)->firstOrFail();
} catch (ModelNotFoundException $e) {
throw new CustomNotFoundException;
}
});

ИЛИ в App\Exceptions\Handler добавить это к render метод:

if ($e instanceof ModelNotFoundException) {
throw new CustomNotFoundException;
}

А также use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;

ИЛИ другой обходной путь должен сделать так:

$router->bind('parameter', function ($parameter) {

$model = App\Model::where('field' => $parameter)->first();

if ( ! $model) {
throw new CustomNotFoundException;
}

return $model;
});
1

Другие решения

Других решений пока нет …