Найти тему
Интересные истории

Laravel - Разработка CMS/Магазина. часть 1

Оглавление

Что мы тут делаем?

Эта серия уроков будет посвящена созданию на основе Фреймворка Laravel Интернет-Магазина с Панелью управления, для возможности изменяя страниц, товаров и категорий.

В первую очередь нам понадобиться развернуть проект желательно это сделать под Linux, я не буду рассказывать о том как настроить Apache, MySQL и т.п., вы можете развернуть проект на своём хостинге или найти нужную информацию в интернете как настроить LAMP на VirtualBox или VMWare, я лично для данного урока использую VMWare. Так же у меня установлен PHPStorm в котором подключен плагин Laravel для удобства разработки.

И так начнем. Развернем проект с помощью composer. Для этого нам понадобиться в консоли написать “composer create-project --prefer-dist laravel/laravel shop” (/usr/local/bin/composer composer create-project --prefer-dist laravel/laravel shop из под root ) “shop в данном случае это название папки куда будет установлен проект”

Пока идет установка проекта, откроем PHPStrom чтобы он начал индексировать проект и включим плагин Laravel.

И так наш проект готов. Теперь можно заняться проектированием базы данных.

Обычно в интернет магазин требуется:

1. Страницы (это страницы типа: О Компании, контакты и т.д.)
2. Новости
3. Категории товаров
4. Сами товары
5. И заказы
6. Возможно потребуется еще какие то дополнения типа статей, подписчиков или галерея. но в данном случае этого не требуется.

Приступим

1. Структура Базы данных и Миграции

Начнем с самого простого, Страницы. В страницах требуется не очень много полей, нам понадобиться Идентификатор страницы, Название страницы и Описание страницы, так же позже мы рассмотрим добавление возможности ЧПУ, и СЕО параметров.

Создадим миграцию с помощью команды php artisan make:migration pages –create=page (более подробно вы можете прочитать об миграция на сайте laravel.com). И так у нас создался файл для нашей миграции. Давайте сразу создадим еще не сколько миграций для остальных наших пунктов.

1. Для раздела новости php artisan make:migration news_migration –create=news (это для раздела новостей)
2. Создаём миграцию для наших категорий которые в последующим будут использоваться для товаров в связке по Идентификатору категории Php artisan make:migration categoryes –create=category
3. Создадим миграцию для товаров Php artisan make:migration products –create=product
4. так же нам понадобиться изображения для товаров Php artisan make:migration products_images –create=product_image
5. теперь создадим миграцию для заказов, в эту таблицу будет записываться общая информация про заказ, ФИО, телефон и т.д. а товары которые были заказаны вынесем в отдельную таблицу Php artisan make:migration orders –create=order
6. Php artisan make:migration orders_products –create=order_product

Раздел "Страницы"

Теперь мы можем начать проектировать базу данных, изменяя файлы миграций. Вернёмся в PHPStorm. Откроем проект, и в папке database/migrations видим все наши созданные ранее миграции… идём по порядку – сначала откроем миграцию pages, как мы видим часть кода уже создана и уже есть Идентификатор страницы и время создания и обновления страницы, нам осталось только добавить еще дополнительные поля, которые потребуется.

Добавим поле title, которое будет отвечать за Название страницы $table->string(‘title’).

Добавим поле description, которое будет отвечать за текст самой страницы $table->text(‘description’);

Всё со страницами мы закончили, перейдем к новостям, там тоже ничего сложного.

Раздел "Новости"

Нам понадобятся поля Дата новости, Название и Короткое описание и полное описание новости.

И так, создаём поле для даты новости с помощью $table->date(‘date’).
Создадим поле name для названия новости $table->string(‘name’)
Создадим поле notice для которого описание новости $table->text(‘notice’)
И конечно же полное описание description $table->text(‘description’)

С новостями закончили.

Раздел "Интернет магазин"

Давайте перейдем к более интересному к категориям товаров. Здесь нам понадобится скажем так создать дерево поэтому нам понадобится родительский Индетификатор для определения под категорий или же наоборот.

Создадим поле parent_id которое будет отвечать за родительскую категорию которое будет по умолчанию NULL. У метода integer есть три параметра, первый это название поле, второе это назначение его auto increment (по умолчанию у него значение стоит false) и третий параметр unsigned, который тоже по умолчанию false. Но методами Laravel при создании поля increment поле создается с параметром unsigned true, соответственно чтобы создать связь между полем parent_id и id нам нужно так же сделать поле parent_id unsigned true. $table->integer(‘parent_id’, false, true).

Создадим поле name для названия категории $table->string(‘name’)
Создадим поле description для описание категории $table->text(‘description’)
Теперь создадим индекс для parent_id чтобы в последующем сделать с ним связь $table->index(‘parent_id’)

Теперь нужно создать саму связь между parent_id и id

Метод foreign имеет два параметра первый это название поле, второе названия ключа, желательно всегда его заполнять иначе в последующем, возможно, будут конфликты, так как если не указать второй параметр он будет подставлять по умолчанию в название ключа название поля. Я обычно подставляю в начало название категории в данном случае это будет выглядеть так:

$table->foreign(‘parent_id’, ‘category_parent_id’)

