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.
vendor/bin/phinx seed:create UserSeederPrzykł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/fakerPoniż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:runNatomiast Jeśli chcemy uruchomić tylko konkretnę klasę należy użyć parametru -s.
vendor/bin/phinx seed:run -s ArticlesSeederMożna również uruchomić kilka seedów na raz.
vendor/bin/phinx seed:run -s ArticlesSeeder -s UserSeeder -s CommentsSeeder
