Создание простого списка контактов на Laravel и PostgreSQL

В этом мануале мы с вами соберем простое приложение Laravel, содержащее список контактов, извлекаемых из БД PostgreSQL. С помощью Eloquent и поддержки столбцов JSON в PostgreSQL приложение будет запрашивать контакты из БД.

Следуя этому мануалу, вы научитесь подключаться к управляемой БД PostgreSQL, инициализировать БД со случайными данными с помощью фабрик и сидеров Laravel, хранить и читать JSON-документы в PostgreSQL с помощью Laravel Eloquent.

Требования

Для работы вам понадобится рабочая среда PHP:

1: Создание приложения Laravel

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

composer create-project --prefer-dist laravel/laravel laravel-contacts

Если вы перейдете в новый каталог laravel-contacts и запустите встроенный веб-сервер Laravel, вы увидите страницу приветствия Laravel по умолчанию:

cd laravel-contacts
php artisan serve

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

Давайте соберем их шаг за шагом.

2: Создание модели Contact

Контакты в нашем приложении будут иметь следующие свойства:

Name
Phone Number
Address
Favorite Colors

Для свойства Favorite Colors мы будем использовать тип данных Postgres JSON. Для них мы создадим общий столбец favorites, который будет содержать объект JSON со списком любимых вещей. В этом приложении мы будем хранить только любимые цвета, но объект favorites является универсальным и позволяет нам добавлять различные типы. Вы можете самостоятельно это сделать в будущем.

Создайте модель, фабрику и миграцию с помощью artisan:

php artisan make:model -f -m Contact

Теперь мы настроим отдельные части модели.

Миграция

Отредактируйте сгенерированный файл миграции, хранящийся в database/migrations/*_create_contacts_table.php. Внутри блока Schema::create() мы определим структуру таблицы:

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateContactsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('phone');
$table->string('address');
$table->jsonb('favorites')->default('{}');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('contacts');
}
}

Этот код настроит столбец базы данных favorites, установленным в объект JSON (о котором мы говорили выше). Значением по умолчанию является пустой объект.

Генерация случайных контактов

Фабрика сгенерирует случайные значения для контактов. Мы настроим сидер, который будет использовать фабрику для вставки 10 случайных контактов в базу данных. Это даст нам возможность заполнить базу данных случайными контактами при запуске миграции. Начнем с фабрики.

Фабрика

Отредактируйте сгенерированный файл фабрики, он хранится database/factories/ContactFactory.php. Сначала мы сгенерируем три случайных цвета, которые будем использовать в столбце favorites:

$colors = collect(range(1, 3))->map(function() use ($faker) {
return $faker->colorName;
})->toArray();

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

return [
'name' => $faker->name,
'phone' => $faker->e164PhoneNumber,
'address' => $faker->address,
'favorites' => ['colors' => $colors],
];

Получившаяся фабрика должна выглядеть так:

<?php
use Faker\Generator as Faker;
$factory->define(App\Contact::class, function (Faker $faker) {
// generate 3 random colors
$colors = collect(range(1, 3))->map(function() use ($faker) {
return $faker->colorName;
})->toArray();
return [
'name' => $faker->name,
'phone' => $faker->e164PhoneNumber,
'address' => $faker->address,
'favorites' => ['colors' => $colors],
];
});

Сидер

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

php artisan make:seeder ContactsTableSeeder

Откройте сгенерированный файл database/seeds/ContactsTableSeeder.php в редакторе и вызовите фабрику внутри функции run():

<?php
use Illuminate\Database\Seeder;
class ContactsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\Contact::class, 10)->create();
}
}

Чтобы включить сидер, отредактируйте файл database/seeds/DatabaseSeeder.php и вызовите его внутри функции run ():

<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(ContactsTableSeeder::class);
}
}

Модель

Осталась последняя настройка модели. Команда artisan make:model создала для нас файл модели, расположенный в app/Contact.php. Столбец favorites представляет объект JSON, поэтому нам необходимо связать его с массивом PHP перед его использованием. Eloquent делает это очень быстро, автоматически переключаясь между правильными форматами. Внутри класса Contact в app/Contact.php нужно добавить такой код:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
protected $casts = [
'favorites' => 'array',
];
}

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

Мы используем управляемую БД PostgreSQL.

В файле .env Laravel установите строку:

DB_CONNECTION=pgsql

Под ней укажите другие переменные в соответствии с вашими учетными данными БД.

Существует один параметр, который недоступен в качестве переменной среды: sslmode. Некоторые управляемые базы данных не поддерживают никаких соединений, кроме TLS, поэтому нам нужно установить в sslmode значение require. Откройте config/database.php в редакторе, прокрутите вниз до определения pgsql и обновите настройку:

'pgsql' => [
...
'sslmode' => 'require',
],

4: Миграция и добавление данных в БД

Теперь, когда мы завершили определение всех компонентов приложения, связанных с базой данных (от модели Contact до информации о соединении с базой данных), мы можем выполнить миграцию и заполнить базу данных:

php artisan migrate --seed

Теперь у нас есть база данных, заполненная контактами.

5: Создание страницы списка контактов

Теперь осталось создать страницу, которая будет отображать контакты.

Для простоты мы изменим домашнюю страницу Laravel по умолчанию. Отредактируйте routes/web.php и задайте для маршрута / следующее значение:

Route::get('/', function () {
$contacts = App\Contact::all();
return view('welcome', ['contacts' => $contacts]);
});

Это позволит получить все контакты из базы данных и передать их представлению welcome.

Затем отредактируйте представление, расположенное в resources/views/welcome.blade.php, и замените его содержимое такими строками:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Contacts</title>
<link rel="stylesheet" href="https://unpkg.com/tachyons@4.10.0/css/tachyons.min.css"/>
</head>
<body>
<div class="mw6 center pa3 sans-serif">
<h1 class="mb4">Contacts</h1>
@foreach($contacts as $contact)
<div class="pa2 mb3 striped--near-white">
<header class="b mb2">{{ $contact->name }}</header>
<div class="pl2">
<p class="mb2">{{ $contact->phone }}</p>
<p class="pre mb3">{{ $contact->address }}</p>
<p class="mb2"><span class="fw5">Favorite colors:</span> {{ implode(', ', $contact->favorites['colors']) }}</p>
</div>
</div>
@endforeach
</div>
</body>
</html>

6: Развертывание

Все готово! Давайте попробуем развернуть приложение.

Как и раньше, мы можем использовать встроенный веб-сервер Laravel. Просто запустите команду:

php artisan serve

и перейдите по ссылке http://127.0.0.1:8000.

Чтобы развернуть приложение на удаленном сервере, следуйте руководству Развертывание приложения Laravel на Nginx в Ubuntu 16.04.

Заключение

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

Вот несколько важных функций, которые вы самостоятельно можете внести в приложение, которое мы создали:

  • Можно добавить в список любимую фигуру (квадрат, круг и т. д.). этот параметр можно добавить к одному или нескольким контактам. Затем отредактируйте шаблон представления, чтобы отобразить этот параметр. Обновите сидер и включите в него отображение случайной формы в произвольном порядке или для каждого контакта.
  • Извлеките обработчик маршрута (в web.php) в отдельный контроллер. Используйте команду artisan make:controller для создания файла контроллера. Обратитесь к документации Laravel для более подробной информации по этому вопросу.
Tags: , ,