4. Контроллеры, маршруты, представления

01 Июня 2020 23:36 (Редактировано: 03 Июня 2020 22:56)

Контроллеры

Контроллеры в laravel - это те же контроллеры что и предполагаются паттерном проектирования mvc. Располагаются контроллеры в директории project.loc/app/Http/Controllers/.

Ссылка на русскоязычное сообщество - https://laravel.ru/docs/v5/controllers;

Ссылка на оригинальную документацию - https://laravel.com/docs/7.x/controllers#introduction

Создадим контроллер на примере REST.

php artisan make:controller RestTestController --resource

Таким образом, в папке project.loc/app/Http/Controllers/ создался RestTestController.php. В него из коробки взодят следующие методы:

  1. index. Выводит список ресурсов;
  2. create. Показывает форму создания нового ресурса;
  3. store. Осуществляет сохранение информации по вновьсоздаваемогму ресурсу в БД;
  4. show. Показывает ресурс по id;
  5. edit. Показывает форму редактирования ресурса;
  6. update. Осуществляет сохранение данных по редактируемому ресурсу;
  7. destroy. Удаляет ресурс из базы.

Для теста можно прописать метод index следующим образом:

public function index()
{
    dd(1);
}

Примечание. dd - это функция-дампер, которая входит в laravel.

Далее необходимо объяснить приложению как получить результат работы контроллера. Для этого существую маршруты.

Маршруты

Маршруты находятся в директории project.loc/routes/

За генерацию представления отвечает маршрут web.php. Из коробки его содержимое следующее:

Route::get('/', function () {
    return view('welcome');
});

Добавляем туда:

Route::resource('rest', 'RestTestController')->names('restTest');

Таким образом, мы задаем имя маршрута для ресурса - rest, отвечать за него будет - RestTestController

Проверить весь список маршрутов можно командой:

php artisan route:list

Список выглядит следующим образом:

После того как указали маршрут, можно попробовать зайти по адресу project.loc/rest и там должны увидеть результат выполнения dd():

Или указать в контроллере в методе Index вывод той же преветственной страницы 

return view('welcome');

Контроллеры приложения

Запускаем в терминале следующие команды:

php artisan make:controller Blog/BaseController
php artisan make:Controller Blog/PostController --resource

Таким образом, мы создали директорию Blog в директории с контроллерами, а также базовый контроллер и контроллер для поста в ней.

Базовый контроллер предполагается абстрактным. От него будут наследоваться все другие контроллеры, например, тот же PostController.

Прописываем в BaseController:

<?php

namespace App\Http\Controllers\Blog;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

abstract class BaseController extends Controller
{
    //
}

Прописываем в PostController, заодно заполним метод index:

<?php

namespace App\Http\Controllers\Blog;

use App\Models\BlogPost;
use Illuminate\Http\Request;

class PostController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //Так рекомендуется делать только для тестов т.к. ресурсов может быть много и будет сгенерировано много объектов, что сильно затормозит систему
        $items = BlogPost::all();

        return view('blog.posts.index', compact('items'));
    }
...

Примечание. compact() создает именованые плейсхолдеры для представления.

Таким образом, будет создан массив данных, который будет передан в шаблон blade.

Представления

Представления находятся в директории project.loc/resources/views/.

Создание представлений через терминал в laravel не предусмотрено, поэтому создаем там руками директорию blog/posts/ и добавляем туда файл index.blade.php.

<table>
    @foreach($items as $item)
        <tr>
            <td>{{ $item->id }}</td>
            <td>{{ $item->title }}</td>
            <td>{{ $item->created_at }}</td>
        </tr>
    @endforeach;
</table>