Faker Extension for Yii 2
This extension provides a Faker
fixture command for Yii 2.
This repository is a git submodule of https://github.com/yiisoft/yii2. Please submit issue reports and pull requests to the main repository. For license information check the LICENSE-file.
Installation
The preferred way to install this extension is through composer.
Either run
php composer.phar require --prefer-dist yiisoft/yii2-faker
or add
"yiisoft/yii2-faker": "~2.0.0"
to the require section of your composer.json.
Usage
To use this extension, simply add the following code in your application configuration (console.php):
'controllerMap' => [
'fixture' => [
'class' => 'yii\faker\FixtureController',
],
],
Define a tests
alias in your console config. For example, for the basic
application template, this should be added
to the console.php
configuration: Yii::setAlias('tests', __DIR__ . '/../tests');
To start using this command you need to be familiar (read guide) with the Faker library and
generate fixture template files, according to the given format:
// users.php file under template path (by default @tests/unit/templates/fixtures)
/**
* @var $faker \Faker\Generator
* @var $index integer
*/
return [
'name' => $faker->firstName,
'phone' => $faker->phoneNumber,
'city' => $faker->city,
'password' => Yii::$app->getSecurity()->generatePasswordHash('password_' . $index),
'auth_key' => Yii::$app->getSecurity()->generateRandomString(),
'intro' => $faker->sentence(7, true), // generate a sentence with 7 words
];
As you can see, the template file is just a regular PHP script. The script should return an array of key-value
pairs, where the keys represent the table column names and the values the corresponding value. When you run
the fixture/generate
command, the script will be executed once for every data row being generated.
In this script, you can use the following two predefined variables:
-
$faker
: the Faker generator instance -
$index
: the current fixture index. For example if user need to generate 3 fixtures for user table, it will be 0..2.
With such a template file, you can generate your fixtures using the commands like the following:
# generate fixtures from user fixture template
php yii fixture/generate user
# to generate several fixture data files
php yii fixture/generate user profile team
In the code above users
is template name. After running this command, a new file with the same template name
will be created under the fixture path in the @tests/unit/fixtures
) folder.
php yii fixture/generate-all
This command will generate fixtures for all template files that are stored under template path and
store fixtures under fixtures path with file names same as templates names.
You can specify how many fixtures per file you need by the --count
option. In the code below we generate
all fixtures and in each file there will be 3 rows (fixtures).
php yii fixture/generate-all --count=3
You can specify different options of this command:
# generate fixtures in russian language
php yii fixture/generate User --count=5 --language='ru_RU'
# read templates from the other path
php yii fixture/generate-all --templatePath='@app/path/to/my/custom/templates'
# generate fixtures into other directory.
php yii fixture/generate-all --fixtureDataPath='@tests/acceptance/fixtures/data'
You can see all available templates by running command:
# list all templates under default template path (i.e. '@tests/unit/templates/fixtures')
php yii fixture/templates
# list all templates under specified template path
php yii fixture/templates --templatePath='@app/path/to/my/custom/templates'
You also can create your own data providers for custom tables fields, see Faker library guide for more info; After you created custom provider, for example:
class Book extends \Faker\Provider\Base
{
public function title($nbWords = 5)
{
$sentence = $this->generator->sentence($nbWords);
return mb_substr($sentence, 0, mb_strlen($sentence) - 1);
}
}
You can use it by adding it to the $providers
property of the current command. In your console.php config:
'controllerMap' => [
'fixture' => [
'class' => 'yii\faker\FixtureController',
'providers' => [
'app\tests\unit\faker\providers\Book',
],
],
]