Цель этого руководства — шаг за шагом научить создавать простое приложение для блога Laravel 9. Основное внимание здесь уделяется архитектуре и серверной части, хотя некоторые функции внешнего интерфейса также будут добавлены в будущем руководстве.

Для этого урока я использую следующие версии (извлеченные из composer.json):

"require": {
    "php": "^8.0.2",
    "guzzlehttp/guzzle": "^7.2",
    "laravel/framework": "^9.19",
    "laravel/sanctum": "^3.0",
    "laravel/tinker": "^2.7"
},
"require-dev": {
    "fakerphp/faker": "^1.9.1",
    "laravel/breeze": "^1.13",
    "laravel/pint": "^1.0",
    "laravel/sail": "^1.0.1",
    "mockery/mockery": "^1.4.4",
    "nunomaduro/collision": "^6.1",
    "phpunit/phpunit": "^9.5.10",
    "spatie/laravel-ignition": "^1.0"
},

Как и в любой среде MVC, первым шагом является определение того, какие сущности потребуются системе и как они связаны друг с другом. Это моя идея для этой системы:

С учетом этой модели становится ясно, что нам понадобятся 4 объекта: User, Post, Comment и Tag. Каждая из этих сущностей станет Моделью в нашем приложении и, следовательно, таблицей в реляционной СУБД; но нам понадобится еще одна таблица для хранения отношения m:n между постом и тегом.

Прежде чем мы начнем программировать, вы должны убедиться, что на вашем компьютере установлен PHP 8.1 или выше; также у вас должны быть установлены/включены некоторые расширения PHP — я рекомендую mysql, intl, mbstring, curl и xml, хотя я не уверен, что все они понадобятся для этого приложения Laravel. Вам также необходимо установить NodeJS (версия 14 или выше), NPM, Composer (один из наиболее распространенных менеджеров зависимостей PHP) и Сервер MySQL. Если у вас его нет, пожалуйста, проверьте в Интернете, как их установить 😉

Создать проект

Сначала откройте терминал, перейдите в каталог рабочей области (cd …) и введите следующие команды:

composer create-project laravel/laravel simple-blog --prefer-dist

Установить стартовый комплект

После загрузки всех зависимостей вы должны открыть предпочитаемый редактор в новом каталоге simple-blog — я рекомендую Visual Code с Intelephense расширение.

Теперь давайте перейдем в каталог и установим Laravel Starter Kit Breeze:

cd simple-blog
composer require laravel/breeze --dev
php artisan breeze:install

Настройка базы данных

Далее нам нужно подготовить нашу базу данных для хранения данных приложения. На этом этапе вам необходимо получить доступ к серверу СУБД (который должен быть запущен), создать новую базу данных и, при необходимости, нового пользователя. Вы можете сделать это через phpMyAdmin, Mysql Workbench или любой другой удобный вам интерфейс. Здесь я покажу, как это сделать прямо из терминала:

mysql -u root -p
mysql> create database simple_blog;
mysql> create user 'laravel_user' identified by 'laravel_pw';
mysql> grant all privileges on simple_blog.* to 'laravel_user';

Теперь нажмите ctrl+d (или command+c на Mac), чтобы выйти из MySQL CLI, и давайте перейдем к настройке этой новой созданной базы данных и пользователя в нашем файле среды. Для этого откройте файл .env и найдите строку, начинающуюся с DB_DATABASE; это будет содержать имя базы данных (simple_blog); аналогично, DB_USERNAME и DB_PASSWORD сохранят имя пользователя и пароль, которые приложение будет использовать для доступа к СУБД:

Чтобы проверить, все ли в порядке, введите php artisan db; если он обращается к MySQL CLI, вам следует следовать. Если вы столкнулись с какой-либо ошибкой, проверьте, запущен ли сервер СУБД, и вы включили / установили расширение PHP mysql (это наиболее распространенные ошибки на этом этапе).

Миграция таблиц и тестирование

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

php artisan migrate
php artisan serve

Откройте браузер на localhost:8000, и вы должны увидеть страницу приветствия для приложения:

Ссылки Register и Log in должны были быть полностью рабочими, так что вы можете проверить это.

Создание других сущностей и миграций

Если вы откроете каталог database/migrations и/или app/Models , вы увидите, что Laravel вышел с моделью пользователя и миграцией. Теперь мы должны создать другие модели с миграциями:

php artisan make:model Post -mfsr
php artisan make:model Comment -mfsr
php artisan make:model Tag -mfsr
php artisan make:migration create_post_tag_table

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

Теперь давайте добавим несколько столбцов в наши модели:

Миграция новых таблиц

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

php artisan migrate

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

Заполнение классов моделей

Теперь мы можем добавить столбцы в атрибут $fillable связанных классов модели (внутри каталога app/Models):

Добавление отношений

Теперь пришло время добавить некоторые отношения. Поскольку мы используем Eloquent ORM в Laravel, отношения обычно не экспортируются в базу данных, поэтому это нужно делать на уровне приложения. Laravel и Eloquent предоставляют нам мощный инструмент для создания отношений внутри моделей:

Тестирование моделей и отношений

Laravel предоставляет нам отличную команду CLI, основанную на проекте Psy Shell, доступную через команду php artisan tinker. Оболочка находится в каталоге нашего проекта и имеет несколько ярлыков для наших классов моделей:

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

Внедрение фабрик

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

Во-первых, мы реализуем наши фабрики, которые будут использоваться для генерации экземпляров модели со случайными поддельными сгенерированными данными. Laravel приносит нам уже заполненный класс UserFactory (database/factories); если вы хотите, вы можете изменить хешированный пароль на что-то более доступное:

Точно так же мы создадим теперь другие фабрики классов:

Проверка сидов, моделей и отношений

При этом вы можете попробовать следующие команды в оболочке tinker:

User::factory()->make() // creates an instance
User::factory()->make()->save() // creates an instance and store it
User::factory()->create() // same above, but shorter
User::factory(5)->create() // creates and saves 5 users
Post::factory(5)->create
Comment::factory(5)->create
Tag::factory(5)->create
Post::find(1)->tags()->attach(Tag::all()->random())
Post::find(2)->tags()->attach(Tag::all()->random(3))
Post::find(2)->tags
Tag::find(1)->posts
// ...

Сеялки

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

Для этого мы реализуем классы Seeders внутри каталога database/seeders:

Мы также создадим PostTagSeeder, чтобы установить случайные связи между сообщениями и тегами. Хотя можно создать прямо в каталоге, лучше всего создавать через ремесленника:

php artisan make:seeder PostTagSeeder

Вы должны иметь в виду, что по умолчанию при запуске команды artisan вызывается только класс DatabaseSeeder, поэтому нам нужно заставить его вызывать другие сидеры:

После этого вы можете запустить следующую команду на своем терминале:

php artisan migrate:fresh --seed

Это воссоздаст вашу базу данных и заполнит ее в соответствии с классом DatabaseSeeder (вы можете проверить это с помощью tinker).

Заключение

На этом мы завершаем это руководство, полностью посвященное серверной части приложения Laravel. Следующим шагом является создание внешнего интерфейса с использованием шаблонов Blade, Vue, React или другой поддерживаемой внешней среды, но это для другого руководства.