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