У Трэвиса Бритса и Guillaumehanotel есть половина вашего ответа, но вы все еще не нашли детали.
От Travis Britz - Да, включите tenant_id в URI, чтобы он вводился в контроллер.
От Guillaumehanotel - также использовал Eloquent findOrFail в этом Id в вашем контроллере (или в любом другом классе, который используется контроллером для этого, например, в репозитории или классе обслуживания).
Последний кусок, который вы пропустили, хотя и обрабатывает ошибку. Вы можете сделать это в контроллере, если хотите, но я обычно предпочитаю установить для всей моей системы правило, что Illuminate\Database\Eloquent\ModelNotFoundException
Исключения, которые выходят из findOrFail()
, всегда должны приводить к 404.
Перейти к app/Exceptions/Handler.php
. Я почти уверен, что Laravel автоматически сгенерирует версию этого файла для мяса и картофеля, но если у вас ее еще нет, она должна выглядеть примерно так:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
/**
* Class Handler
* @package App\Exceptions
*/
class Handler extends ExceptionHandler
{
/**
* Render an exception into an HTTP response.
*
* For our API, we need to override the call
* to the parent.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $error)
{
$exception = [
'title' => 'Internal Error',
'message' => $error->getMessage();
];
$statusCode = 500;
$headers = [
'Content-Type', 'application/json'
];
return response()->json($exception, $statusCode, $headers, JSON_PRETTY_PRINT);
}
}
Laravel в основном имеет общесистемную try/catch
, которая сначала отправляет сюда все ошибки. Вот как ошибки отображаются в том, что браузер может интерпретировать, когда вы находитесь в режиме отладки, а не просто убивать процесс напрямую. Это также дает вам возможность применить несколько специальных правил.
Итак, все, что вам нужно сделать, это указать Handler::render()
изменить код ошибки по умолчанию, который возникает, когда он обнаруживает тип ошибки, который может исходить только от findOrFail()
. (Именно из-за этого всегда полезно создавать собственные «именованные исключения», даже если они абсолютно ничего не делают, кроме как наследуют базовый класс \Exception
.)
Просто добавьте это как раз перед тем, как render()
вернет что-либо:
if ($error instanceof Illuminate\Database\Eloquent\ModelNotFoundException) {
$statusCode = 404;
}