Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Фактически, любой круд состоит из 7 маршрутов, контроллера и шаблонов. Причем большая часть этого кода идентична, особенно маршруты. Они не содержат логики и всегда строятся по одному и тому же принципу.

Laravel частично заимствовал из Rails еще один механизм, который называется "ресурсный роутинг". Он упрощает создание типичных крудов, за счет полной унификации всех маршрутов и способах их обработки. Вместо описания 7 разных маршрутов, ресурсный роутинг позволяет указать один метамаршрут:

<?php

Route::resource('/articles', 'ArticleController');

Внутри себя он превращается в те самые семь маршрутов, которые мы реализовывали в предыдущих уроках. Их можно увидеть с помощью команды artisan:

$ php artisan route:list
+-----------+-------------------------+------------------+------------------------------------------------+
| Method    | URI                     | Name             | Action                                         |
+-----------+-------------------------+------------------+------------------------------------------------+
| GET|HEAD  | /                       |                  | Closure                                        |
| GET|HEAD  | articles                | articles.index   | App\Http\Controllers\[email protected]   |
| POST      | articles                | articles.store   | App\Http\Controllers\[email protected]   |
| GET|HEAD  | articles/create         | articles.create  | App\Http\Controllers\[email protected]  |
| GET|HEAD  | articles/{article}      | articles.show    | App\Http\Controllers\[email protected]    |
| PUT|PATCH | articles/{article}      | articles.update  | App\Http\Controllers\[email protected]  |
| DELETE    | articles/{article}      | articles.destroy | App\Http\Controllers\[email protected] |
| GET|HEAD  | articles/{article}/edit | articles.edit    | App\Http\Controllers\[email protected]    |
+-----------+-------------------------+------------------+------------------------------------------------+
# Обратите внимание на имя плейсхолдера. Ниже станет понятно почему здесь article, а не id

Довольно неплохо. В проектах где подобных крудов много (любой типичный веб-проект), ресурсный роутинг очень помогает. Он не просто сокращает количество кода, но и дает хорошую унификацию. Нужно меньше думать и меньше спорить. Все уже спроектировано.

Следующий шаг – упрощение контроллера. Во-первых можно сразу сгенерировать контроллер, со всеми нужными обработчиками. Во-вторых, этот контроллер можно интегрировать с нужной моделью:

php artisan make:controller ArticleController --resource --model=Article

На выходе получим такой контроллер:

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function show(Article $article)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function edit(Article $article)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Article $article)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function destroy(Article $article)
    {
        //
    }

Обратите внимание на параметры обработчиков. Laravel самостоятельно находит нужную сущность и достает ее из базы данных. Это позволяет хоть немного, но сократить код.

Ресурсы могут быть вложенными. Это дает возможность строить пути, отражающие зависимости между сущностями на сайте:

# Примеры с хекслета

# Урок /courses/{course}/lessons/{lesson}
/courses/js-testing/lessons/asserts
# Список пройденных курсов /u/{user}/courses
/u/mokevnin/courses

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

# Список
/entities/{entity}/subentities

# Сущность
/entities/{entity}/subentity/{subentity}

# Все остальные маршруты строятся по такому же принципу.
# Впереди добавляется /entities/{entity}.

Например вот так выглядит ресурс комментарии к статьям:

<?php

Route::resource('/articles.comments', 'ArticleCommentController');

Для вложенного ресурса, в экшены, кроме самой сущности передается и родительская сущность:

<?php

# /articles/{article}/comments/{comment}
# Обе сущности можно получить через параметры
public function edit(Article $article, ArticleComment $comment)
{
    return view('article_comment.edit', compact('article', 'comment'));
}

Немного по другому начинает работать хелпер route. Для построения ссылок, там где участвуют оба ресурса, нужно использовать массив для их передачи:

<?php

route('article.comments.edit', [$article, $comment]);

Заключение

Ресурсный роутинг – удобный механизм позволяющий немного упростить создание крудов (CRUD). Он берет на себя много работы и дает программисту возможность сосредоточиться на логике.

Существует негласное правило, о том насколько вложенным может быть вложенный роутинг. Считается, что не стоит делать более одного вложения. Иначе ссылки получаются очень длинными, а код начинает усложняться, так как приходится оперировать сразу тремя сущностями и более.

Самостоятельная работа

  1. Удалите все маршруты связанные со статьями
  2. Удалите контроллер статей (шаблоны оставьте)
  3. Добавьте ресурсный роутинг articles
  4. Сгенерируйте для него контроллер ArticleController
  5. Реализуйте CRUD

Дополнительные материалы

  1. Ресурсный роутинг
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →