7 changed files with 755 additions and 0 deletions
			
			
		| @ -0,0 +1,12 @@ | ||||
| Yii Framework 2 faker extension Change Log | ||||
| ============================================== | ||||
| 
 | ||||
| 2.0.0 beta under development | ||||
| ---------------------------- | ||||
| 
 | ||||
| - no changes in this release. | ||||
| 
 | ||||
| 2.0.0 alpha, December 1, 2013 | ||||
| ----------------------------- | ||||
| 
 | ||||
| - Initial release. | ||||
| @ -0,0 +1,372 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\faker; | ||||
| 
 | ||||
| use Yii; | ||||
| use yii\console\Exception; | ||||
| use yii\helpers\FileHelper; | ||||
| use yii\helpers\Console; | ||||
| 
 | ||||
| /** | ||||
|  * This command manage fixtures creations based on given template. | ||||
|  * | ||||
|  * Fixtures are one of the important paths in unit testing. To speed up developers | ||||
|  * work these fixtures can be generated automatically, based on prepared template. | ||||
|  * This command is a simple wrapper for the fixtures library [Faker](https://github.com/fzaninotto/Faker). | ||||
|  *  | ||||
|  * You should configure this command as follows (you can use any alias, not only "faker:fixture"): | ||||
|  *  | ||||
|  * ~~~ | ||||
|  *	'controllerMap' => [ | ||||
|  *		'fixture' => [ | ||||
|  *			'class' => 'yii\faker\FixtureController', | ||||
|  *		], | ||||
|  *	], | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * To start using this command you need to be familiar (read guide) for the Faker library and | ||||
|  * generate fixtures template files, according to the given format: | ||||
|  *  | ||||
|  * ~~~ | ||||
|  * #users.php file under $templatePath | ||||
|  *  | ||||
|  * return [ | ||||
|  *	[ | ||||
|  *		'table_column0' => 'faker_formatter', | ||||
|  *		... | ||||
|  *		'table_columnN' => 'other_faker_formatter | ||||
|  *		'table_columnN+1' => function ($fixture, $faker, $index) { | ||||
|  *			//set needed fixture fields based on different conditions | ||||
|  *			return $fixture; | ||||
|  *		} | ||||
|  *	], | ||||
|  * ]; | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * If you use callback as a attribute value, then it will be called as shown with three parameters: | ||||
|  * - $fixture - current fixture array.  | ||||
|  * - $faker - faker generator instance | ||||
|  * - $index - current fixture index. For example if user need to generate 3 fixtures for tbl_user, it will be 0..2 | ||||
|  * After you set all needed fields in callback, you need to return $fixture array back from the callback. | ||||
|  *  | ||||
|  * After you prepared needed templates for tables you can simply generate your fixtures via command | ||||
|  *  | ||||
|  * ~~~ | ||||
|  * php yii fixture/generate users | ||||
|  *  | ||||
|  * //also a short version of this command (generate action is default) | ||||
|  * php yii fixture users | ||||
|  * | ||||
|  * //to generate fixtures for several tables, use "," as a separator, for example: | ||||
|  * php yii fixture users,profile | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * In the code above "users" is template name, after this command run, new file named same as template | ||||
|  * will be created under the $fixturesPath folder. | ||||
|  * You can generate fixtures for all templates by specifying keyword "all_fixtures" | ||||
|  *  | ||||
|  * ~~~ | ||||
|  * php yii fixture/generate all | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * This command will generate fixtures for all template files that are stored under $templatePath and  | ||||
|  * store fixtures under $fixturesPath with file names same as templates names. | ||||
|  *  | ||||
|  * You can specify how many fixtures per file you need by the second parameter. In the code below we generate | ||||
|  * all fixtures and in each file there will be 3 rows (fixtures). | ||||
|  *  | ||||
|  * ~~~ | ||||
|  * php yii fixture/generate all 3 | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * You can specify different options of this command: | ||||
|  *  | ||||
|  * ~~~ | ||||
|  * //generate fixtures in russian languge | ||||
|  * php yii fixture/generate users 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 folders, but be sure that this folders exists or you will get notice about that. | ||||
|  * php yii fixture/generate all --fixturesPath='@tests/unit/fixtures/subfolder1/subfolder2/subfolder3' | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * You also can create your own data providers for custom tables fields, see Faker library guide for more info (https://github.com/fzaninotto/Faker); | ||||
|  * 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); | ||||
|  *		} | ||||
|  * | ||||
|  *		public function ISBN() | ||||
|  *		{ | ||||
|  *			return $this->generator->randomNumber(13); | ||||
|  *		} | ||||
|  *	} | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * 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', | ||||
|  *			], | ||||
|  *		], | ||||
|  *	], | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * @property \Faker\Generator $generator | ||||
|  *  | ||||
|  * @since 2.0.0 | ||||
|  */ | ||||
| class FixtureController extends \yii\console\controllers\FixtureController | ||||
| { | ||||
| 
 | ||||
| 	/** | ||||
| 	 * type of fixture generating | ||||
| 	 */ | ||||
| 	const GENERATE_ALL = 'all'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @var string controller default action ID. | ||||
| 	 */ | ||||
| 	public $defaultAction = 'generate'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Alias to the template path, where all tables templates are stored. | ||||
| 	 * @var string | ||||
| 	 */ | ||||
| 	public $templatePath = '@tests/unit/templates/fixtures'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Language to use when generating fixtures data. | ||||
| 	 * @var string | ||||
| 	 */ | ||||
| 	public $language; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Additional data providers that can be created by user and will be added to the Faker generator. | ||||
| 	 * More info in [Faker](https://github.com/fzaninotto/Faker.) library docs. | ||||
| 	 * @var array | ||||
| 	 */ | ||||
| 	public $providers = []; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Faker generator instance | ||||
| 	 * @var \Faker\Generator | ||||
| 	 */ | ||||
| 	private $_generator; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the names of the global options for this command. | ||||
| 	 * @return array the names of the global options for this command. | ||||
| 	 */ | ||||
| 	public function globalOptions() | ||||
| 	{ | ||||
| 		return array_merge(parent::globalOptions(), [ | ||||
| 			'templatePath','language' | ||||
| 		]); | ||||
| 	} | ||||
| 
 | ||||
| 	public function beforeAction($action) | ||||
| 	{ | ||||
| 		if (parent::beforeAction($action)) { | ||||
| 			$this->checkPaths(); | ||||
| 			$this->addProviders(); | ||||
| 			return true; | ||||
| 		} else { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Generates fixtures and fill them with Faker data. | ||||
| 	 * @param string $file filename for the table template. You can generate all fixtures for all tables | ||||
| 	 * by specifiyng keyword "all" as filename. | ||||
| 	 * @param integer $times how much fixtures do you want per table | ||||
| 	 */ | ||||
| 	public function actionGenerate(array $file, $times = 2) | ||||
| 	{ | ||||
| 		$templatePath = Yii::getAlias($this->templatePath); | ||||
| 		$fixturesPath = Yii::getAlias($this->fixturesPath); | ||||
| 
 | ||||
| 		if ($this->needToGenerateAll($file[0])) { | ||||
| 			$files = FileHelper::findFiles($templatePath, ['only' => ['.php']]); | ||||
| 		} | ||||
| 		else { | ||||
| 			foreach($file as $fileName) { | ||||
| 				$filesToSearch[] = $fileName . '.php'; | ||||
| 			} | ||||
| 			$files = FileHelper::findFiles($templatePath, ['only' => $filesToSearch]); | ||||
| 		} | ||||
| 
 | ||||
| 		if (empty($files)) { | ||||
| 			throw new Exception( | ||||
| 					"No files were found by name: \"{$file}\". \n" | ||||
| 					. "Check that template with these name exists, under template path: \n\"{$templatePath}\"." | ||||
| 			); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!$this->confirmGeneration($files)) { | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		foreach ($files as $templateFile) { | ||||
| 			$fixtureFileName = basename($templateFile); | ||||
| 			$template = $this->getTemplate($templateFile); | ||||
| 			$fixtures = []; | ||||
| 
 | ||||
| 			for ($i = 0; $i < $times; $i++) { | ||||
| 				$fixtures[$i] = $this->generateFixture($template, $i); | ||||
| 			} | ||||
| 
 | ||||
| 			$content = $this->exportFixtures($fixtures);  | ||||
| 			file_put_contents($fixturesPath.'/'.$fixtureFileName, $content); | ||||
| 			$this->stdout("Fixture file was generated under: " . realpath($fixturesPath . "/" . $fixtureFileName) . "\n", Console::FG_GREEN); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns Faker generator instance. Getter for private property. | ||||
| 	 * @return \Faker\Generator | ||||
| 	 */ | ||||
| 	public function getGenerator() | ||||
| 	{ | ||||
| 		if (is_null($this->_generator)) { | ||||
| 			//replacing - on _ because Faker support only en_US format and not intl | ||||
| 
 | ||||
| 			$language = is_null($this->language) ? str_replace('-','_', Yii::$app->language) : $this->language; | ||||
| 			$this->_generator = \Faker\Factory::create($language); | ||||
| 		} | ||||
| 
 | ||||
| 		return $this->_generator; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Check if the template path and migrations path exists and writable. | ||||
| 	 */ | ||||
| 	public function checkPaths() | ||||
| 	{ | ||||
| 		$path = Yii::getAlias($this->templatePath); | ||||
| 
 | ||||
| 		if (!is_dir($path)) { | ||||
| 			throw new Exception("The template path \"{$this->templatePath}\" not exist"); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Adds users providers to the faker generator. | ||||
| 	 */ | ||||
| 	public function addProviders() | ||||
| 	{ | ||||
| 		foreach($this->providers as $provider) { | ||||
| 			$this->generator->addProvider(new $provider($this->generator)); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Checks if needed to generate all fixtures. | ||||
| 	 * @param string $file | ||||
| 	 * @return bool | ||||
| 	 */ | ||||
| 	public function needToGenerateAll($file) | ||||
| 	{ | ||||
| 		return $file == self::GENERATE_ALL; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns generator template for the given fixture name | ||||
| 	 * @param string $file template file | ||||
| 	 * @return array generator template | ||||
| 	 * @throws \yii\console\Exception if wrong file format | ||||
| 	 */ | ||||
| 	public function getTemplate($file) | ||||
| 	{ | ||||
| 		$template = require($file); | ||||
| 
 | ||||
| 		if (!is_array($template)) { | ||||
| 			throw new Exception("The template file \"$file\" has wrong format. It should return valid template array"); | ||||
| 		} | ||||
| 
 | ||||
| 		return $template; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns exported to the string representation of given fixtures array. | ||||
| 	 * @param type $fixtures | ||||
| 	 * @return string exported fixtures format | ||||
| 	 */ | ||||
| 	public function exportFixtures($fixtures) | ||||
| 	{ | ||||
| 		$content = "<?php\n\nreturn [";
 | ||||
| 
 | ||||
| 		foreach($fixtures as $fixture) { | ||||
| 
 | ||||
| 			$content .= "\n\t["; | ||||
| 
 | ||||
| 			foreach($fixture as $name=>$value) { | ||||
| 				$content .= "\n\t\t'{$name}' => '{$value}',"; | ||||
| 			} | ||||
| 
 | ||||
| 			$content .= "\n\t],"; | ||||
| 
 | ||||
| 		} | ||||
| 		$content .= "\n];\n"; | ||||
| 		return $content; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Generates fixture from given template | ||||
| 	 * @param array $template fixture template | ||||
| 	 * @param integer $index current fixture index | ||||
| 	 * @return array fixture | ||||
| 	 */ | ||||
| 	public function generateFixture($template, $index) | ||||
| 	{ | ||||
| 		$fixture = []; | ||||
| 
 | ||||
| 		foreach($template as $attribute => $fakerProperty) { | ||||
| 			if (!is_string($fakerProperty)) { | ||||
| 				$fixture = call_user_func_array($fakerProperty,[$fixture,$this->generator, $index]); | ||||
| 			} else { | ||||
| 				$fixture[$attribute] = $this->generator->$fakerProperty; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		return $fixture; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Prompts user with message if he confirm generation with given fixture templates files. | ||||
| 	 * @param array $files | ||||
| 	 * @return boolean | ||||
| 	 */ | ||||
| 	public function confirmGeneration($files) | ||||
| 	{ | ||||
| 		$this->stdout("Fixtures will be generated under the path: \n", Console::FG_YELLOW); | ||||
| 		$this->stdout(realpath(Yii::getAlias($this->fixturesPath, false)) ."\n\n", Console::FG_GREEN); | ||||
| 		$this->stdout("Templates will be taken from path: \n", Console::FG_YELLOW); | ||||
| 		$this->stdout(realpath(Yii::getAlias($this->templatePath, false)) . "\n\n", Console::FG_GREEN); | ||||
| 
 | ||||
| 		foreach ($files as $index => $fileName) { | ||||
| 			$this->stdout("    " . $index +1 . ". " . basename($fileName) . "\n",Console::FG_GREEN); | ||||
| 		} | ||||
| 		return $this->confirm('Generate above fixtures?'); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| The Yii framework is free software. It is released under the terms of | ||||
| the following BSD License. | ||||
| 
 | ||||
| Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions | ||||
| are met: | ||||
| 
 | ||||
|  * Redistributions of source code must retain the above copyright | ||||
|    notice, this list of conditions and the following disclaimer. | ||||
|  * Redistributions in binary form must reproduce the above copyright | ||||
|    notice, this list of conditions and the following disclaimer in | ||||
|    the documentation and/or other materials provided with the | ||||
|    distribution. | ||||
|  * Neither the name of Yii Software LLC nor the names of its | ||||
|    contributors may be used to endorse or promote products derived | ||||
|    from this software without specific prior written permission. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||
| FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||
| COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||
| BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||
| ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGE. | ||||
| @ -0,0 +1,160 @@ | ||||
| Faker Extension for Yii 2 | ||||
| =============================== | ||||
| 
 | ||||
| This extension provides a [`Faker`](https://github.com/fzaninotto/Faker) fixture command for Yii 2. | ||||
| 
 | ||||
| Installation | ||||
| ------------ | ||||
| 
 | ||||
| The preferred way to install this extension is through [composer](http://getcomposer.org/download/). | ||||
| 
 | ||||
| Either run | ||||
| 
 | ||||
| ``` | ||||
| php composer.phar require yiisoft/yii2-faker "*" | ||||
| ``` | ||||
| 
 | ||||
| or add | ||||
| 
 | ||||
| ```json | ||||
| "yiisoft/yii2-faker": "*" | ||||
| ``` | ||||
| 
 | ||||
| to the require section of your composer.json. | ||||
| 
 | ||||
| Usage | ||||
| ----- | ||||
| 
 | ||||
| To use this extension,  simply add the following code in your application configuration (console.php): | ||||
| 
 | ||||
| ```php | ||||
| 'controllerMap' => [ | ||||
| 	'fixture' => [ | ||||
| 		'class' => 'yii\faker\FixtureController', | ||||
| 	], | ||||
| ], | ||||
| ``` | ||||
| Set valid ```test``` alias in your console config, for example for ```basic``` application template, this should be added | ||||
| to ```console.php``` config: ```Yii::setAlias('tests', __DIR__ . '/../tests');``` | ||||
| To start using this command you need to be familiar (read guide) for the [Faker](https://github.com/fzaninotto/Faker) library and | ||||
| generate fixtures template files, according to the given format: | ||||
| 
 | ||||
| ```php | ||||
| //users.php file under template path (by default @tests/unit/templates/fixtures) | ||||
| return [ | ||||
| 	[ | ||||
| 		'table_column0' => 'faker_formatter', | ||||
| 		... | ||||
| 		'table_columnN' => 'other_faker_formatter' | ||||
| 		'body' => function ($fixture, $faker, $index) { | ||||
| 			//set needed fixture fields based on different conditions | ||||
| 
 | ||||
| 			$fixture['body'] = $faker->sentence(7,true); //generate sentence exact with 7 words. | ||||
| 			return $fixture; | ||||
| 		} | ||||
| 	], | ||||
| ]; | ||||
| ``` | ||||
| 
 | ||||
| If you use callback as a attribute value, then it will be called as shown with three parameters: | ||||
| 
 | ||||
| * ```$fixture``` - current fixture array.  | ||||
| * ```$faker``` - faker generator instance | ||||
| * ```$index``` - current fixture index. For example if user need to generate 3 fixtures for tbl_user, it will be 0..2. | ||||
| 
 | ||||
| After you set all needed fields in callback, you need to return $fixture array back from the callback. | ||||
| 
 | ||||
| Another example of valid template: | ||||
| 
 | ||||
| ```php | ||||
| use yii\helpers\Security; | ||||
| 
 | ||||
| return [ | ||||
| 	'name' => 'firstName', | ||||
| 	'phone' => 'phoneNumber', | ||||
| 	'city' => 'city', | ||||
| 	'password' => function ($fixture, $faker, $index) { | ||||
| 		$fixture['password'] = Security::generatePasswordHash('password_' . $index); | ||||
| 		return $fixture; | ||||
| 	}, | ||||
| 	'auth_key' => function ($fixture, $faker, $index) { | ||||
| 		$fixture['auth_key'] = Security::generateRandomKey(); | ||||
| 		return $fixture; | ||||
| 	}, | ||||
| ]; | ||||
| ``` | ||||
| 
 | ||||
| After you prepared needed templates for tables you can simply generate your fixtures via command | ||||
| 
 | ||||
| ```php | ||||
| //generate fixtures for the users table based on users fixture template | ||||
| php yii fixture/generate users | ||||
| 
 | ||||
| //also a short version of this command ("generate" action is default) | ||||
| php yii fixture users | ||||
| 
 | ||||
| //to generate fixtures for several tables, use "," as a separator, for example: | ||||
| php yii fixture users,profile,some_other_table | ||||
| ``` | ||||
| 
 | ||||
| In the code above "users" is template name, after this command run, new file named same as template | ||||
| will be created under the fixtures path (by default ```@tests/unit/fixtures```) folder. | ||||
| You can generate fixtures for all templates by specifying keyword ```all```. | ||||
| 
 | ||||
| ```php | ||||
| php yii fixture/generate all_fixtures | ||||
| ``` | ||||
| 
 | ||||
| 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 second parameter. In the code below we generate | ||||
| all fixtures and in each file there will be 3 rows (fixtures). | ||||
| 
 | ||||
| ```php | ||||
| php yii fixture/generate all 3 | ||||
| ``` | ||||
| You can specify different options of this command: | ||||
| 
 | ||||
| ```php | ||||
| //generate fixtures in russian language | ||||
| php yii fixture/generate users 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 folders, but be sure that this folders exists or you will get notice about that. | ||||
| php yii fixture/generate all --fixturesPath='@tests/unit/fixtures/subfolder1/subfolder2/subfolder3' | ||||
| ``` | ||||
| 
 | ||||
| You also can create your own data providers for custom tables fields, see [Faker]((https://github.com/fzaninotto/Faker)) library guide for more info; | ||||
| After you created custom provider, for example: | ||||
| 
 | ||||
| ```php | ||||
| 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); | ||||
| 	} | ||||
| 
 | ||||
| 	public function ISBN() | ||||
| 	{ | ||||
| 		return $this->generator->randomNumber(13); | ||||
| 	} | ||||
| 
 | ||||
|  } | ||||
| ``` | ||||
| 
 | ||||
| You can use it by adding it to the ```$providers``` property of the current command. In your console.php config: | ||||
| 
 | ||||
| ```php | ||||
| 'controllerMap' => [ | ||||
| 	'fixture' => [ | ||||
| 		'class' => 'yii\faker\FixtureController', | ||||
| 		'providers' => [ | ||||
| 			'app\tests\unit\faker\providers\Book', | ||||
| 		], | ||||
| 	], | ||||
| ] | ||||
| ``` | ||||
| @ -0,0 +1,27 @@ | ||||
| { | ||||
| 	"name": "yiisoft/yii2-faker", | ||||
| 	"description": "Fixture generator. The Faker integration for the Yii framework.", | ||||
| 	"keywords": ["yii", "faker", "fixture"], | ||||
| 	"type": "yii2-extension", | ||||
| 	"license": "BSD-3-Clause", | ||||
| 	"support": { | ||||
| 		"forum": "http://www.yiiframework.com/forum/", | ||||
| 		"wiki": "http://www.yiiframework.com/wiki/", | ||||
| 		"irc": "irc://irc.freenode.net/yii", | ||||
| 		"source": "https://github.com/yiisoft/yii2" | ||||
| 	}, | ||||
| 	"authors": [ | ||||
| 		{ | ||||
| 			"name": "Mark Jebri", | ||||
| 			"email": "mark.github@yandex.ru" | ||||
| 		} | ||||
| 	], | ||||
| 	"require": { | ||||
| 		"yiisoft/yii2": "*", | ||||
| 		"fzaninotto/faker": "*" | ||||
| 	}, | ||||
| 	"autoload": { | ||||
| 		"psr-0": { "yii\\faker\\": "" } | ||||
| 	}, | ||||
| 	"target-dir": "yii/faker" | ||||
| } | ||||
| @ -0,0 +1,150 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\console\controllers; | ||||
| 
 | ||||
| use Yii; | ||||
| use yii\console\Controller; | ||||
| use yii\console\Exception; | ||||
| 
 | ||||
| /** | ||||
|  * This command manages fixtures load to the database tables. | ||||
|  * You can specify different options of this command to point fixture manager | ||||
|  * to the specific tables of the different database connections. | ||||
|  *  | ||||
|  * To use this command simply configure your console.php config like this: | ||||
|  * ~~~ | ||||
|  *	'db' => [ | ||||
|  *		'class' => 'yii\db\Connection', | ||||
|  *		'dsn' => 'mysql:host=localhost;dbname={your_database}', | ||||
|  *		'username' => '{your_db_user}', | ||||
|  *		'password' => '', | ||||
|  *		'charset' => 'utf8', | ||||
|  *	], | ||||
|  *	'fixture' => [ | ||||
|  *		'class' => 'yii\test\DbFixtureManager', | ||||
|  *	], | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * ~~~ | ||||
|  * #load fixtures under $fixturesPath to the "users" table | ||||
|  * php yii fixture/apply users | ||||
|  *  | ||||
|  * #also a short version of this command (generate action is default) | ||||
|  * php yii fixture users | ||||
|  *  | ||||
|  * #load fixtures under $fixturesPath to the "users" table to the different connection | ||||
|  * php yii fixture/apply users --db='someOtherDbConneciton' | ||||
|  *  | ||||
|  * #load fixtures under different $fixturesPath to the "users" table. | ||||
|  * php yii fixture/apply users --fixturesPath='@app/some/other/path/to/fixtures' | ||||
|  * ~~~ | ||||
|  *  | ||||
|  * @author Mark Jebri <mark.github@yandex.ru> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| class FixtureController extends Controller | ||||
| { | ||||
| 
 | ||||
| 	use \yii\test\DbTestTrait; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @var string controller default action ID. | ||||
| 	 */ | ||||
| 	public $defaultAction = 'apply'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Alias to the path, where all fixtures are stored. | ||||
| 	 * @var string | ||||
| 	 */ | ||||
| 	public $fixturesPath = '@tests/unit/fixtures'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Id of the database connection component of the application. | ||||
| 	 * @var string  | ||||
| 	 */ | ||||
| 	public $db = 'db'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the names of the global options for this command. | ||||
| 	 * @return array the names of the global options for this command. | ||||
| 	 */ | ||||
| 	public function globalOptions() | ||||
| 	{ | ||||
| 		return array_merge(parent::globalOptions(), [ | ||||
| 			'db','fixturesPath' | ||||
| 		]); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * This method is invoked right before an action is to be executed (after all possible filters.) | ||||
| 	 * It checks that fixtures path and database connection are available. | ||||
| 	 * @param type $action | ||||
| 	 * @return boolean | ||||
| 	 */ | ||||
| 	public function beforeAction($action) | ||||
| 	{ | ||||
| 		if (parent::beforeAction($action)) { | ||||
| 			$this->checkRequirements(); | ||||
| 			return true; | ||||
| 		} else { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Apply given fixture to the table. Fixture name can be the same as the table name or | ||||
| 	 * you can specify table name as a second parameter. | ||||
| 	 * @param string $fixture | ||||
| 	 */ | ||||
| 	public function actionApply($fixture) | ||||
| 	{ | ||||
| 		$this->fixtureManager->basePath = $this->fixturesPath; | ||||
| 		$this->fixtureManager->db = $this->db; | ||||
| 		$this->loadFixtures([$fixture]); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Truncate given table and clear all fixtures from it. | ||||
| 	 * @param string $table | ||||
| 	 */ | ||||
| 	public function actionClear($table) | ||||
| 	{ | ||||
| 		$this->dbConnection->createCommand()->truncateTable($table)->execute(); | ||||
| 		echo "Table \"{$table}\" was successfully cleared. \n"; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Checks if the database and fixtures path are available. | ||||
| 	 * @throws Exception | ||||
| 	 */ | ||||
| 	public function checkRequirements() | ||||
| 	{ | ||||
| 		$path = Yii::getAlias($this->fixturesPath, false); | ||||
| 
 | ||||
| 		if (!is_dir($path) || !is_writable($path)) { | ||||
| 			throw new Exception("The fixtures path \"{$this->fixturesPath}\" not exist or is not writable"); | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns database connection component | ||||
| 	 * @return yii\db\Connection|null | ||||
| 	 */ | ||||
| 	public function getDbConnection() | ||||
| 	{ | ||||
| 		$db = Yii::$app->getComponent($this->db); | ||||
| 
 | ||||
| 		if ($db == null) { | ||||
| 			throw new Exception("There is no database connection component with id \"{$this->db}\"."); | ||||
| 		} | ||||
| 
 | ||||
| 		return $db; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue