Маршрут Laravel - Проверьте, если ID не существует и показать 404 - PullRequest
2 голосов
/ 28 июня 2019

Я не хочу показывать страницу, если идентификатор не существует.

Как я могу проверить это в моих маршрутах web.php в Laravel?

В настоящее время у меня есть следующееroute:

Route::get('/public/{project_id}', 'ProjectController@public');

Как выполнить условную проверку, чтобы узнать, существует ли project_id?

Я обнаружил, что в маршрутизации была опция для Route :: bind документы - это решение?Спасибо

Примечание по обновлению: Немного отличается от подхода Laravel 4, так как привязка к классу маршрута, кажется, запечена.

Ответы [ 5 ]

5 голосов
/ 28 июня 2019

То, что вы хотите использовать, называется Привязка модели маршрута . Laravel делает то, что вы хотите из коробки. Если идентификатор отсутствует в базе данных, он показывает страницу 404. Однако вам необходимо изменить маршрут:

Если ваша Модель называется Project, маршрут должен выглядеть следующим образом:

Route::get('/public/{project}', 'ProjectController@public');

А ваш ProjectController должен выглядеть так:

public function public(Project $project) {

Таким образом, Laravel автоматически разрешает проект с указанным вами идентификатором и вставляет его в переменную $project. Если записи с идентификатором не существует, laravel перенаправляет на 404

2 голосов
/ 28 июня 2019

Добавление к ответу Патрика Шокке.

Если вы не хотите использовать привязку модели маршрута, вы можете явно указать в контроллере

public function public($project_id) {
    $projectExists = Project::where('id', $project_id)->exists();

    abort_unless($projectExists, 404, 'Project not found');

   ...
    }
}
1 голос
/ 28 июня 2019

Просто используйте метод Laravel's findOrFail(). Этот метод будет получать первый результат запроса; однако, если результат не найден, автоматически отправляется HTTP-ответ 404.

public function public ($project_id) {
    $project = Project::findOrFail($project_id);
}

источник: https://laravel.com/docs/5.8/eloquent#retrieving-single-models

1 голос
/ 28 июня 2019

Этого можно добиться с помощью функции привязки модели маршрута laravel

ваш маршрут будет

Route::get('/public/{project}', 'ProjectController@public');

ваш контроллер будет

public function public(Project $project) {
       // Do your work here using $project model
       //  If a matching model instance is not found in the database, a 404 HTTP response will automatically be generated. 
}
0 голосов
/ 28 июня 2019

Вы можете проверить, не существует ли project_id, а затем вернуть ошибку 404, вызвав функцию abort().

  public function public($project_id) {
        $project_id_exist = Project::where('id', $project_id)->first();
        if(!$project_id_exist){
            return abort(404);
        }
    }
...