Search
Write a publication
Pull to refresh

Comments 4

Недавно задался похожей задачей, но писал код вручную, а в качестве генератора использовал fzaninotto/Faker.

P.S. заметил один важный плюс в генерации контента для БД — всплыло большое кол-во багов верстки (верстальщик не учел возможную длинну текста), недочеты в валидации полей моделей сразу всплыли.
Действительно интересное решение, буду иметь ввиду! Для использования в проектах на PHP очень удобно. В настоящий момент работаю с yii2 фреймворком и, после вашего комментария, в нем нашел Class yii\faker\FixtureController.
Думаю, будет очень удобно постепенно перейти на него: синтаксис простой и понятный, типы генерируемых данных впечатляют, подробная документация и главное уже встроен в любимый фреймворк. Спасибо!
Как раз faker я и использовал с yii2)

По поводу FixtureController, не очень понятно как им пользоваться для решения задачи заполнения БД. Шаблоны для заполнения моделей приходиться писать самому, а комманда yii fixture/generate только и делает что генерирует из шаблонов массив для $model->setAttributes() и сохраняет его в файл. Хотя, возможно, я что-то не понял.

Я, в свое время, сделал так (у меня используется шаблон приложения yii2-advanced):
1. Унаследовал console/models/SomeModel от common/models/SomeModel, и добавил метод fixture, в котором фактически расположил тот самый шаблон(как в документации FixtureController) заполнения атрибутов с помощью faker'a.
2. Создал консольный контроллер с экшеном generate, где пошагово создавал модели, вызывал метод ->fixture() для их заполнения, а также в коде контроллера формировал связи между моделями в БД.
Я сейчас сделал так:
1. установил через композер (использую WAMP OpenServer).
2. вставка в console.php 'controllerMap' вываливает ошибку, поэтому просто подключаю в контроллере...:
use Faker;

3. В контроллере создаю действие для заполнения тестовыми данными (у меня в интерфейсе кнопка позволяющая заполнить тестовыми данными-это связано с предметной областью, в общем не суть). Что получилось на Faker:
 public function actionTestfill()
 {
    	$faker = Faker\Factory::create('ru_RU');
    	for($i=0;$i<10;$i++){
    		$model = new Organization();
    		$model->caption = $faker->company;
    		$model->short_caption = $model->caption;
    		$model->country = $faker->country;
    		$model->city = $faker->city;
    		$model->webpage = mb_strtolower($faker->unique()->domainName);
    		//$model->date_update = $faker->date($format = 'Y-m-d', $max = 'now').' '.$faker->time($format = 'H:i:s', $max = 'now');
    		$model->isedu = $faker->biasedNumberBetween(0,1,'sqrt');
    		$model->note = $faker->optional($weight = 0.5)->text(255);
    		$model->save(false);
    	}
return $this->redirect('index');
}

Есть накладки при валидации модели (часть данных заполняется при beforeSave, и модель валидацию не проходит), пока работает так…
Faker из коробки не умеет генерировать короткое название организации
4. шпаргалка по генераторам здесь Faker#basic-usage".

Для сравнения приведу генерацию той же модели, но на databene-benerator:
	<generate type="s_organization" count="10" consumer="db,ConsoleExporter">
		<id name="id_org" mode="ignored"/>
		<reference name="id_user" targetType="T_User" source="db" distribution="random"/>
		
		<variable name="c" generator="CompanyNameGenerator" dataset="US" locale="us"/>
		<attribute name="caption" type='string' script="c.fullName" />
		<attribute name="short_caption" type='string' script="c.shortName" />

		<variable name="a" generator="AddressGenerator" dataset="US" locale="us"/>
		<attribute name="country" type='string' script="a.country" />
		<attribute name="city" type='string' script="a.city" />
		
		<variable name="d" generator="DomainGenerator" dataset="US" locale="us"/>
		<attribute name="webpage" type='string' script="d" converter="ToLowerCaseConverter, UniqueStringConverter"/>
		
		<attribute name="date_update" type="datetime" generator="dtGen"/>
		<attribute name="isedu" type="int" distribution="cumulated" min="0" max="1"/>
		
		<variable name="vnote" source="memstore" type="Note" distribution="random"/>
		<attribute name="note" type='string' script="vnote.notes"/>
	</generate>


В защиту databene-benerator'a скажу, что он не просто генерирует данные, он способен к генерации связанных данных (
<reference>
). У Faker'а из коробки этого нет. Поэтому для связанных данных Faker'ом придется использовать что-то типа цикла по связанным таблицам/моделям и генерации для них моделей… но плюс Faker'a — генерация из самого приложения…
Поправьте, если я чего-то не понял…
Sign up to leave a comment.

Articles