CakePHP 3 Seeds

Jedną z dość częstych rzeczy w programowaniu jest wypełnianie tabel bazy danych testowymi danymi. W CakePHP dzięki Phinx możemy używać tzw. seedowania czyli wypełniania tabel testowymi danymi. Domyślnie pliki generatorów seedów są przechowywane w katalogu config/Seeds, ale można to zmienić w konfiguracji.

Dzięki poniższemu poleceniu bash Phinx utworzymy pustą klasę Seed.
vendor/bin/phinx seed:create UserSeeder
Przykładowa klasa Seed wygląda następująco.
use Phinx\Seed\AbstractSeed;

class MojaNazwaSeeder extends AbstractSeed
{
    public function run()
    {

    }
}
Jak widzimy klasa dziedziczy po AbstractSeed. Ma ona w tej chwili pustą metodę run. Jest ona automatycznie wywoływana gdy wykonujemy polecenie konsolowe seed:run. Spójrzmy na poniższy listing. Jest to przykład wstawiania danych do tabeli.
use Phinx\Seed\AbstractSeed;

class ArticlesSeeder extends AbstractSeed
{
    public function run()
    {
        $data = [
            [
				'title' => 'Title 1',
                'body'    => 'Lorem',
                'created' => date('Y-m-d H:i:s'),
            ],
            [
				title' => 'Title 2',
                'body'    => 'Ipsum',
                'created' => date('Y-m-d H:i:s'),
            ]
        ];

        $articles = $this->table('articles');
        $articles->insert($data)
		->save();
    }
}
W celu ułatwienia wstawiania większej liczby testowych danych należy wykorzystać bibliotekę fzaninotto/faker. W tym celu należy ją zainstalować composerem.
composer require fzaninotto/faker
Poniżej przykładowe użycie klasy. Wypełnia tabelę users 100 użytkownikami.
use Phinx\Seed\AbstractSeed;

class UserSeeder extends AbstractSeed
{
    public function run()
    {
        $faker = Faker\Factory::create();
        $data = [];
        for ($i = 0; $i < 100; $i++) {
            $data[] = [
                'username'      => $faker->userName,
                'password'      => sha1($faker->password),
                'password_salt' => sha1('foo'),
                'email'         => $faker->email,
                'first_name'    => $faker->firstName,
                'last_name'     => $faker->lastName,
                'created'       => date('Y-m-d H:i:s'),
            ];
        }

        $this->insert('users', $data);
    }
}
Jeśli chcemy natomiast opróżnić tabelę z danych (SQL: TRUNCATE) w metodzie run wystarczy użyć truncate jak poniżej.
$articles->truncate();
Teraz przedstawię kilka poleceń bash służących do uruchamiania naszych skryptów seeds z konsoli. W celu uruchamienia wszystkich seedów (wszystkich stworzonych przez Ciebie klas) należy wykonać polecenie:
vendor/bin/phinx seed:run
Natomiast Jeśli chcemy uruchomić tylko konkretnę klasę należy użyć parametru -s.
vendor/bin/phinx seed:run -s ArticlesSeeder
Można również uruchomić kilka seedów na raz.
vendor/bin/phinx seed:run -s ArticlesSeeder -s UserSeeder -s CommentsSeeder