ZANIN блог
Контакты
Крути вниз
Фильтр по:
//Post title

Laravel 8 - пример создания сайта и API

14 Апр 2021Категория : Laravel 8

Laravel 8 - пример создания сайта и API

Информации по Laravel в интернете довольно много, так как это один из популярных или наверно самый попурярный PHP фреймворк. Но вот примеров создания сайта на новой Laravel 8 не очень много, а некоторые отличия от предыдущих версий есть.

Для разработки использую PHP 7.4, OpenServer, PHPStorm (прям только что вышла новая версия 2021), MySQL.

Создаем в PHPStorm новый чистый проект PHP. Далее заходим в настройки, для этого можно нажать комбанцию клавиш Ctrl+Alt+S. Кликаем, как показано на скриншоте. (кстати, можете скачать еще плагин Laravel для PHPStorm).

 

Laravel 8

Далее откроется следующее диалоговое окно

Laravel 8

Тут прописываем путь до php.exe той версии, которая вам необходима, можете и PHP8 уже поставить (debugger вам необязательно ставить). Также стоит настроить переменную PATH для PHP, иначе команды для Laravel не будут работать.

Далее на скриншоте показано, какую команду необходимо ввести, чтобы скачать Laravel и создать проект с помощью composer.

Laravel 8

После установки получаем следующую структуру. Так как у нас уже была папка и мы еще создали проект Laravel, то теперь нам необходимо перейти в папку с проектом, чтобы быть на одном уровне с файлами composer.json и artisan.

Laravel 8

Переходим на уровень ниже.

Laravel 8