Далее нам нужно привязать его к полю методом references(‘id’) потом указываем для какой таблицы связка в нашем случае это category и методом on записываем on(‘category’)

Так же нам понадобится сделать тригеры, которые будут срабатывать при удалении или обновлении родительской записи.. сделаем onDelete(‘SET NULL’) то есть при удалении родительской категории под категория становиться автоматически родительской, и при обновлении основной записи сделаем onUpdate(‘CASCADE’), т.е. если измениться по каким то причинам идентификатор родительской категории то подкатегории автоматически изменят значение в parent_id.

Теперь перейдем к товарам. Откроем миграцию products и сразу же добавим поле category_id которое будет связано с таблицей category $table->integer(‘category_id’, false, true)->nullable()

Добавим поле название $table->string(‘name’).
Добавим поле короткое описание $table->text(‘notice’);
Добавим поле полное описание $table->text(‘description’);
Добавим поле цена $table->decimal(‘price’)

Зачастую требуется временно отключить товар от показа, в этом случае мы просто добавим дополнительное поле active которое будет принимать значение 0 если выключено или 1 если включено. $table->boolean(‘active’) и сделаем чтобы в поле по умолчанию добавлялось значение 0 при добавлении нового товара методом default(‘0’)

Нуу и по примеру с таблицей категории мы создадим индекс для поле category_id и дополнительно создадим поле индекс для active

$table->index(‘category_id’);
$table->index(‘active’);

И сделаем связь между таблицей product и category

$table->foreign('category_id', 'product_category_id')->references('id')->on('category')->onDelete('SET NULL')->onUpdate('CASCADE');

Продолжим делать миграции, изображения для товаров тут в принципе наподобие самих товаров только поля немного отличаются. Нам понадобятся Идентификатор товара, расширения файла, и флажок что это основное изображение или нет.

Создадим поле идентификатора товара $table->integer(‘product_id’, false, true)->nullable()

Создадим поле расширение файла $table->string(‘extension’, 10);

Создадим поле, что это основная фотография товара $table->smallInteger(‘main’)->nullable()

И теперь создадим два индекса для product_id и для поля main.

$table->index(‘product_id’);
$table->index(‘main’);

И опять же создадим связку между таблицей product_image и product

$table->foreign('product_id', 'product_image_product_id')->references('id')->on('product')->onDelete('CASCADE')->onUpdate('CASCADE');

Единственное отличие что при тригере onDelete мы сделали CASCADE чтобы если мы удаляем запись товара, вместе с ним удалялись все фотографии.. конечно же сначала нужно будет в коде предусмотреть удаление самих файлов прежде чем удалять запись товара, но об этом чуть позже.

И осталось две миграции - "заказы" и "список товаров в заказе"

Раздел "Заказы"

Добавим поле дату и время заказа $table->datetime(‘date’)
Добавим поле имя заказчика $table->string(‘name’)
Добавим поле телефон заказчика $table->string(‘phone’)
Добавим поле email заказчика $table->string(‘email’)
И конечно добавим комментарии заказчика к заказу $table->text(‘comment’)

Теперь сделаем миграцию заказанные товары

Добавим поле Идентификатор товара product_id $table->integer(‘product_id’, false, true)
Добавим поле Идентификатор заказа order_id $table->integer(‘order_id’, false, true)

Добавим поле Цена товара (так как цена может меняться в самом товаре, мы сделаем запись цену в этой таблице, чтобы потом при необходимости можно вывести статистику по заказам ). $table->decimal(‘price’)

Добавим поле Кол-во $table->integer(‘quantity’)
Теперь сделаем два индекса для product_id и order_id

$table->index(‘product_id’);
$table->index(‘order_id’);

И сделаем связку между двумя таблицами с product и order

$table->foreign('product_id', 'order_product_product_id’)->references('id')->on('product')->onDelete('RESTRICT')->onUpdate('RESTRICT');

Для product_id мы установили оба тригера RESTRICT чтобы нельзя было удалить товар который используется в заказе

$table->foreign('order_id', 'order_product_order_id’)->references('id')->on('order')->onDelete('CASCADE')->onUpdate('CASCADE');

А для поля order_id связь мы сделали CASCADE чтобы при удалении заказа сразу же удалялись все записи самого заказа.

Вот и всё. Мы закончили проектирования базы данных.

Теперь нам нужно настроить подключение к базе данных и выполнить миграции.

Откроем PHPStrorm, в корне проекта есть файл .env в нем мы прописываем

DB_HOST=127.0.0.1 // ваш локальных хост по умолчанию он localhost или 127.0.0.1 в принципе это одно и тоже
DB_PORT=3306
// порт по которому можно подключиться к базе данных, по умолчанию он 3306 но на разных хостинга по разному так же как и с хостом
DB_DATABASE=homestead
// название базы данных
DB_USERNAME=homestead
// пользователь
DB_PASSWORD=secret
// и пароль для пользователя

Теперь выполним в консоли команду php artisan migrate. Всё наш проект готов для использования.

На следующем уроке мы продолжим работу над проектом, создадим модели для таблиц, а так же загрузим bootstrap, jQuery и Dropzone для нашего проекта. И начнем делать Панель управления.