Генерация тестового контента в OctoberCMS

Что мне всегда отдельно нравилось в Ларавеле — так это как там организована генерация тестовых материалов. Для этого используется мега-библиотека Faker, которая умеет практически всё, что может понадобиться при разработке. Годится как для автоматизированных тестов, так и для заполнения БД тестовыми данными.

В самом Ларавеле можно описать для моделей классы-factory и генерировать данные по ним, это описано в документации. В OctoberCMS про фабрики документация ничего не говорит, но можно обойтись и без них:

// Делаем класс-сидер, кладем его в /updates нашего плагина
<?php namespace Graker\Myplugin\Updates;

use Faker\Factory;
use October\Rain\Database\Updates\Seeder;
// а это классы моделей, которые мы будем генерировать:
use Graker\Touristic\Models\TourInfo;
use System\Models\File;
use RainLab\Blog\Models\Post;
use RainLab\Blog\Models\Category;

class SeedAllTables extends Seeder
{

    public function run()
    {
        // здесь будем генерировать тестовый контент
    }

}

Теперь воспользуемся библиотекой Faker и сгенерируем запись в блог:

public function run()
{
    $factory = Factory::create();

    $post = Post::create([
        'title' => $factory->words(4, TRUE),
        'slug' => $factory->slug(),
        'content' => $factory->realText(450),
        'excerpt' => $factory->realText(120),
        'published_at' => $factory->date(),
        'published' => true,
    ]);
}

Сгенерируется заголовок, slug для пути, текст, анонс, дата публикации. Параметрами генерации (длиной текстов, ограничениями дат) можно легко управлять.

Создадим категорию и добавим её нашему посту:

public function run()
{
    //...

    // в качестве категории используем название случайной страны
    $country = Category::create([
        'name' => $factory->country,
        'slug' => $factory->slug(3),
        'description' => $factory->paragraph(),
    ]);

    $post->categories()->attach($country->id);

}

Добавим посту картинку:

public function run()
{
    // ...

    $post->featured_images()->save(File::create([
        'data' => $factory->image(),
        'is_public' => TRUE,
    ]));

}

Картинки будут использованы живые, с сервиса Lorempixel, а не разукрашенные геометрические формы. Через аргументы функции можно управлять разрешением картинки и даже выбирать категорию. Например, выводить только котиков.

Ну и сгенерируем данные своей кастомной модели, прикрепленной к посту через extend():

public function run()
{
    // ...

    // это просто для примера, какие еще можно генерировать значения
    TourInfo::create([
        'stars' => $factory->numberBetween(1, 5),
        'price' => $factory->numberBetween(100, 100000),
        'currency' => TourInfo::$currencies[$factory->numberBetween(0, 2)],
        'tours_quantity' => $factory->numberBetween(1, 100),
        'starts_at' => $factory->date('Y-m-d', '+1 year'),
        'nights' => $factory->numberBetween(1, 60),
        'post_id' => $post->id,
    ]);

}

Вот так, легко и просто генерируются данные. Кстати, если вам нужно генерировать тестовые данные не в БД, а прямо в вёрстке странцы, есть плагин Faker — как раз для этого. Сделан он на базе той же библиотеки Faker, там функции генератора вызываются прямо из шаблонов Twig.

P.S. А если вам надоели разукрашенные геометрические формы, генерируемые Devel Generate в Друпале, то есть — если вдруг кто не знает — модуль Realistic Dummy Content.

Комментарии