Введение. Что такое Fixtures и зачем это нужно.

В фреймворке Symfony есть такое понятие как Fixtures (фикстуры). Давайте разберемся что это такое и для чего это нужно.

Fixtures - это такой функционал Symfony, который позволяет нам с помощью программного кода добавить какие-либо сгенерированные данные в базу данных. 

Если мы говорим о миграциях, то они создают нам структуру (схему) базы данных. Они определяют таблицы, которые будут в нашей базе данных и те колонки, которые будут в этих таблицах.

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

Где этот функционал может использоваться?

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

С помощью фикстур можно достаточно быстро сгенерировать этот набор данных. Можно написать несколько строк кода, которые добавят внутрь таблиц какие-то данные.

Пример применения на production среде

Fixtures можно использовать также для того, чтобы на сервере (production) быстро развернуть какие-либо данные в базе данных, необходимые для работы этого сервера.

Например, мы можем создать каких-либо типовых пользователей, которые будут в нашем проекте, независимо от того, где он находится (development или production) среда.

Мы зашли на сервер и создали там администратора или какого-то ещё пользователя или какие-то другие данные, которые обязательно должны быть на вашем проекте.

Может быть лучше писать код Fixtures в контроллерах?

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

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

Имея Fixtures в Symfony мы можем запускать механизм создания этих записей. Один раз написали их и с помощью командной строки запустили их и изменения переносятся в базу данных.

Установка

Для работы fixtures, нам потребуется установить специальный PHP пакет с помощью пакетного менеджера composer. Команда для установки выглядит следующим образом.

composer require --dev doctrine/data-fixtures

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

https://webkyrs.info/page/ustanovka-paketa-dlya-raboti-s-fixtures-v-symfony

Установка по умолчанию происходит в среду dev, т.к. изначальное применение этого пакета именно в среде разработки.

Что требуется для начала работы с Fixtures?

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

Что собой представляет файл фикстуры

Сам файл с фикстурой представляет собой PHP-класс, который находится в папке src/DataFixtures. Вы можете назвать его, как вам будет удобно. Как правило, по умолчанию, он называется AppFixtures.php

Примерное содержимое этого файла может быть следующим. Здесь мы генерируем 10 случайных товаров на нашем сайте.

namespace App\DataFixtures;


use App\Entity\Product;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;


class AppFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        for ($i = 0; $i < 10; $i++) {
            $product = new Product();
            $product->setName('товар '.$i);
            $product->setPrice(mt_rand(10, 100)); //генерируем случайную цену для товара
            $manager->persist($product);
        }


        $manager->flush();
    }
}

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

php bin/console doctrine:fixtures:load

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

Вот такой полезный инструмент Fixtures в Symfony, о котором мы поговорим в ближайших видео, как им пользоваться на практике. Давайте будем приступать.