вопросы пишите мне в телеграмм +375298176892
можно скачать офлайн версию сайта: code.mu old.code.mu

Практика Laravel на маршруты и Blade

Урок представляет собой практику с задачами на комбинации маршрутов и команд шаблонизатора Blade.

Статьи

Создайте контроллер Post (статья). В конструкторе класса запишите в свойство $this->posts массив со статьями:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class PostController extends Controller { private $posts; public function __construct() { $this->posts = [ 1 => [ 'title' => 'Тайтл страницы 1', 'author' => 'Автор страницы 1', 'date' => 'Дата публикации страницы 1', 'teaser' => 'Короткое описание страницы 1', 'text' => 'Полный текст страницы 1', ], 2 => [ 'title' => 'Тайтл страницы 2', 'author' => 'Автор страницы 2', 'date' => 'Дата публикации страницы 2', 'teaser' => 'Короткое описание страницы 2', 'text' => 'Полный текст страницы 2', ], 3 => [ 'title' => 'Тайтл страницы 3', 'author' => 'Автор страницы 3', 'date' => 'Дата публикации страницы 3', 'teaser' => 'Короткое описание страницы 3', 'text' => 'Полный текст страницы 3', ], 4 => [ 'title' => 'Тайтл страницы 4', 'author' => 'Автор страницы 4', 'date' => 'Дата публикации страницы 4', 'teaser' => 'Короткое описание страницы 4', 'text' => 'Полный текст страницы 4', ], 5 => [ 'title' => 'Тайтл страницы 5', 'author' => 'Автор страницы 5', 'date' => 'Дата публикации страницы 5', 'teaser' => 'Короткое описание страницы 5', 'text' => 'Полный текст страницы 5', ], ]; } } ?>

Во всех представлениях контроллера Post используйте следующую верстку для макета сайта:

<!DOCTYPE html> <html> <head> <title></title> </head> <body> <header> <h1></h1> </header> <main> </main> </body> </html>

В контроллере Post сделайте действие showOne, маршрут к которому будет следующий: /posts/:id/, где :id будет представлять собой номер поста в массиве $this->posts. Данное действие должно будет выводить запрошенный пост (все поля, кроме короткого описания).

Используйте следующую верстку для представления созданного действия:

<div class="info"> <span class="date">дата публикации</span> <span class="author">автор страницы</span> </div> <div class="text"> полный текст страницы </div>

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

<!DOCTYPE html> <html> <head> <title>тайтл страницы</title> </head> <body> <header> <h1>тайтл страницы</h1> </header> <main> <div class="info"> <span class="date">дата публикации</span> <span class="author">автор страницы</span> </div> <div class="text"> полный текст страницы </div> </main> </body> </html>

Модифицируйте предыдущую задачу так, чтобы если в адресную строку передан некорректный id поста, то пользователю показывалось следующее представление (сделать отдельным файлом):

<div class="text"> Извините, страницы с :id не существует! </div>

Вместо :id должен подставится номер запрошенного поста.

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

<!DOCTYPE html> <html> <head> <title>Станицы с :id не существует!</title> </head> <body> <header> <h1>Извините, страница с :id не найдена!</h1> </header> <main> <div class="text"> Извините, страницы с :id не существует! </div> </main> </body> </html>

В контроллере Post сделайте действие showAll, маршрут к которому будет следующий: /posts/.

Данное действие должно показывать на экран список всех постов с их тайтлами и короткими описаниями, но без полного текста. Каждый пост должен иметь ссылку на свое полное описание (то есть на страницу действия showOne для этого поста).

Верстка информации об одном посте (она должна повторяться в цикле для каждого поста):

<div class="post"> <h2>тайтл страницы</h2> <div class="info"> <span class="date">дата публикации</span> <span class="author">автор страницы</span> </div> <div class="text"> короткое описание страницы </div> <div class="more"> <a href="">ссылка на пост</a> </div> </div>

Полная верстка, отправляемая в браузер, для текущего массива $this->posts должна выглядеть так:

<!DOCTYPE html> <html> <head> <title>Список страниц</title> </head> <body> <header> <h1>Список страниц</h1> </header> <main> <div class="post"> <h2>Тайтл страницы 1</h2> <div class="info"> <span class="date">Дата публикации страницы 1</span> <span class="author">Автор страницы 1</span> </div> <div class="text"> Короткое описание страницы 1 </div> <div class="more"> <a href="/post/1/">подробнее...</a> </div> </div> <div class="post"> <h2>Тайтл страницы 2</h2> <div class="info"> <span class="date">Дата публикации страницы 2</span> <span class="author">Автор страницы 2</span> </div> <div class="text"> Короткое описание страницы 2 </div> <div class="more"> <a href="/post/2/">подробнее...</a> </div> </div> <div class="post"> <h2>Тайтл страницы 3</h2> <div class="info"> <span class="date">Дата публикации страницы 3</span> <span class="author">Автор страницы 3</span> </div> <div class="text"> Короткое описание страницы 3 </div> <div class="more"> <a href="/post/3/">подробнее...</a> </div> </div> <div class="post"> <h2>Тайтл страницы 4</h2> <div class="info"> <span class="date">Дата публикации страницы 4</span> <span class="author">Автор страницы 4</span> </div> <div class="text"> Короткое описание страницы 4 </div> <div class="more"> <a href="/post/4/">подробнее...</a> </div> </div> <div class="post"> <h2>Тайтл страницы 5</h2> <div class="info"> <span class="date">Дата публикации страницы 5</span> <span class="author">Автор страницы 5</span> </div> <div class="text"> Короткое описание страницы 5 </div> <div class="more"> <a href="/post/5/">подробнее...</a> </div> </div> </main> </body> </html>

Продукты

Создайте контроллер Product (продукт). В конструкторе класса запишите в свойство $this->categories массив с категориями и продуктами, принадлежащими этим категориям (в данном массиве ключ cost - цена продукта, а inStock - наличие продукта на складе):

<?php $this->categories = [ 1 => [ 'name' => 'Категория 1', 'products' => [ 1 => [ 'name' => 'Продукт 1', 'cost' => '300', 'inStock' => true, 'desc' => 'Описание продукта 1' ], 2 => [ 'name' => 'Продукт 2', 'cost' => '400', 'inStock' => true, 'desc' => 'Описание продукта 2' ], 3 => [ 'name' => 'Продукт 3', 'cost' => '500', 'inStock' => false, 'desc' => 'Описание продукта 3' ], ], ], 2 => [ 'name' => 'Категория 2', 'products' => [ 1 => [ 'name' => 'Продукт 1', 'cost' => '700', 'inStock' => true, 'desc' => 'Описание продукта 1' ], 2 => [ 'name' => 'Продукт 2', 'cost' => '800', 'inStock' => false, 'desc' => 'Описание продукта 2' ], 3 => [ 'name' => 'Продукт 3', 'cost' => '900', 'inStock' => false, 'desc' => 'Описание продукта 3' ], ], ], ]; ?>

В контроллере Product сделайте действие showProduct, маршрут к которому будет следующий: /product/:category_id/:product_id, где :category_id будет представлять собой номер категории в массиве $this->categories, а :product_id - номер продукта в подмассиве products соответствующей категории.

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

Пусть наличие на складе выводится либо строкой 'есть в наличии', либо строкой 'нет в наличии'.

В контроллере Product сделайте действие showCategory, маршрут к которому будет следующий: /product/:category_id/, где :category_id будет представлять собой номер категории в массиве $this->categories.

Данное действие должно будет выводить список продуктов данной категории. Пусть в списке будет название продукта и цена.

Название продукта должно быть ссылкой на страницу одного продукта (то есть на действие showProduct).

Отредактируйте представление действия showProduct так, чтобы название категории продукта было ссылкой на список продуктов данной категории.

В контроллере Product сделайте действие showCategoryList, маршрут к которому будет следующий: /categories/.

Данное действие должно будет выводить список всех категорий. Пусть выводится название категории и количество продуктов в этой категории.

Название категории должно быть ссылкой на список продуктов данной категории.