Далее настраиваем в OpenServer доменное имя для нашего локального проекта. Прописываем путь до папки public, так как именно там находится index.php (на серверах Apache за это отвечает файл .htaccess, а на серверах Nginx просто указать путь к index.php.

Laravel 8

В результате получаем страницу приветствия работающего фреймворка Laravel.

Laravel 8

Далее создаем базу данных в PHPMyAdmin, который есть в OpenServer. Потом заходим в конфигурационный файл .env и добавляем настройки соединения к базе.

Laravel 8

Так как база создана, то удобнее ее просматривать в IDE PHPStorm, поэтому настроим соединение с MySQL.

Laravel 8

Laravel 8

На текущий момент у нас имеется следующая структура папок в контроллерах.

Laravel 8

Мы создадим новый контроллер, который будет добавлять товар в базу данных. Для этого вводим следующую команду php artisan make:controller Admin\Products\Products

Laravel 8

В результате получаем следующую структуру.

Laravel 8

Далее в папке routes открываем файл web.php и создаем маршрут (адрес). В 8-й версии как раз есть небольшое изменение в формировании маршрута. Мы прописываем путь до нашего контроллера use App\Http\Controllers\Admin\Products\Products; а в самом route вызываем класс и метод, который будет отрабатывать при переходе по этому адресу. Сейчас это делается так: Route::get('/admin/products/product/add', [Products::class, 'test_show']);

Но раньше это можно было сделать так: Route::get('/admin/products/product/add', 'App\Http\Controllers\Admin\Products\Products@test_show');

Laravel 8

В контроллере для примера напишем метод, который выводит в шаблон тестовые данные.

Laravel 8

В котроллере указан шаблон, в который выводятся данные 'admin.products.add' (первые два имени - это директории, а последнее имя шаблона).

Laravel 8

Так как в контроллере мы передаем объект с именем testArray, то и в шаблоне, чтобы его использовать, необходимо обратиться по такому же имени.

Laravel 8

Теперь, когда контроллер и маршрут работают и отдают данные в шаблон, нам надо сделать хранение данных в базе данных, а потом получать эти данные из базы и выводить в шаблон. Для этого нам сначала надо создать таблицу для наших данных. В данном случае, раз контроллер у нас называется Products, то и таблицу будет создавать для продуктов. Тут может быть 2 подхода. Мы сначала создаем модель командой

php artisan make:model Models\Products\Products -m

и тогда у нас создается миграция для данной модели, или можем сначала создать миграцию, а потом отдельно модель. Я сначала создам миграцию.

php artisan make:migration create_products_table --create=products

Laravel 8

Laravel 8

Laravel 8

В самом файле миграции в методе up мы описываем структуру таблицы с типами данных для каждой колонки таблицы.

Laravel 8

После этого вводим команду

php artisan migrate

Laravel 8

В итоге мы получаем таблицу с колонками, которые мы описали в миграции.

Laravel 8

Далее мы создаем модель. Для этого вводим команду

php artisan make:model Models\Products\Products

По идее, именно в Laravel 8 сделали, что модель изначально создается в папке Models, но у меня почему-то в этом примере не создалась, поэтому папки я прописал в ручную.

Laravel 8

Получаем созданную модель. По сути на этом все, так как наш класс модели и таблица имеют имя Products и products, то никаких дополнительных уточнений для связи модели с таблицей делать не нужно, так как для связи используется имя класса в нижнем регистре во множественном числе. Но если модель или таблица имеют разные имена, то необходимо в модель добавить protected $table = 'имя_таблицы';

Laravel 8

Теперь перейдем в контроллер Products и добавим в него метод. Данный метод я сделал так, чтобы показать, как добавить одну тестовую запись в таблицу через класс модели. Так как на начальном этапе вам не очень понадобиться знание Seeder.

Тут мы создаем экземпляр класса нашей модели, далее атрибутам экземпляра присваиваем значения, после этого у экземпляра есть метод save(), который сохраняет данные в базу данных.

Laravel 8

Вы наверно заметили, что модель называется не так, как мы ее назвали ранее. Это сделано для того, чтобы не было конфликта с контроллером, так как у котроллера и модели одинаковые имена. Поэтому я вызываемому классу модели присвоил новое имя во время вызова.

Laravel 8

Далее в созданном маршруте меняем вызываемый метод

Laravel 8

В шаблоне все удаляем, так как никаких переменных в шаблон мы не передаем.

Laravel 8

Переходим по адресу и получаем результат.

Laravel 8

Laravel 8

Теперь напишем функционал: как правильно получать данные из базы данных Laravel при помощи моделей и правильной архитектуры.

Создаем новый маршрут, который будет получать id записи и отдавать нам результат.

Laravel 8

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

Созданный метод get_product принимает id продукта, и передает его в метод getById. Метод getById принадлежит классу ProductService, который будет показан ниже. Котроллер Products в метод конструктора класса принимает экземпляр ProductService класса, затем этот экземпляр используется для вызова методов из данного класса.

Laravel 8

Создаем класс ProductService.

Laravel 8

В классе используются еще 2 других класса, но про них я напишу ниже. Из того, что надо знать на этом шаге. Мы создаем публичный метод getById, который вызывается в котроллере и в который передается id продукта. Сам метод возвращает array. Далее в самом методе вызывается другой метод get_by_id, который принадлежит классу ProductRepository. По сути, сервисный слой (класс ProductService) может удобно обрабатывать бизнес логику. Но пока сложной бизнес-логики нет, то я добавил класс, который также удобен при наличии различных сущностей в интернет-магазине. В данном случае класс CommonBody с методом create просто получает в себя экземпляр модели Products, который был получен запросом из базы данных в классе ProductRepository.

Laravel 8

Создаем класс ProductRepository.

Laravel 8

В самом классе ProductRepository мы вызываем класс нашей модели, чтобы использовать ее методы и получать данные из базы. Метод get_by_id получает id продукта и возвращает экземпляр класса (модели) Products. В модели мы используем статичный метод getOrFail, в который передаем id продукта. Этот метод возвращает нам результат в методе getById класса ProductService. В классе ProductService, когда мы получили этот результат, то отправляем результат в класс CommonBody в метод create.

Laravel 8

Создаем класс CommonBody.

Laravel 8

В данном классе публичный метод create принимает экземпляр модели Products и формирует тело продукта для вывода в шаблон или на API. Условно, если продукт имеет много данных, но его можно вывести в каталоге, на карточке товара, в корзине, на главной странице и так далее. И в каждом конкретном случае у товара могут быть различный набор данных, чтобы не передавать всегда все данные.

Laravel 8

Laravel 8

Laravel 8

Далее в шаблоне пишем следующее.

Laravel 8

И получаем результат.

Laravel 8

Ресурсный контроллер Laravel 8

В Laravel есть возможность создать базовый CRUD с помощью ресурсного контроллера. Ресурсный контроллер - это по сути такой же контроллер, но в нем уже есть заглушки для всех базовых методов CRUD и для этих операций можно использовать один общий маршрут. Подробнее сейчас покажу на примере создания CRUD в Laravel 8 с помощью ресурсного контроллера.

У меня уже был создан контроллер Products, взамен ему создадим контроллер Product. Команда создания ресурсного контроллера.

php artisan make:controller Admin\Products\Product --resource

Laravel 8

Получаем контроллер, в котором уже есть следующие методы: index, create, store, show, edit, update, destroy.

Laravel 8

Метод index() в котроллере делаем так. Тут происходит обращение к методу latest в классе ProductService. В метод мы передаем значение - количество выводимых товаров при вызове метода index.

Laravel 8

В классе ProductsService метод latest(). В методе latest мы обращаемся к методу get_latest в классе ProductRepository, который непосредственно работает с запросам в базу. Послу получения данных из базы, эти данные попадают в метод create() в классе ListBody, в котором создается тело товаров полученных в массиве.

Laravel 8

Метод get_latest() в классе ProductRepository. Тут мы уже используем доступные методы модели Products.

Laravel 8

Метод модели latest доступен нам потому, что при создании миграции в описании структуры таблицы у нас было следующее.

Laravel 8

Что создает в таблице следующие колонки.

Laravel 8

Далее данные передаются в метод create в класс ListBody. Этот класс отличается от CommonBody тем, что принимает не объект, а массив и собирается тело товаров по массиву.

Laravel 8

Laravel 8

Далее из контроллера эти товары передаются массивом в шаблон index.blade.php.

Laravel 8

Шаблон index.blade.php внедряется в шаблон app.blade.php в папке layouts. (все очень походе на работу с шаблонизатором в Django).

Laravel 8

Далее настраиваем маршрут для нашего контроллера в routes/web.php. Вместо методов get или post тут используется resource, который имеет один общий адрес для нашего контроллера. Особенность в том, что в данном случае маршруты для ресурсного контроллера уже заданы.

Laravel 8

Пример маршрутов из документации для ресурсных котроллеров Laravel.

Laravel 8

Можем посмотреть результат. У нас отработал метод index(), который вывел 5 последних записей.

Laravel 8

Теперь перейдем к методу create() в ресурсном контроллере.

Laravel 8

При переходе по маршруту

Laravel 8

Мы попадаем на шаблон add.blade.php. Шаблон без особого оформления, потому что потом переделаем все эти CRUD операции с использованием Vue.js.

Laravel 8

Внутри шаблона add.blade.php объясню основные моменты. Эта строка form action="{{ route('products.store') }}" method="POST" означает, что после отправки формы мы обратимся к маршруту products.store. Данное имя зарезервировано у ресурсного контроллера и вызывает метод store(), который создает модель. В каждом input мы передаем значение, которое проверяется в методе store().

Laravel 8

Метод store()

Laravel 8

  • 687

01. Об авторе

Александр Занин

Занимаюсь разработкой на Django,
а также бэкенд разработкой на PHP (Laravel, Slim).

Find on :

02. Свежие статьи

03. Категории

Готовы заказать проект?

© ZANIN 2019 / All rights reserved.
Контакты
Close