Блог на Laravel: Часть 1. Введение. Миграции

Опубликовано 0 комментариев 650 просмотров
Блог на Laravel: Часть 1. Введение. Миграции

Привет.

Данный тема уже забита донельзя, но я все же не могу не вставить свои 5 копеек. Данный цикл записей поможет людям, которые уже знают PHP и ООП понять основы работы с Laravel. Я специально не буду использовать готовые пакеты с админками, чтобы у вас была возможность понять устройство роутов, реквестов, контроллеров и т.д. Я не буду совсем уж углубляться в тонкости настройки окружения под фреймворк, а сделаю акцент именно на том как обрабатывать, хранить и выводить информацию. Будем считать, что вы уже установили Laravel и видите перед собой стандартный экран приветствия.

Актуально на момент написания. Требования почти стандартные - PHP >= 7.0, MySQL, Redis.

Создание миграций

Первым делом нам необходимо понять, из чего будет состоять блог. Главный элемент - статьи. Они будут разделены посредством категорий и тегов. Одну статью можно будет прикрепить к одной категории и нескольким тегам. Не забудем о комментариях к записям.

Кроме того заранее подумаем и о СЕО. Все мета-теги правильно будет вынести в отдельную таблицу.

Создадим миграции.

$ php artisan make:migration create_posts_table
$ php artisan make:migration create_categories_table
$ php artisan make:migration create_tags_table
$ php artisan make:migration create_metas_table
$ php artisan make:migration create_comments_table

Эти команды поместят в папку database/migrations файлы миграций, создающих таблицы (create_*_table) posts, tags, categories, metas и comments. Они состоят из наследника Illuminate\Database\Migrations\Migration с методами up и down, которые вызываются в момент запуска и отката миграций соответственно. Для таблицы posts это

// up
Schema::create('posts', function(Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
});

// down
Schema::dropIfExists('posts');

Пока что все просто. Метод down за отсутствием на то необходимости мы трогать не будем, а работать будем с up. Как видите, фреймворк отлично понял что мы создаем таблицу и подготовил начальную разметку за нас. С такой структурой будет наша таблица в базе данных, когда мы запустим процесс миграции.

Разметка создается путем обращения к методу create класса Illuminate\Support\Facades\Schema. В качестве первого параметра указывается название таблицы, а второй - анонимная функция с экземпляром Illuminate\Database\Schema\Blueprint в качестве аргумента. С его помощью мы создаем разметку таблицы. У Blueprint существует огромное количество методов, с помощью которых разметить таблицу не составит труда. Углубляться в каждый отдельно мы не будем, а лишь воспользуемся необходимыми.

posts

Займемся изменений разметки для записей. Запись будет состоять из уникального идентификатора, названия, слага (человеко-понятного фрагмента в адресе, по которому идентифицируется статья), статуса (опубликован да/нет), изображения, столбца с привязкой к категории, превью и детального текста, даты изменения и создания. Из этого сформируем основные требования к разметке:

  • Идентификатор id - инкремент
  • Название name - строка, максимум 50 символов
  • Слаг slug - уникальная строка, максимум 50 символов
  • Статус status - булев
  • Изображение image - строка, может отсутствовать
  • Категория category_id - целое числов
  • Текст превью preview_text - строка
  • Детальный текст detail_text - текст
  • Дата создания created_at - временная метка
  • Дата обновления updated_at - временная метка

Первый и последние два пункта фреймворк уже обнозначил как $table->increments('id') и $table->timestamps(). Дополним разметку оставшимися пунктами:

Schema::create('posts', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name', 50);
    $table->string('slug', 50)
        ->unique();
    $table->boolean('publish');
    $table->string('image')
        ->nullable();
    $table->integer('category_id');
    $table->string('preview_text');
    $table->text('detail_text');
    $table->timestamps();
});

Немного оффтопа. Laravel - фремворк, часть которого состоит из чистой магии. Потому зачастую IDE не может понять, как устроен тот или иной участок кода и работает некорректно не видя некоторые классы и методы, некорректно выдавая подсказки. Решить часть проблем мне помогает связка PHPStorm + плагин Laravel Plugin + пакет IDE Helper Generator, генерирующий файл-помощник.

categories

Категории устроены проще - ID, название, слаг, небольшое описание и отметки времени. Откроем миграцию и изменим разметку:

Schema::create('categories', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name', 50);
    $table->string('slug', 50)
        ->unique();
    $table->string('description')
        ->nullable();
    $table->timestamps();
});

tags

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

Schema::create('tags', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name', 50);
    $table->string('slug', 50)
        ->unique();
    $table->timestamps();
});

Так мы создали таблицу с тегами. Теперь присутупим к созданию связующей таблицы пост-тег. Добавим в метод up:

Schema::create('post_tag', function(Blueprint $table) {
    $table->integer('post_id')
        ->unsigned()
        ->index();
    $table->foreign('post_id')
        ->references('id')
        ->on('posts')
        ->onDelete('cascade');

    $table->integer('tag_id')
        ->unsigned()
        ->index();
    $table->foreign('tag_id')
        ->references('id')
        ->on('tags')
        ->onDelete('cascade');
});

Учтем, что при откате так же стоит удалить связующую таблицу. Добавим в down:

Schema::dropIfExists('post_tag');

metas

Таблица с мета-тегами и связью один-к-одному. В ней мы укажем наши мета-теги и идентификатор записи, к которой они привязаны. Учтем, что какое-либо из мета-полей может остаться пустым.

Schema::create('metas', function(Blueprint $table) {
    $table->increments('id');
    $table->integer('post_id')
        ->unsigned()
        ->index();
    $table->string('description');
    $table->string('keywords');

    $table->foreign('post_id')
        ->references('id')
        ->on('posts')
        ->onDelete('cascade');
});

comments

Комментарии - вещь в блоге нужная. Мы будем хранить информацию о пользователе, которую он указал (имя, email), текст комментария, отметки времени. Комментарии будут идти списком, но предусмотрим возможность указать комментарий на который отвечает автор. Добавим возможность скрывать некоторые комментарии, изменив их статус.

Кроме того, учтем современные реалии и добавим логирование IP в базу.

Schema::create('comments', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name', 20);
    $table->string('email', 30);
    $table->boolean('status');
    $table->integer('post_id')
        ->unsigned()
        ->index();
    $table->integer('reply_id')
        ->nullable();
    $table->text('comment');
    $table->string('ip', 20);
    $table->timestamps();

    $table->foreign('post_id')
        ->references('id')
        ->on('posts')
        ->onDelete('cascade');
});

Запуск миграций

Мы создали разметку для наших данных. Откроем файл .env в корне проекта и заменим доступы к БД на свои.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=name
DB_USERNAME=user
DB_PASSWORD=password

Теперь запустим миграции.

$ php artisan migrate

Migration table created successfully.
Migrating: 2018_08_04_111911_create_posts_table
Migrated:  2018_08_04_111911_create_posts_table
Migrating: 2018_08_04_111915_create_tags_table
Migrated:  2018_08_04_111915_create_tags_table
Migrating: 2018_08_04_111919_create_categories_table
Migrated:  2018_08_04_111919_create_categories_table
Migrating: 2018_08_04_111922_create_metas_table
Migrated:  2018_08_04_111922_create_metas_table
Migrating: 2018_08_04_120010_create_comments_table

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

Другие части цикла вы можете найти по тегу Simple Blog.

В ответ на сообщение

Доступна разметка Markdown. А еще вы можете использовать крутой пак эмоций.

Нажимая на кнопку «Отправить» вы даете свое согласие на обработку персональных данных в соответствии с законом №152-ФЗ «О персональных данных» от 27.07.2006 и принимаете условия Политики конфеденциальности.