Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
f3315475
Commit
f3315475
authored
Jan 02, 2014
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixes #1748: code cleanup.
parent
03a88e4f
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
130 additions
and
127 deletions
+130
-127
FixtureController.php
extensions/yii/faker/FixtureController.php
+97
-95
FixtureController.php
framework/yii/console/controllers/FixtureController.php
+33
-32
No files found.
extensions/yii/faker/FixtureController.php
View file @
f3315475
...
...
@@ -18,120 +18,122 @@ use yii\helpers\Console;
* 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 "f
aker:f
ixture"):
*
*
* You should configure this command as follows (you can use any alias, not only "fixture"):
*
* ~~~
*
'controllerMap' => [
*
'fixture' => [
*
'class' => 'yii\faker\FixtureController',
*
],
*
],
*
'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;
*
}
*
],
*
[
*
'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
*
* - `$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
*
* yii fixture/generate users
*
* //also a short version of this command (generate action is default)
*
php
yii fixture users
* yii fixture users
*
* //to generate fixtures for several tables, use "," as a separator, for example:
*
php
yii fixture users,profile
* 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
"
*
* You can generate fixtures for all templates by specifying keyword "all"
*
* ~~~
*
php
yii fixture/generate all
* yii fixture/generate all
* ~~~
*
* This command will generate fixtures for all template files that are stored under $templatePath and
* store fixtures under $fixture
s
Path with file names same as templates names.
*
*
* This command will generate fixtures for all template files that are stored under $templatePath and
* store fixtures under $fixturePath 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
* 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'
*
* //generate fixtures in russian langu
a
ge
* 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'
*
* 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 --fixtures
Path='@tests/unit/fixtures/subfolder1/subfolder2/subfolder3'
*
yii fixture/generate all --fixture
Path='@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);
* }
* 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);
*
}
*
}
*
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',
*
],
*
],
*
],
*
'controllerMap' => [
*
'fixture' => [
*
'class' => 'yii\faker\FixtureController',
*
'providers' => [
*
'app\tests\unit\faker\providers\Book',
*
],
*
],
*
],
* ~~~
*
*
* @property \Faker\Generator $generator
*
*
* @author Mark Jebri <mark.github@yandex.ru>
* @since 2.0.0
*/
class
FixtureController
extends
\yii\console\controllers\FixtureController
...
...
@@ -179,7 +181,7 @@ class FixtureController extends \yii\console\controllers\FixtureController
public
function
globalOptions
()
{
return
array_merge
(
parent
::
globalOptions
(),
[
'templatePath'
,
'language'
'templatePath'
,
'language'
]);
}
...
...
@@ -197,19 +199,19 @@ class FixtureController extends \yii\console\controllers\FixtureController
/**
* 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 specif
iy
ng keyword "all" as filename.
* by specif
yi
ng 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
);
$fixture
sPath
=
Yii
::
getAlias
(
$this
->
fixtures
Path
);
$fixture
Path
=
Yii
::
getAlias
(
$this
->
fixture
Path
);
if
(
$this
->
needToGenerateAll
(
$file
[
0
]))
{
$files
=
FileHelper
::
findFiles
(
$templatePath
,
[
'only'
=>
[
'.php'
]]);
}
else
{
foreach
(
$file
as
$fileName
)
{
}
else
{
$filesToSearch
=
[];
foreach
(
$file
as
$fileName
)
{
$filesToSearch
[]
=
$fileName
.
'.php'
;
}
$files
=
FileHelper
::
findFiles
(
$templatePath
,
[
'only'
=>
$filesToSearch
]);
...
...
@@ -217,8 +219,8 @@ class FixtureController extends \yii\console\controllers\FixtureController
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
}
\"
."
"No files were found by name:
\"
{
$file
}
\"
.
\n
"
.
"Check that template with these name exists, under template path:
\n\"
{
$templatePath
}
\"
."
);
}
...
...
@@ -235,9 +237,9 @@ class FixtureController extends \yii\console\controllers\FixtureController
$fixtures
[
$i
]
=
$this
->
generateFixture
(
$template
,
$i
);
}
$content
=
$this
->
exportFixtures
(
$fixtures
);
file_put_contents
(
$fixture
sPath
.
'/'
.
$fixtureFileName
,
$content
);
$this
->
stdout
(
"Fixture file was generated under: "
.
realpath
(
$fixture
s
Path
.
"/"
.
$fixtureFileName
)
.
"
\n
"
,
Console
::
FG_GREEN
);
$content
=
$this
->
exportFixtures
(
$fixtures
);
file_put_contents
(
$fixture
Path
.
'/'
.
$fixtureFileName
,
$content
);
$this
->
stdout
(
"Fixture file was generated under: "
.
realpath
(
$fixturePath
.
"/"
.
$fixtureFileName
)
.
"
\n
"
,
Console
::
FG_GREEN
);
}
}
...
...
@@ -250,7 +252,7 @@ class FixtureController extends \yii\console\controllers\FixtureController
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
;
$language
=
is_null
(
$this
->
language
)
?
str_replace
(
'-'
,
'_'
,
Yii
::
$app
->
language
)
:
$this
->
language
;
$this
->
_generator
=
\Faker\Factory
::
create
(
$language
);
}
...
...
@@ -274,7 +276,7 @@ class FixtureController extends \yii\console\controllers\FixtureController
*/
public
function
addProviders
()
{
foreach
(
$this
->
providers
as
$provider
)
{
foreach
(
$this
->
providers
as
$provider
)
{
$this
->
generator
->
addProvider
(
new
$provider
(
$this
->
generator
));
}
}
...
...
@@ -308,18 +310,18 @@ class FixtureController extends \yii\console\controllers\FixtureController
/**
* Returns exported to the string representation of given fixtures array.
* @param
type
$fixtures
* @param
array
$fixtures
* @return string exported fixtures format
*/
public
function
exportFixtures
(
$fixtures
)
{
$content
=
"<?php
\n\n
return ["
;
foreach
(
$fixtures
as
$fixture
)
{
foreach
(
$fixtures
as
$fixture
)
{
$content
.=
"
\n\t
["
;
foreach
(
$fixture
as
$name
=>
$value
)
{
foreach
(
$fixture
as
$name
=>
$value
)
{
$content
.=
"
\n\t\t
'
{
$name
}
' => '
{
$value
}
',"
;
}
...
...
@@ -340,9 +342,9 @@ class FixtureController extends \yii\console\controllers\FixtureController
{
$fixture
=
[];
foreach
(
$template
as
$attribute
=>
$fakerProperty
)
{
foreach
(
$template
as
$attribute
=>
$fakerProperty
)
{
if
(
!
is_string
(
$fakerProperty
))
{
$fixture
=
call_user_func_array
(
$fakerProperty
,
[
$fixture
,
$this
->
generator
,
$index
]);
$fixture
=
call_user_func_array
(
$fakerProperty
,
[
$fixture
,
$this
->
generator
,
$index
]);
}
else
{
$fixture
[
$attribute
]
=
$this
->
generator
->
$fakerProperty
;
}
...
...
@@ -359,12 +361,12 @@ class FixtureController extends \yii\console\controllers\FixtureController
public
function
confirmGeneration
(
$files
)
{
$this
->
stdout
(
"Fixtures will be generated under the path:
\n
"
,
Console
::
FG_YELLOW
);
$this
->
stdout
(
realpath
(
Yii
::
getAlias
(
$this
->
fixture
sPath
,
false
))
.
"
\n\n
"
,
Console
::
FG_GREEN
);
$this
->
stdout
(
realpath
(
Yii
::
getAlias
(
$this
->
fixture
Path
,
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
);
$this
->
stdout
(
" "
.
(
$index
+
1
)
.
". "
.
basename
(
$fileName
)
.
"
\n
"
,
Console
::
FG_GREEN
);
}
return
$this
->
confirm
(
'Generate above fixtures?'
);
}
...
...
framework/yii/console/controllers/FixtureController.php
View file @
f3315475
...
...
@@ -15,35 +15,36 @@ 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',
*
],
*
'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 $fixture
s
Path to the "users" table
*
php
yii fixture/apply users
*
* #load fixtures under $fixturePath to the "users" table
* yii fixture/apply users
*
* #also a short version of this command (generate action is default)
*
php
yii fixture users
*
* #load fixtures under $fixture
s
Path to the "users" table to the different connection
*
php
yii fixture/apply users --db='someOtherDbConneciton'
*
* #load fixtures under different $fixture
s
Path to the "users" table.
*
php yii fixture/apply users --fixtures
Path='@app/some/other/path/to/fixtures'
* yii fixture users
*
* #load fixtures under $fixturePath to the "users" table to the different connection
* yii fixture/apply users --db='someOtherDbConneciton'
*
* #load fixtures under different $fixturePath to the "users" table.
*
yii fixture/apply users --fixture
Path='@app/some/other/path/to/fixtures'
* ~~~
*
*
* @author Mark Jebri <mark.github@yandex.ru>
* @since 2.0
*/
...
...
@@ -61,11 +62,11 @@ class FixtureController extends Controller
* Alias to the path, where all fixtures are stored.
* @var string
*/
public
$fixture
s
Path
=
'@tests/unit/fixtures'
;
public
$fixturePath
=
'@tests/unit/fixtures'
;
/**
* Id of the database connection component of the application.
* @var string
* @var string
*/
public
$db
=
'db'
;
...
...
@@ -76,14 +77,14 @@ class FixtureController extends Controller
public
function
globalOptions
()
{
return
array_merge
(
parent
::
globalOptions
(),
[
'db'
,
'fixtures
Path'
'db'
,
'fixture
Path'
]);
}
/**
* 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
* @param
\yii\base\Action
$action
* @return boolean
*/
public
function
beforeAction
(
$action
)
...
...
@@ -103,7 +104,7 @@ class FixtureController extends Controller
*/
public
function
actionApply
(
$fixture
)
{
$this
->
fixtureManager
->
basePath
=
$this
->
fixture
s
Path
;
$this
->
fixtureManager
->
basePath
=
$this
->
fixturePath
;
$this
->
fixtureManager
->
db
=
$this
->
db
;
$this
->
loadFixtures
([
$fixture
]);
}
...
...
@@ -114,7 +115,7 @@ class FixtureController extends Controller
*/
public
function
actionClear
(
$table
)
{
$this
->
dbConnection
->
createCommand
()
->
truncateTable
(
$table
)
->
execute
();
$this
->
getDbConnection
()
->
createCommand
()
->
truncateTable
(
$table
)
->
execute
();
echo
"Table
\"
{
$table
}
\"
was successfully cleared.
\n
"
;
}
...
...
@@ -124,17 +125,17 @@ class FixtureController extends Controller
*/
public
function
checkRequirements
()
{
$path
=
Yii
::
getAlias
(
$this
->
fixture
s
Path
,
false
);
$path
=
Yii
::
getAlias
(
$this
->
fixturePath
,
false
);
if
(
!
is_dir
(
$path
)
||
!
is_writable
(
$path
))
{
throw
new
Exception
(
"The fixtures path
\"
{
$this
->
fixture
s
Path
}
\"
not exist or is not writable"
);
throw
new
Exception
(
"The fixtures path
\"
{
$this
->
fixturePath
}
\"
not exist or is not writable"
);
}
}
/**
* Returns database connection component
* @return yii\db\Connection|null
* @return
\
yii\db\Connection|null
*/
public
function
getDbConnection
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment