ΠΠ²Π»Π°Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Laravel Ρ Faker: ΠΡΠ»Π½ΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ
Faker Π΅ PHP Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΈ ΡΠΈΠΊΡΠΈΠ²Π½ΠΈ Π΄Π°Π½Π½ΠΈ β ΠΈΠΌΠ΅Π½Π°, Π°Π΄ΡΠ΅ΡΠΈ, ΠΈΠΌΠ΅ΠΉΠ»ΠΈ, ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΈ Π½ΠΎΠΌΠ΅ΡΠ°, UUID ΠΈ ΠΎΡΠ΅ β Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅, ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΠ΅Π΄ΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. Π Laravel, Faker ΡΠ΅ Π΄ΠΎΡΡΠ°Π²Ρ ΠΊΠ°ΡΠΎ ΠΏΡΡΠ²ΠΎΠΊΠ»Π°ΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ° `fakerphp/faker` ΠΈ ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Ρ ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅ Π½Π° Eloquent ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π΄Π°Π²Π°ΠΉΠΊΠΈ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½, ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌ Π½Π°ΡΠΈΠ½ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΌΠΈΡΠ»Π΅Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ, Π±Π΅Π· Π΄Π° ΡΠ΅ Π΄ΠΎΠΊΠΎΡΠ²Π°Ρ Π΄ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ.
ΠΠΊΠΎ Π²ΠΈ ΡΡΡΠ±Π²Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π² Π΅Π΄Π½ΠΎ ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΡΡΡΠ΅Π½Π΅: Laravel Faker ΡΠ°Π±ΠΎΡΠΈ, ΠΊΠ°ΡΠΎ ΡΠ²ΡΡΠ·Π²Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π½Π° `FakerGenerator` ΠΊΡΠΌ Π²ΡΡΠΊΠ° ΡΠ°Π±ΡΠΈΠΊΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π», ΠΈΠ·Π»Π°Π³Π°ΠΉΠΊΠΈ ΡΡΠΎΡΠΈΡΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, Π·Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡΠΎΠ±ΡΠ°Π·Π΅Π½ΠΈ Ρ Π»ΠΎΠΊΠ°Π»Π° ΠΈ ΡΠΈΠΏΠ°, ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ²Π°Π½Π΅.
ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΡΠΎΠ²Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ, ΡΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅, ΡΠ΅ Π²Π°ΡΠ°ΡΠ° ΡΡΠ΅Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ:
- Laravel 8 ΠΈΠ»ΠΈ ΠΏΠΎ-Π½ΠΎΠ² (ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡΡ Π½Π° ΡΠ°Π±ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π·Π°ΠΌΠ΅Π½ΠΈ ΠΏΠΎ-ΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Π·Π°ΡΠ²Π°ΡΡΠ½ΠΈΡ, Π² Laravel 8)
- PHP 8.0 ΠΈΠ»ΠΈ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊ (ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π° ΡΠΈΠΏΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈ match ΠΈΠ·ΡΠ°Π·ΠΈ Π²ΡΠ² ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅)
- ΠΡΠΎΠ΅ΠΊΡ, ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ ΠΎΡ Composer, Ρ `fakerphp/faker` Π² `require-dev`
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π° Π²ΡΡΠ·ΠΊΠ° Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ (`DB_CONNECTION`, `DB_DATABASE` ΠΈ Π΄Ρ.) Π² `.env`
- ΠΡΠ½ΠΎΠ²Π½ΠΎ ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Eloquent ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Artisan CLI
ΠΠ°ΠΊΠ²ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ Π΅ Faker β ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π½Π΅ Π΅
Faker Π½Π΅ Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΈ ΡΠΈΡΠ»Π°. Π’ΠΎΠΉ Π΅ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» Π·Π° ΡΠΈΠ½ΡΠ΅Π· Π½Π° Π΄Π°Π½Π½ΠΈ, ΡΡΠΎΠ±ΡΠ°Π·Π΅Π½ Ρ Π΄ΠΎΠΌΠ΅ΠΉΠ½Π°. ΠΡΡΠΊΠ° ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°Π·Π±ΠΈΡΠ° ΡΡΡΡΠΊΡΡΡΠ½ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π° ΡΠ²ΠΎΡ Π΄ΠΎΠΌΠ΅ΠΉΠ½: ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠΎΡΠ½ΠΎ Π΅Π΄ΠΈΠ½ `@`, ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΈΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΏΠ°Π·Π²Π°Ρ Π½Π°ΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ Π½Π°Π±ΠΈΡΠ°ΡΠ΅Π»Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π° Π½ΠΎΠΌΠ΅ΡΠ°ΡΠ° Π½Π° ΠΊΡΠ΅Π΄ΠΈΡΠ½ΠΈ ΠΊΠ°ΡΡΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π½Π° Luhn. Π’ΠΎΠ²Π° ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ β Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ»ΡΡΠ°Π΅Π½ Π½ΠΈΠ· ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΡΠΌΠ°ΡΠ°, ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΎΠ±ΡΠΎ Π΄Π° Π΄ΠΎΡΡΠΈΠ³Π½Π΅ Π΄ΠΎ Π²Π°ΡΠ°ΡΠ° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ Π΄ΠΎΡΡΠ°Π²Ρ Ρ Π½Π°Π΄ 180 Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π² ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ:
- `Person` β ΠΈΠΌΠ΅Π½Π°, ΡΠΈΡΠ»ΠΈ, ΠΏΠΎΠ»
- `Internet` β ΠΈΠΌΠ΅ΠΉΠ»ΠΈ, URL Π°Π΄ΡΠ΅ΡΠΈ, IP Π°Π΄ΡΠ΅ΡΠΈ, MAC Π°Π΄ΡΠ΅ΡΠΈ, slug-ΠΎΠ²Π΅
- `Address` β Π°Π΄ΡΠ΅ΡΠΈ Π½Π° ΡΠ»ΠΈΡΠΈ, Π³ΡΠ°Π΄ΠΎΠ²Π΅, ΠΏΠΎΡΠ΅Π½ΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅, Π΄ΡΡΠΆΠ°Π²ΠΈ, ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈ
- `PhoneNumber` β Π½ΠΎΠΌΠ΅ΡΠ°, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° E.164 ΡΡΠ°Π½Π΄Π°ΡΡΠ° ΠΏΠΎ Π»ΠΎΠΊΠ°Π»
- `Lorem` β ΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠΈ, ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π΄ΡΠΌΠΈ
- `DateTime` β Π΄Π°ΡΠΈ, ΡΠ°ΡΠΎΠ²Π΅, Unix Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΠΎΡΠΏΠ΅ΡΠ°ΡΡΡΠΈ, ISO 8601 Π½ΠΈΠ·ΠΎΠ²Π΅
- `Payment` β Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΊΡΠ΅Π΄ΠΈΡΠ½ΠΈ ΠΊΠ°ΡΡΠΈ, Π΄Π°ΡΠΈ Π½Π° ΠΈΠ·ΡΠΈΡΠ°Π½Π΅, IBAN
- `Miscellaneous` β Π±ΡΠ»Π΅Π²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, MD5/SHA1/SHA256 Ρ Π΅ΡΠΎΠ²Π΅, UUID, ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ
Π Π°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΊΠΎΠΉ ΠΊΠ»Π°Ρ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊ ΠΏΡΠΈΡΠ΅ΠΆΠ°Π²Π° Π΄Π°Π΄Π΅Π½Π° ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ `BadMethodCallException` β Π½Π°ΠΉ-ΡΠ΅ΡΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Faker Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, Π½ΠΎΠ²ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°.
ΠΠ°ΠΊ Laravel ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ° Faker Ρ ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ
ΠΠ°Π·ΠΎΠ²ΠΈΡΡ ΠΊΠ»Π°Ρ `IlluminateDatabaseEloquentFactoriesFactory` Π½Π° Laravel ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π½Π° `FakerGenerator` ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ Ρ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π° Π½Π° `$this->faker`. ΠΠΎΠΊΠ°Π»ΡΡ ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΠΊΠ»ΡΡ `app.faker_locale` (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ `en_US`). Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π²ΡΡΠΊΠ° ΡΠ°Π±ΡΠΈΠΊΠ° Π²ΡΠ² Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΏΠΎΠ΄Π΅Π»Ρ Π΅Π΄Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π·Π° Π»ΠΎΠΊΠ°Π», ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½Π΅ Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ½ΠΎ β Π΄Π΅ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ Π·Π°ΡΡΡΠ΄Π½ΡΠ²Π° Π΅ΠΊΠΈΠΏΠΈ, ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠ° Π·Π° ΠΌΠΎΠ΄Π΅Π»
β`bash
php artisan make:factory UserFactory βmodel=User
β`
Π’ΠΎΠ²Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° `database/factories/UserFactory.php`. Π€Π»Π°Π³ΡΡ `βmodel` ΡΠ²ΡΡΠ·Π²Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ `$model` Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ, ΡΠΏΠ΅ΡΡΡΠ²Π°ΠΉΠΊΠΈ Π²ΠΈ Π΅Π΄Π½ΠΎ ΡΡΡΠ½ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅.
ΠΠ΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠ° Ρ Faker
β`php
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition(): array
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => bcrypt('password'),
'remember_token' => Str::random(10),
];
}
}
β`
ΠΠ»ΡΡΠΎΠ²ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠ°Π·ΠΈ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ:
- `unique()` Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Π° Π½Π΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ. Π’ΠΎΠΉ ΠΎΠ±Π²ΠΈΠ²Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΈ Ρ Π²ΡΡΠ»Ρ `OverflowException` ΡΠ»Π΅Π΄ 10 000 ΠΎΠΏΠΈΡΠ° Π·Π° ΠΊΠΎΠ»ΠΈΠ·ΠΈΡ β Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΡΠΎΠ²Π° ΠΏΡΠΈ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ Ρ ΠΏΠΎΠ»Π΅ Ρ Π½ΠΈΡΠΊΠ° ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»Π½ΠΎΡΡ.
- `safeEmail()` Π³Π΅Π½Π΅ΡΠΈΡΠ° Π°Π΄ΡΠ΅ΡΠΈ, Π·Π°Π²ΡΡΡΠ²Π°ΡΠΈ Π½Π° `example.com`, `example.net` ΠΈΠ»ΠΈ `example.org` β Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ, Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ ΠΏΠΎ RFC 2606, ΠΊΠΎΠΈΡΠΎ Π½ΠΈΠΊΠΎΠ³Π° Π½ΡΠΌΠ° Π΄Π° Π΄ΠΎΡΡΠ°Π²ΡΡ ΡΠ΅Π°Π»Π½Π° ΠΏΠΎΡΠ°. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠΎΠ²Π° Π² CI ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈ, Π·Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΈΠΌΠ΅ΠΉΠ»ΠΈ.
- `bcrypt('password')` Π΅ ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ ΡΠ²ΡΡΠ΄ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½. Π₯Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° 50 000 ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π±ΠΈ ΠΎΡΠ½Π΅Π»ΠΎ ΠΌΠΈΠ½ΡΡΠΈ; Π΅Π΄ΠΈΠ½ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ Ρ Π΅Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π±ΡΡΠ·ΠΎΡΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅, ΠΊΠ°ΡΠΎ ΠΎΡΡΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π΅Π½ Π·Π° ΡΠ΅ΡΡΠΎΠ²Π΅ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΡΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄
Π€ΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Faker ΡΠ°Π±ΠΎΡΡΡ ΠΈ ΠΊΠ°ΡΠΎ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° (`$this->faker->name`), ΠΈ ΠΊΠ°ΡΠΎ ΡΠ²Π½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ (`$this->faker->name()`). Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ° Π² ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π±Π°Π·ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ ΠΏΡΠΈΡΡΠ΅Π»ΡΠΊΠΈ ΠΊΡΠΌ IDE, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΈΠ·Π±ΡΠ³Π²Π° ΠΎΠ±ΡΡΠΊΠ²Π°Π½Π΅ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° ΠΊΠ»Π°ΡΠ°.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Faker Π² ΡΠΈΠΉΠ΄ΡΡΠΈ Π·Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ
Π€Π°Π±ΡΠΈΠΊΠΈΡΠ΅ ΡΡΠ°Π²Π°Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π² Π³ΠΎΠ»ΡΠΌ ΠΌΠ°ΡΠ°Π±, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ ΠΎΡ ΡΠΈΠΉΠ΄ΡΡΠΈ. Π‘ΠΈΠΉΠ΄ΡΡΡΡ Π΅ ΡΠ»ΠΎΡΡ Π·Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ; ΡΠ°Π±ΡΠΈΠΊΠ°ΡΠ° Π΅ ΡΠ»ΠΎΡΡ Π·Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΡΡΠΆΡΠ΅ Π³ΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ.
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΈΠΉΠ΄ΡΡ
β`bash
php artisan make:seeder UserSeeder
β`
β`php
<?php
namespace DatabaseSeeders;
use AppModelsUser;
use IlluminateDatabaseSeeder;
class UserSeeder extends Seeder
{
public function run(): void
{
User::factory()->count(50)->create();
}
}
β`
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΠΉΠ΄ΡΡΠΈ
β`bash
Run a specific seeder class
php artisan db:seed βclass=UserSeeder
Run all seeders registered in DatabaseSeeder
php artisan db:seed
Wipe and re-seed in one command (destructive β never use on production)
php artisan migrate:fresh βseed
β`
ΠΠ΅Π»Π΅ΠΆΠΊΠ° Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ: ΠΠΈΠ½Π°Π³ΠΈ ΠΎΠ³ΡΠ°ΠΆΠ΄Π°ΠΉΡΠ΅ ΡΠΈΠΉΠ΄ΡΡΠΈΡΠ΅ Π·Π°Π΄ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, Π°ΠΊΠΎ ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ Π² `DatabaseSeeder`. ΠΠ±Ρ ΠΌΠΎΠ΄Π΅Π»:
β`php
if (app()->environment('local', 'staging')) {
$this->call(UserSeeder::class);
}
β`
Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Ρ Faker
1. Π‘ΡΡΡΠΎΡΠ½ΠΈΡ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠΈ
Π‘ΡΡΡΠΎΡΠ½ΠΈΡΡΠ° Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½ΠΈ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π», Π±Π΅Π· Π΄Π° Π΄ΡΠ±Π»ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π»ΠΈΡ ΠΌΠ°ΡΠΈΠ² `definition()`. Π’Π΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π²ΡΡΡ Ρ Π±Π°Π·ΠΎΠ²Π°ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ.
β`php
public function admin(): static
{
return $this->state(fn (array $attributes) => [
'is_admin' => true,
'role' => 'administrator',
]);
}
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
β`
Π‘ΡΡΡΠΎΡΠ½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π²Π΅ΡΠΈΠΆΠ°Ρ:
β`php
User::factory()->admin()->unverified()->count(5)->create();
β`
Π’ΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π° 5 Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΡΠΈΠΈΡΠΎ ΠΈΠΌΠ΅ΠΉΠ»ΠΈ Π½Π΅ ΡΠ° ΠΏΠΎΡΠ²ΡΡΠ΄Π΅Π½ΠΈ β ΠΏΡΠ΅ΡΠΈΠ·Π½Π° ΡΠ΅ΡΡΠΎΠ²Π° ΡΠΈΠΊΡΡΡΡΠ°, ΠΊΠΎΡΡΠΎ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΡΠ°Π΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ° ΡΡΡΠ½ΠΎ.
2. ΠΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ Π·Π° Faker
ΠΠΎΠ³Π°ΡΠΎ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΠΏΠΎΠΊΡΠΈΠ²Π°Ρ Π²Π°ΡΠΈΡ Π΄ΠΎΠΌΠ΅ΠΉΠ½ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ SKU Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈ, Π²ΡΡΡΠ΅ΡΠ½ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Π½Π° ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈ ΠΈΠ»ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΠΈΠΌΠ΅ΠΉΠ» Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ), Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊ.
β`php
<?php
use FakerProviderBase as BaseProvider;
class ProductProvider extends BaseProvider
{
private static array $categories = ['electronics', 'apparel', 'furniture', 'grocery'];
public function productSku(): string
{
return strtoupper($this->bothify('??-####-??'));
}
public function productCategory(): string
{
return static::randomElement(static::$categories);
}
}
β`
Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π½Π° Π²Π°ΡΠ°ΡΠ° ΡΠ°Π±ΡΠΈΠΊΠ° ΠΈΠ»ΠΈ Π² ΠΌΠ΅ΡΠΎΠ΄Π° `AppServiceProvider` boot Π·Π° Π³Π»ΠΎΠ±Π°Π»Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ:
β`php
// In AppServiceProvider::boot()
app(FakerGenerator::class)->addProvider(new ProductProvider(app(FakerGenerator::class)));
β`
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅:
β`php
'sku' => $this->faker->productSku(),
'category' => $this->faker->productCategory(),
β`
ΠΡΠ°Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ: ΠΠΊΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΡΠ°ΠΌΠΎ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΡΠ°Π±ΡΠΈΠΊΠ°, ΡΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² Π΄ΡΡΠ³ΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠΏΠΎΠ΄Π΅Π»ΡΡ ΡΡΡΠΈΡ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ `FakerGenerator`. Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ Π·Π° ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ; Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π·Π° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΡΠ°Π±ΡΠΈΠΊΠ°ΡΠ°.
3. ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΡΠ΅Π»Π°ΡΠΈΠΈ)
Π€Π°Π±ΡΠΈΠΊΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠ°Ρ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ Π²ΠΈ Π΄Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΡΠ΅ ΡΠ΅Π»ΠΈ Π³ΡΠ°ΡΠΈ ΠΎΡ ΠΎΠ±Π΅ΠΊΡΠΈ Ρ Π΅Π΄Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅.
β`php
// PostFactory.php
public function definition(): array
{
return [
'user_id' => User::factory(),
'title' => $this->faker->sentence(6),
'body' => $this->faker->paragraphs(3, true),
'slug' => $this->faker->unique()->slug(4),
];
}
β`
ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅ `Post::factory()->create()`, Laravel ΠΎΡΠΊΡΠΈΠ²Π°, ΡΠ΅ `user_id` ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π° Π΄ΠΎ ΡΠ°Π±ΡΠΈΠΊΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π²Π° `User` ΠΏΡΡΠ²ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π° Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΏΡΡΠ²ΠΈΡΠ΅Π½ ΠΊΠ»ΡΡ. ΠΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° ΠΏΡΠΈΠΊΠ°ΡΠΈΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΡΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»:
β`php
$user = User::factory()->create();
Post::factory()->count(10)->for($user)->create();
β`
ΠΠ΅ΡΠΎΠ΄ΡΡ `for()` Π΅ ΠΏΠΎ-ΡΠΈΡΡ ΠΎΡ ΡΡΡΠ½ΠΎΡΠΎ ΠΏΠΎΠ΄Π°Π²Π°Π½Π΅ Π½Π° `['user_id' => $user->id]` ΠΈ ΡΠ°Π±ΠΎΡΠΈ Ρ Π²ΡΡΠΊΠ° ΡΠ΅Π»Π°ΡΠΈΡ `BelongsTo`.
ΠΠ° ΡΠ΅Π»Π°ΡΠΈΠΈ `HasMany` ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ `has()`:
β`php
User::factory()
->has(Post::factory()->count(5))
->create();
β`
4. ΠΠΎΠΊΠ°Π»ΠΈ Π½Π° Faker Π·Π° ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ
Faker ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π½Π°Π΄ 70 Π»ΠΎΠΊΠ°Π»Π°. ΠΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° Π»ΠΎΠΊΠ°Π»Π° Π·Π°ΡΡΠ³Π° ΠΈΠΌΠ΅Π½Π°, Π°Π΄ΡΠ΅ΡΠΈ, ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ Π½Π° Π²Π°Π»ΡΡΠΈ.
β`php
// config/app.php
'faker_locale' => 'de_DE',
β`
ΠΠ»ΠΈ Π·Π°ΠΌΠ΅ΡΡΠ΅ΡΠ΅ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΡΠ°Π±ΡΠΈΠΊΠ° ΠΏΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡΠ½ΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅:
β`php
protected function withFaker(): FakerGenerator
{
return FakerFactory::create('ja_JP');
}
β`
ΠΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»ΠΈΡΠ΅ Π΅ Π½Π΅ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ. `en_US`, `fr_FR`, `de_DE`, `es_ES` ΠΈ `pt_BR` ΠΈΠΌΠ°Ρ ΠΈΠ·ΡΠ΅ΡΠΏΠ°ΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈΡΠ΅. ΠΠΎ-ΡΡΠ΄ΠΊΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈΡΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π°Ρ Π±Π΅Π·ΡΡΠΌΠ½ΠΎ ΠΊΡΠΌ `en_US` Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΈΠ½Π°Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΉΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° Π½Π° Π»ΠΎΠΊΠ°Π»Π°, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ°Π·ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π΅Π³ΠΎ Π² ΡΠ΅ΡΡΠΎΠ²Π΅, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° Π»ΠΎΠΊΠ°Π»Π°.
5. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΠΈ Π·Π° Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠ°Π½Π° Π²Π°ΡΠΈΠ°ΡΠΈΡ
ΠΠΎΠ³Π°ΡΠΎ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ΠΈΠΌΠΈ, ΡΠΈΠΊΠ»ΠΈΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ `sequence()`:
β`php
User::factory()
->count(6)
->sequence(
['role' => 'admin'],
['role' => 'editor'],
['role' => 'viewer'],
)
->create();
β`
Π’ΠΎΠ²Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΡΠΈΠΊΠ»ΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π· ΠΌΠ°ΡΠΈΠ²Π° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°ΠΉΠΊΠΈ ΡΠΎΠ»ΠΈ ΠΏΠΎ ΡΠ΅Π΄. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠ°Π½ ΠΈ Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ β ΠΎΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ½ΠΈΠΌΠΊΠΈ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΅ΠΊΡΠ°Π½Π½ΠΈ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
6. ΠΠ±ΡΠ°ΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ: `afterMaking` ΠΈ `afterCreating`
ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π» β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΊΠ°ΡΠ²Π°Π½Π΅ Π½Π° pivot ΡΠ΅Π»Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ.
β`php
public function configure(): static
{
return $this->afterCreating(function (User $user) {
$user->profile()->create([
'bio' => $this->faker->paragraph(),
'avatar' => $this->faker->imageUrl(200, 200, 'people'),
]);
});
}
β`
`afterMaking` ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΡΠ»Π΅Π΄ `make()` (ΡΠ°ΠΌΠΎ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°); `afterCreating` ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΡΠ»Π΅Π΄ `create()` (Π·Π°ΠΏΠ°Π·Π΅Π½ΠΎ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ). ΠΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΉΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π²ΡΡΡΠ΅ Π² `afterMaking` β ΡΠΎΠ²Π° ΠΎΡΡΠ΅ΡΡΠ²Π° ΡΠ΅Π»ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°.
ΠΡΡΠ·Π° ΡΠΏΡΠ°Π²ΠΊΠ° Π·Π° ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Faker
| ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡ | Π€ΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ | ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΈΠ·Ρ ΠΎΠ΄ |
|---|---|---|
| ΠΠΈΡΠ΅ | `name()` | `Jane Doe` |
| ΠΠΈΡΠ΅ | `firstName()` / `lastName()` | `Marcus` / `Chen` |
| ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ | `safeEmail()` | `user@example.com` |
| ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ | `url()` | `https://www.example.org/path` |
| ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ | `ipv4()` / `ipv6()` | `192.168.1.1` / `::1` |
| ΠΠ΄ΡΠ΅Ρ | `streetAddress()` | `742 Evergreen Terrace` |
| ΠΠ΄ΡΠ΅Ρ | `city()` / `country()` | `Springfield` / `Germany` |
| ΠΠ΄ΡΠ΅Ρ | `latitude()` / `longitude()` | `48.8566` / `2.3522` |
| ΠΠ°ΡΠ° ΠΈ ΡΠ°Ρ | `dateTimeBetween('-1 year', 'now')` | `2024-03-15 09:22:11` |
| ΠΠ°ΡΠ° ΠΈ ΡΠ°Ρ | `unixTime()` | `1710494531` |
| Π’Π΅ΠΊΡΡ | `sentence(6)` | `The quick brown fox jumps.` |
| Π’Π΅ΠΊΡΡ | `paragraphs(3, true)` | ΠΠ½ΠΎΠ³ΠΎΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠ΅Π½ Π½ΠΈΠ· |
| Π§ΠΈΡΠ»ΠΎ | `numberBetween(1, 100)` | `47` |
| Π§ΠΈΡΠ»ΠΎ | `randomFloat(2, 1, 999)` | `234.87` |
| ΠΠ»Π°ΡΠ°Π½Π΅ | `creditCardNumber()` | `4111111111111111` |
| ΠΠ»Π°ΡΠ°Π½Π΅ | `iban()` | `DE89370400440532013000` |
| Π Π°Π·Π½ΠΈ | `uuid()` | `550e8400-e29b-41d4-a716-446655440000` |
| Π Π°Π·Π½ΠΈ | `boolean(75)` | `true` (75% Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡ) |
| Π Π°Π·Π½ΠΈ | `md5()` / `sha256()` | Π₯Π΅Ρ Π½ΠΈΠ·ΠΎΠ²Π΅ |
Faker ΡΡΠ΅ΡΡ ΡΡΡΠ½ΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ ΡΡΠ΅ΡΡ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ
| ΠΠΎΠ΄Ρ ΠΎΠ΄ | ΠΡΠ·ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΠΎΡΡ | Π ΠΈΡΠΊ Π·Π° ΠΏΠΎΠ²Π΅ΡΠΈΡΠ΅Π»Π½ΠΎΡΡ | Π Π°Π·Ρ ΠΎΠ΄ΠΈ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° | Π Π΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΎΡΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ | ΠΠ°ΠΉ-ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° |
|---|---|---|---|---|---|
| **Faker + Π€Π°Π±ΡΠΈΠΊΠΈ** | ΠΠΈΡΠΎΠΊΠ° (Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΠΈ) | ΠΠΈΠΊΠ°ΠΊΡΠ² | ΠΠΈΡΡΠΊ | ΠΠΈΡΠΎΠΊΠ° | ΠΠ΄ΠΈΠ½ΠΈΡΠ½ΠΈ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ, ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ |
| **Π ΡΡΠ½ΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠΈΠΊΡΡΡΡΠΈ** | ΠΠ΅ΡΡΠ΅ΠΊΡΠ½Π° | ΠΠΈΠΊΠ°ΠΊΡΠ² | ΠΠΈΡΠΎΠΊ | ΠΠΈΡΠΊΠ° | Π’Π΅ΡΡΠΎΠ²Π΅ Π·Π° ΡΠ½ΠΈΠΌΠΊΠΈ / ΡΠ΅Π³ΡΠ΅ΡΠΈΡ |
| **Π‘Π½ΠΈΠΌΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ** | ΠΠ΅ΡΡΠ΅ΠΊΡΠ½Π° | ΠΡΠΈΡΠΈΡΠ΅Π½ | Π‘ΡΠ΅Π΄Π΅Π½ | ΠΠ΅ΡΡΠ΅ΠΊΡΠ½Π° | Π‘Π°ΠΌΠΎ Π·Π° ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° |
| **Π£ΡΠ»ΡΠ³ΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ** | Π‘ΡΠ΅Π΄Π½Π° | ΠΠΈΡΡΠΊ | Π‘ΡΠ΅Π΄Π΅Π½ | ΠΠ½ΠΎΠ³ΠΎ Π²ΠΈΡΠΎΠΊΠ° | Π’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π² Π³ΠΎΠ»ΡΠΌ ΠΌΠ°ΡΠ°Π± |
Π‘Π½ΠΈΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΡΡΠ΅Π΄ΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ»ΠΈ CI ΠΏΠΎΡΠ°Π΄ΠΈ GDPR, CCPA ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π·Π°Π΄ΡΠ»ΠΆΠ΅Π½ΠΈΡ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. Faker Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° ΠΈΠ·ΡΡΠ»ΠΎ ΡΠΎΠ·ΠΈ ΡΠΈΡΠΊ.
Π‘ΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π² Π³ΠΎΠ»ΡΠΌ ΠΌΠ°ΡΠ°Π±
ΠΠ°ΠΈΠ²Π½ΠΎΡΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° 100 000 Π·Π°ΠΏΠΈΡΠ° Ρ `User::factory()->count(100000)->create()` ΡΠ΅ Π±ΡΠ΄Π΅ Π±Π°Π²Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΡΠΊΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° `create()` Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° Eloquent ΡΡΠ±ΠΈΡΠΈΡ, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΠΎ Π΅Π΄ΠΈΠ½ `INSERT` Π½Π° ΠΌΠΎΠ΄Π΅Π». ΠΠ° ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π² Π³ΠΎΠ»ΡΠΌ ΠΌΠ°ΡΠ°Π±:
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ `createMany()` Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°ΡΡΠΈ:
β`php
foreach (range(1, 100) as $chunk) {
User::factory()->count(1000)->create();
}
β`
ΠΠ°ΠΎΠ±ΠΈΠΊΠΎΠ»Π΅ΡΠ΅ Eloquent Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ Π²ΠΌΡΠΊΠ²Π°Π½ΠΈΡ:
β`php
$records = User::factory()->count(10000)->make()->map->getAttributes()->toArray();
User::insert($records); // Single bulk INSERT β no events, no observers
β`
ΠΠ΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅:
β`php
User::withoutEvents(function () {
User::factory()->count(50000)->create();
});
β`
ΠΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡΡ: Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΡΠ±ΠΈΡΠΈΡΡΠ° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΠΈΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡ Π·Π° ΡΡΡΡΠ΅Π½Π΅, ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ΅Ρ) Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ. Π’ΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π·Π° ΡΠ΅ΡΡΠΎΠ²ΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΎ.
Π Π°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ Laravel ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΈ ΡΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
Faker ΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π² ΡΡΠ΅Π΄ΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ CI, Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ, ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°. ΠΠ° Laravel ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΡΠ΅Π΄Π° Ρ VPS Ρ ΠΎΡΡΠΈΠ½Π³ Π²ΠΈ Π΄Π°Π²Π° ΠΏΡΠ»Π΅Π½ ΠΊΠΎΠ½ΡΡΠΎΠ» Π²ΡΡΡ Ρ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° PHP, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° OPcache, ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° ΠΎΠΏΠ°ΡΠΊΠΈ ΠΈ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ β Π²ΡΠΈΡΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΏΡΡΠΊΠΎ Π²Π»ΠΈΡΡΡ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΠΉΠ΄ΡΡΠΈΡΠ΅ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΈΡ Π²ΠΈ ΠΏΠ°ΠΊΠ΅Ρ.
ΠΠΊΠΎ Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π΅Π½ ΡΡΠ°ΡΠΈΠΊ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ, Dedicated ΡΡΡΠ²ΡΡΠΈΡΠ΅ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΡΡΠΌΠ½ΠΈΡΠ΅ ΡΡΡΠ΅Π΄ΠΈ, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎΡΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ. ΠΠ° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅Π΄ΠΈ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΠΏΠ°Π½Π΅Π» Π·Π°Π΅Π΄Π½ΠΎ Ρ Π²Π°ΡΠ΅ΡΠΎ Laravel ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, VPS Ρ cPanel ΠΎΠΏΡΠΎΡΡΡΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° PHP, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, Π±Π΅Π· Π΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° Π·Π°Π΄ΡΠ»Π±ΠΎΡΠ΅Π½ΠΈ ΠΏΠΎΠ·Π½Π°Π½ΠΈΡ ΠΏΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠΈ.
ΠΠΎΠ³Π°ΡΠΎ Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΈ ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠΌΠ΅ΠΉΠ» β ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΠ° ΠΎΠ±ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ΅ΡΡΠ²Π°ΡΠ΅ Ρ Π΄Π°Π½Π½ΠΈ, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ ΠΎΡ Faker β Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈΡΡ ΠΈΠΌΠ΅ΠΉΠ» Ρ ΠΎΡΡΠΈΠ½Π³ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΈΠΌΠ΅ΠΉΠ»ΠΈ ΠΎΡ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΡΡΠ΅Π΄ΠΈ Π΄ΠΎΡΡΠΈΠ³Π°Ρ Π΄ΠΎ ΡΠ΅ΡΡΠ΅ΡΠΈΡΠ΅ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠ°ΡΠ°.
Π§Π΅ΡΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅Π³Π½Π΅ΡΠ΅
`OverflowException` ΠΏΡΠΈ `unique()`
ΠΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡΡ Π½Π° Faker Π΅ Π·Π° Π·Π°ΡΠ²ΠΊΠ°, Π° Π½Π΅ Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠΊΠΎ ΠΏΠΎΠΏΡΠ»Π½ΠΈΡΠ΅ 10 000 ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Ρ `unique()->safeEmail()` Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ Π½Π° ΡΠΈΠΉΠ΄ΡΡΠΈ, Π²ΡΡΡΠ΅ΡΠ½ΠΈΡΡ ΠΊΠ΅Ρ Π½Π° Faker ΡΠ΅ Π½ΡΠ»ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΈ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π΄ΠΎΡΡΠΈΠ³Π½Π°Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ Π²Π°Π½Π΅ΡΠ΅ `QueryException` Π² ΡΠΈΠΊΡΠ» Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ ΠΎΠΏΠΈΡ, ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ `uuid()` ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡΡ.
ΠΠ΅Π·ΡΡΠΌΠ½ΠΎ Π²ΡΡΡΠ°Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π° ΠΊΡΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ
ΠΠΊΠΎ `faker_locale` Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ Π½Π° Π»ΠΎΠΊΠ°Π» Ρ Π½Π΅ΠΏΡΠ»Π½ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈΡΠ΅, Faker Π±Π΅Π·ΡΡΠΌΠ½ΠΎ ΡΠ΅ Π²ΡΡΡΠ° ΠΊΡΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈ Π·Π° Π»ΠΈΠΏΡΠ²Π°ΡΠΈΡΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΠΈΡΠ΅ΡΠ΅ Π±ΡΡΠ· ΡΠ΅ΡΡ Π·Π° Π΄ΠΈΠΌ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° Π»ΠΎΠΊΠ°Π»Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π³Π΅ΡΠΌΠ°Π½ΡΠΊΠΈΡΠ΅ ΠΏΠΎΡΠ΅Π½ΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ ΡΠ° 5 ΡΠΈΡΡΠΈ), Π·Π° Π΄Π° Π³ΠΎ Ρ Π²Π°Π½Π΅ΡΠ΅ ΡΠ°Π½ΠΎ.
ΠΠ·ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ
Π’ΡΠ΅ΠΉΡΡΡ `HasFactory` ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΌΠΎ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠΈ Π΅ ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π²ΠΈΡΠΎΠΊΠ° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ, ΠΏΠΎΠΌΠΈΡΠ»Π΅ΡΠ΅ Π·Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° `HasFactory` ΠΎΡ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ ΠΌΡ ΡΠ°ΠΌΠΎ Π² ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΡΠ΅ΡΡΠΎΠ²Π΅.
ΠΠ°Π²Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ ΠΏΡΠ΅ΠΊΠΎΠΌΠ΅ΡΠ½ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
ΠΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ `make()` ΠΏΡΠ΅Π΄ `create()` Π² Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΠΏΠΎΡΡΠΎΡΠ½ΡΡΠ²ΠΎ. `make()` Π²ΡΡΡΠ° Eloquent ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π±Π΅Π· Π΄Π° Π΄ΠΎΠΊΠΎΡΠ²Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΠΉΠΊΠΈ Π΄ΡΠ°ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅.
Π’Π²ΡΡΠ΄ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ `now()`, Π½Π°ΡΡΡΠ°Π²Π°Ρ Π²ΡΠ΅ΠΌΠ΅Π²ΠΎ-ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅
ΠΠ°ΠΌΠ΅Π½Π΅ΡΠ΅ `now()` Π² Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠΈ Ρ `$this->faker->dateTimeBetween('-1 year', 'now')` Π·Π° ΠΏΠΎΠ»Π΅ΡΠ° ΠΊΠ°ΡΠΎ `created_at` ΠΈΠ»ΠΈ `email_verified_at` ΠΏΡΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅Π²ΠΎ-Π·Π°Π²ΠΈΡΠΈΠΌΠΈ Π·Π°ΡΠ²ΠΊΠΈ.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ ΠΊΠ»ΡΡΠΎΠ²ΠΈ ΠΈΠ·Π²ΠΎΠ΄ΠΈ
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅ ΠΈ ΡΠΈΠΉΠ΄ΡΡΠΈΡΠ΅ Π½Π° Π΅ΠΊΠΈΠΏ ΠΈΠ»ΠΈ CI ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ:
- [ ] ΠΡΠΈΡΠΊΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ `safeEmail()` ΠΈΠ»ΠΈ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΈ RFC 2606 Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ β Π±Π΅Π· ΡΠ΅Π°Π»Π½ΠΈ ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈ Π² ΡΠ΅ΡΡΠΎΠ²ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ
- [ ] ΠΠΎΠ»Π΅ΡΠ°ΡΠ° `unique()` ΠΈΠΌΠ°Ρ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠ°Π·Π½Π° ΠΌΡΠ΅ΠΆΠ°
- [ ] Π‘ΠΈΠΉΠ΄ΡΡΠΈΡΠ΅ ΡΠ° ΠΎΠ³ΡΠ°Π΄Π΅Π½ΠΈ Π·Π°Π΄ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° `app()->environment()`, Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ
- [ ] ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π² Π³ΠΎΠ»ΡΠΌ ΠΌΠ°ΡΠ°Π± ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ°ΡΠΎΠ²ΠΎ Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ `withoutEvents()`, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈΡΠ΅ Π΅ΡΠ΅ΠΊΡΠΈ Π½Π° Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ
- [ ] ΠΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈΡΠ΅ Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ Π² `AppServiceProvider`, Π°ΠΊΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π±ΡΠΈΠΊΠΈ
- [ ] ΠΠΎΠΊΠ°Π»ΡΡ Π΅ ΠΈΠ·ΡΠΈΡΠ½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ Π² `config/app.php` ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ ΡΠΏΡΡΠΌΠΎ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
- [ ] ΠΠ±ΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ `afterCreating` Π½Π΅ Π΄ΡΠ±Π»ΠΈΡΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΠ°, Π²Π΅ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½Π° ΠΎΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π°
- [ ] Π‘ΡΡΡΠΎΡΠ½ΠΈΡΡΠ° Π½Π° ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅ ΠΏΠΎΠΊΡΠΈΠ²Π°Ρ Π²ΡΠΈΡΠΊΠΈ Π·Π½Π°ΡΠΈΠΌΠΈ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅
- [ ] `make()` ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅; `create()` Π΅ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΎ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅
- [ ] ΠΠΈΡΠΎ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» Π½Π° ΡΠ°Π±ΡΠΈΠΊΠ° ΠΈΠ»ΠΈ ΡΠΈΠΉΠ΄ΡΡ Π½Π΅ ΡΠ΅ ΡΠ°Π·Π³ΡΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ (Π½Π°Π»Π°Π³Π°ΠΉΡΠ΅ ΡΡΠ΅Π· `.gitattributes` ΠΈΠ»ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π·Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅)
Π§Π΅ΡΡΠΎ Π·Π°Π΄Π°Π²Π°Π½ΠΈ Π²ΡΠΏΡΠΎΡΠΈ
ΠΠ°ΠΊΠ²Π° Π΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ `make()` ΠΈ `create()` Π² Laravel ΡΠ°Π±ΡΠΈΠΊΠΈΡΠ΅?
`make()` ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ° Eloquent ΠΌΠΎΠ΄Π΅Π» Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π±Π΅Π· Π΄Π° Π·Π°ΠΏΠΈΡΠ²Π° Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. `create()` ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ° ΠΌΠΎΠ΄Π΅Π»Π° ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π³ΠΎ Π·Π°ΠΏΠ°Π·Π²Π° ΡΡΠ΅Π· `INSERT`. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ `make()` Π² Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ Π·Π° ΡΠΊΠΎΡΠΎΡΡ; ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ `create()`, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ΡΡΡΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΅Π°Π»Π΅Π½ Π·Π°ΠΏΠΈΡ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ°ΠΊ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌ Π΄Π°Π½Π½ΠΈ Π½Π° Faker Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ Π΅Π·ΠΈΠΊ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ΠΌΡΠΊΠΈ ΠΈΠ»ΠΈ ΡΠΏΠΎΠ½ΡΠΊΠΈ?
ΠΠ°Π΄Π°ΠΉΡΠ΅ `'faker_locale' => 'de_DE'` (ΠΈΠ»ΠΈ `'ja_JP'`) Π² `config/app.php`. ΠΠ° Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΡΠ°Π±ΡΠΈΠΊΠ°, Π·Π°ΠΌΠ΅ΡΡΠ΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° `withFaker()` ΠΈ Π²ΡΡΠ½Π΅ΡΠ΅ `FakerFactory::create('de_DE')`. ΠΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π·Π° ΠΈΠ·Π±ΡΠ°Π½ΠΈΡ ΠΎΡ Π²Π°Ρ Π»ΠΎΠΊΠ°Π», ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΡΠΊΠΎΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π΅Π·ΡΡΠΌΠ½ΠΎ ΡΠ΅ Π²ΡΡΡΠ°Ρ ΠΊΡΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈ.
ΠΠΎΠΆΠ΅ Π»ΠΈ Faker Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Ρ ΡΠ΅Π°Π»Π½Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π½Π° ΡΠΎΡΠΌΠ°ΡΠ°?
ΠΠ°, Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΠ±ΡΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ. ΠΠΎΠΌΠ΅ΡΠ°ΡΠ° Π½Π° ΠΊΡΠ΅Π΄ΠΈΡΠ½ΠΈ ΠΊΠ°ΡΡΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ Π½Π° Luhn, IBAN ΡΠ»Π΅Π΄Π²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ISO 13616, Π° ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ½ΠΎ Π²Π°Π»ΠΈΠ΄Π½ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Faker Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π² Π²ΡΠ½ΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ β Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΡΠ΅Π»Π΅ΡΠΎΠ½Π΅Π½ Π½ΠΎΠΌΠ΅Ρ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ ΠΏΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ.
ΠΠ°ΠΊ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡ `unique()` Π΄Π° Ρ Π²ΡΡΠ»Ρ `OverflowException` ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π² Π³ΠΎΠ»ΡΠΌ ΠΌΠ°ΡΠ°Π±?
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ Π²ΠΈΡΠΎΠΊΠ° ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»Π½ΠΎΡΡ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡΡ β `uuid()`, `sha256()` ΠΈΠ»ΠΈ ΡΡΡΡΠ°Π²Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ. ΠΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ `unique()` Π·Π° ΠΏΠΎΠ»Π΅ΡΠ° Ρ Π½ΠΈΡΠΊΠ° ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»Π½ΠΎΡΡ ΠΊΠ°ΡΠΎ `boolean` ΠΈΠ»ΠΈ ΠΊΡΠ°ΡΠΊΠΈ ΠΈΠ·Π±ΡΠΎΡΠ²Π°Π½ΠΈΡ. ΠΠ° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡΡ Π½Π° ΠΈΠΌΠ΅ΠΉΠ»ΠΈ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΉΡΠ΅ `userName()` Ρ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΠΎΡΠΏΠ΅ΡΠ°ΡΡΠΊ ΠΈΠ»ΠΈ UUID ΡΡΡΠΈΠΊΡ, Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΠ°Π·ΡΠΈΡΠ°ΡΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Π½Π° Π²ΡΡΡΠ΅ΡΠ½ΠΈΡ ΠΊΠ΅Ρ Π·Π° Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° Faker.
Π’ΡΡΠ±Π²Π° Π»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Faker Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° Π°Π½ΠΎΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π°Π»Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ?
ΠΠ΅. Faker Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Π° Π½Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° Π°Π½ΠΎΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅. ΠΠ° GDPR-ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ Π°Π½ΠΎΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° Π°Π½ΠΎΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ `archtechx/laravel-data-anonymization`), ΠΊΠΎΡΡΠΎ Π·Π°ΠΌΠ΅ΡΡΠ²Π° ΡΠ΅Π°Π»Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΠΌΡΡΡΠΎ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΈ ΡΠΈΠΊΡΠΈΠ²Π½ΠΈ, Π·Π°ΠΏΠ°Π·Π²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½Π°ΡΠ° ΡΡΠ»ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅.
ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΡΠΈΠ½Π³ ΡΡΠ»ΡΠ³ΠΈ