Чтобы явно связать параметр с моделью и создать пользовательское исключение, я должен (среди прочего) добавить следующее к 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
по причине, которую я не знаю.
Попробуйте это так:
$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;
});
Других решений пока нет …