После того как список готов, можно переходить к просмотру каждого элемента. Как обычно начинаем с маршрутизации:
<?php
# id – параметр, который зависит от конкретной статьи
# Фигурные скобки нужны для описания параметров маршрута
Route::get('articles/{id}', [ArticleController::class, 'show'])
->name('articles.show');
В этом месте у маршрута появляется динамическая часть, идентификатор статьи. Подобный маршрут обрабатывает все страницы, имеющие вид /articles/<идентификатор статьи>
, примеры:
/articles/1
/articles/100
/articles/what-is-js
Этот идентификатор используется в обработчике, для выборки из базы нужной статьи.
<?php
namespace App\Http\Controllers;
use App\Models\Article;
class ArticleController extends Controller
{
// ... другие обработчики
public function show($id)
{
$article = Article::findOrFail($id);
return view('article.show', compact('article'));
}
}
Параметр id, определенный в маршруте, приходит в обработчик в виде аргумента. Имя этого аргумента может быть любым, для Laravel имеет значение только порядок. Если параметров в маршруте больше одного, то они передадутся в обработчик в том же порядке, в котором они определены в маршруте:
<?php
Route::get('articles/{articleId}/comments/{id}', function ($articleId, $id) {
// ...
});
Затем происходит выборка статьи из базы данных. Для нее используется метод findOrFail
, а не find
. Почему? Дело в том, что в большинстве случаев просмотр конкретной сущности должен вернуть ошибку 404, если самой сущности не существует. Метод find
никак не помогает обработать эту ситуацию, он возвращает null
. Дальше программисту придется делать проверку на существование и самому формировать правильный HTTP-ответ. Но так как задача очень частая, то разработчики Laravel решили ее внутри фреймворка. С одной стороны они добавили метод findOrFail
, который выбрасывает исключение в случае отсутствия записи. С другой, добавили специальную обработку данных исключений на уровне обработки запросов.
И последний шаг, передача статьи в шаблон. Здесь ничего нового.
Шаблон:
@extends('layouts.app')
@section('content')
<h1>{{$article->name}}</h1>
<div>{{$article->body}}</div>
@endsection
Самостоятельная работа
- Выполните все шаги из теории.
- Убедитесь что при запросе страницы /articles/<идентификатор> у вас выводится конкретная статья.
- Сделайте имя статьи в списке статей ссылкой на конкретную статью.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.