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
2271297d
Commit
2271297d
authored
Sep 01, 2014
by
Mark
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
adjusted faker fixture controller
parent
ff809683
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
199 additions
and
64 deletions
+199
-64
FixtureController.php
extensions/faker/FixtureController.php
+199
-64
No files found.
extensions/faker/FixtureController.php
View file @
2271297d
...
...
@@ -57,19 +57,16 @@ use yii\helpers\VarDumper;
* ~~~
* yii fixture/generate users
*
* //also a short version of this command (generate action is default)
* yii fixture users
*
* //to generate fixtures for several tables, use "," as a separator, for example:
* yii fixture users,profile
* //generate fixtures from several templates, for example:
* 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 `$fixtureDataPath` folder.
* You can generate fixtures for all templates
by specifying keyword "all"
* You can generate fixtures for all templates
, for example:
*
* ~~~
* yii fixture/generate
all
* yii fixture/generate
-
all
* ~~~
*
* This command will generate fixtures for all template files that are stored under $templatePath and
...
...
@@ -79,20 +76,20 @@ use yii\helpers\VarDumper;
* all fixtures and in each file there will be 3 rows (fixtures).
*
* ~~~
* yii fixture/generate
all
3
* yii fixture/generate
-all --count=
3
* ~~~
*
* You can specify different options of this command:
*
* ~~~
* //generate fixtures in russian language
* yii fixture/generate users 5 --language=ru_RU
* yii fixture/generate users
--count=
5 --language=ru_RU
*
* //read templates from the other path
* 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
* yii fixture/generate
all --fixtureDataPath=@tests/unit/fixtures/subfolder1/subfolder2/subfolder3
* yii fixture/generate
-
all --fixtureDataPath=@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);
...
...
@@ -101,16 +98,13 @@ use yii\helpers\VarDumper;
* ~~~
* 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);
* }
* }
* ~~~
*
...
...
@@ -132,16 +126,8 @@ use yii\helpers\VarDumper;
*/
class
FixtureController
extends
\yii\console\controllers\FixtureController
{
/**
* type of fixture generating
*/
const
GENERATE_ALL
=
'all'
;
/**
* @var string controller default action ID.
*/
public
$defaultAction
=
'generate'
;
/**
* @var string Alias to the template path, where all tables templates are stored.
*/
public
$templatePath
=
'@tests/unit/templates/fixtures'
;
...
...
@@ -154,6 +140,10 @@ class FixtureController extends \yii\console\controllers\FixtureController
*/
public
$language
;
/**
* @var integer total count of data per fixture. Defaults to 2.
*/
public
$count
=
2
;
/**
* @var array 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.
*/
...
...
@@ -180,7 +170,6 @@ class FixtureController extends \yii\console\controllers\FixtureController
if
(
parent
::
beforeAction
(
$action
))
{
$this
->
checkPaths
();
$this
->
addProviders
();
return
true
;
}
else
{
return
false
;
...
...
@@ -188,53 +177,189 @@ class FixtureController extends \yii\console\controllers\FixtureController
}
/**
* Lists all available fixtures template files.
*/
public
function
actionAllTemplates
()
{
$foundTemplates
=
$this
->
findTemplatesFiles
();
if
(
!
$foundTemplates
)
{
$this
->
notifyNoTemplatesFound
();
}
else
{
$this
->
notifyTemplatesCanBeGenerated
(
$foundTemplates
);
}
}
/**
* Generates fixtures and fill them with Faker data.
* For example,
*
* ~~~
* ~~~
* //generate fixtures in russian language
* yii fixture/generate users --count=5 --language=ru_RU
*
* //read templates from the other path and generate all fixtures
* yii fixture/generate-all --templatePath=@app/path/to/my/custom/templates
*
* //generate all fixtures into other folders
* yii fixture/generate-all --fixtureDataPath=@tests/unit/fixtures/subfolder1/subfolder2/subfolder3
* ~~~
*
* @param array|string $file filename for the table template.
* You can generate all fixtures for all tables by specifying keyword "all" as filename.
* @param integer $times how much fixtures do you want per table
* @throws \yii\base\InvalidParamException
* @throws \yii\console\Exception
*/
public
function
actionGenerate
(
array
$file
,
$times
=
2
)
public
function
actionGenerate
()
{
$templatesInput
=
func_get_args
();
if
(
empty
(
$templatesInput
))
{
throw
new
Exception
(
'You should specify input fixtures template files'
);
}
$foundTemplates
=
$this
->
findTemplatesFiles
(
$templatesInput
);
$notFoundTemplates
=
array_diff
(
$templatesInput
,
$foundTemplates
);
if
(
$notFoundTemplates
)
{
$this
->
notifyNotFoundTemplates
(
$notFoundTemplates
);
}
if
(
!
$foundTemplates
)
{
$this
->
notifyNoTemplatesFound
();
return
static
::
EXIT_CODE_NORMAL
;
}
if
(
!
$this
->
confirmGeneration
(
$foundTemplates
))
{
return
static
::
EXIT_CODE_NORMAL
;
}
$templatePath
=
Yii
::
getAlias
(
$this
->
templatePath
);
$fixtureDataPath
=
Yii
::
getAlias
(
$this
->
fixtureDataPath
);
if
(
$this
->
needToGenerateAll
(
$file
[
0
]))
{
$files
=
FileHelper
::
findFiles
(
$templatePath
,
[
'only'
=>
[
'*.php'
]]);
}
else
{
$filesToSearch
=
[];
foreach
(
$file
as
$fileName
)
{
$filesToSearch
[]
=
$fileName
.
'.php'
;
FileHelper
::
createDirectory
(
$fixtureDataPath
);
$generatedTemplates
=
[];
foreach
(
$foundTemplates
as
$templateName
)
{
$this
->
generateFixtureFile
(
$templateName
,
$templatePath
,
$fixtureDataPath
);
$generatedTemplates
[]
=
$templateName
;
}
$files
=
FileHelper
::
findFiles
(
$templatePath
,
[
'only'
=>
$filesToSearch
]);
$this
->
notifyTemplatesGenerated
(
$generatedTemplates
);
}
if
(
empty
(
$files
))
{
throw
new
Exception
(
"No files were found by name:
\"
"
.
implode
(
', '
,
$file
)
.
"
\"
.
\n
"
.
"Check that template with these name exists, under template path:
\n\"
{
$templatePath
}
\"
."
);
/**
* Generates all fixtures template path that can be found.
*/
public
function
actionGenerateAll
()
{
$foundTemplates
=
$this
->
findTemplatesFiles
();
if
(
!
$foundTemplates
)
{
$this
->
notifyNoTemplatesFound
();
return
static
::
EXIT_CODE_NORMAL
;
}
if
(
!
$this
->
confirmGeneration
(
$f
il
es
))
{
return
;
if
(
!
$this
->
confirmGeneration
(
$f
oundTemplat
es
))
{
return
static
::
EXIT_CODE_NORMAL
;
}
foreach
(
$files
as
$templateFile
)
{
$fixtureFileName
=
basename
(
$templateFile
);
$fixtures
=
[];
$templatePath
=
Yii
::
getAlias
(
$this
->
templatePath
);
$fixtureDataPath
=
Yii
::
getAlias
(
$this
->
fixtureDataPath
);
for
(
$i
=
0
;
$i
<
$times
;
$i
++
)
{
$fixtures
[
$i
]
=
$this
->
generateFixture
(
$templateFile
,
$i
);
FileHelper
::
createDirectory
(
$fixtureDataPath
);
$generatedTemplates
=
[];
foreach
(
$foundTemplates
as
$templateName
)
{
$this
->
generateFixtureFile
(
$templateName
,
$templatePath
,
$fixtureDataPath
);
$generatedTemplates
[]
=
$templateName
;
}
$content
=
$this
->
exportFixtures
(
$fixtures
);
FileHelper
::
createDirectory
(
$fixtureDataPath
);
file_put_contents
(
$fixtureDataPath
.
'/'
.
$fixtureFileName
,
$content
);
$this
->
notifyTemplatesGenerated
(
$generatedTemplates
);
}
$this
->
stdout
(
"Fixture file was generated under:
$fixtureDataPath
\n
"
,
Console
::
FG_GREEN
);
/**
* Notifies user that given fixtures template files were not found.
* @param array $templatesNames
*/
private
function
notifyNotFoundTemplates
(
$templatesNames
)
{
$this
->
stdout
(
"The following fixtures templates were NOT found:
\n\n
"
,
Console
::
FG_RED
);
foreach
(
$templatesNames
as
$name
)
{
$this
->
stdout
(
"
\t
*
$name
\n
"
,
Console
::
FG_GREEN
);
}
$this
->
stdout
(
"
\n
"
);
}
/**
* Notifies user that there was not found any files matching given input conditions.
*/
private
function
notifyNoTemplatesFound
()
{
$this
->
stdout
(
"No fixtures template files matching input conditions were found under the path:
\n\n
"
,
Console
::
FG_RED
);
$this
->
stdout
(
"
\t
"
.
Yii
::
getAlias
(
$this
->
templatePath
)
.
"
\n\n
"
,
Console
::
FG_GREEN
);
}
/**
* Notifies user that given fixtures template files were generated.
* @param array $templatesNames
*/
private
function
notifyTemplatesGenerated
(
$templatesNames
)
{
$this
->
stdout
(
"The following fixtures template files were generated:
\n\n
"
,
Console
::
FG_YELLOW
);
foreach
(
$templatesNames
as
$name
)
{
$this
->
stdout
(
"
\t
* "
.
$name
.
"
\n
"
,
Console
::
FG_GREEN
);
}
$this
->
stdout
(
"
\n
"
);
}
private
function
notifyTemplatesCanBeGenerated
(
$templatesNames
)
{
$this
->
stdout
(
"Template files path: "
,
Console
::
FG_YELLOW
);
$this
->
stdout
(
Yii
::
getAlias
(
$this
->
templatePath
)
.
"
\n\n
"
,
Console
::
FG_GREEN
);
foreach
(
$templatesNames
as
$name
)
{
$this
->
stdout
(
"
\t
* "
.
$name
.
"
\n
"
,
Console
::
FG_GREEN
);
}
$this
->
stdout
(
"
\n
"
);
}
/**
* Returns array containg fixtures templates file names. You can specify what files to find
* by the given parameter.
* @param array $templatesNames template file names to search. If empty then all files will be searched.
* @return array
*/
private
function
findTemplatesFiles
(
array
$templatesNames
=
[])
{
$findAll
=
(
$templatesNames
==
[]);
if
(
$findAll
)
{
$files
=
FileHelper
::
findFiles
(
Yii
::
getAlias
(
$this
->
templatePath
),
[
'only'
=>
[
'*.php'
]]);
}
else
{
$filesToSearch
=
[];
foreach
(
$templatesNames
as
$fileName
)
{
$filesToSearch
[]
=
$fileName
.
'.php'
;
}
$files
=
FileHelper
::
findFiles
(
Yii
::
getAlias
(
$this
->
templatePath
),
[
'only'
=>
$filesToSearch
]);
}
$foundTemplates
=
[];
foreach
(
$files
as
$fileName
)
{
$foundTemplates
[]
=
basename
(
$fileName
,
'.php'
);
}
return
$foundTemplates
;
}
/**
...
...
@@ -255,9 +380,9 @@ class FixtureController extends \yii\console\controllers\FixtureController
*/
public
function
checkPaths
()
{
$path
=
Yii
::
getAlias
(
$this
->
templatePath
);
$path
=
Yii
::
getAlias
(
$this
->
templatePath
,
false
);
if
(
!
is_dir
(
$path
))
{
if
(
!
$path
||
!
is_dir
(
$path
))
{
throw
new
Exception
(
"The template path
\"
{
$this
->
templatePath
}
\"
does not exist"
);
}
}
...
...
@@ -273,16 +398,6 @@ class FixtureController extends \yii\console\controllers\FixtureController
}
/**
* Checks if needed to generate all fixtures.
* @param string $file
* @return bool
*/
public
function
needToGenerateAll
(
$file
)
{
return
$file
==
self
::
GENERATE_ALL
;
}
/**
* Returns exported to the string representation of given fixtures array.
* @param array $fixtures
* @return string exported fixtures format
...
...
@@ -306,6 +421,25 @@ class FixtureController extends \yii\console\controllers\FixtureController
}
/**
* Generates fixture file by the given fixture template file.
* @param type $templateName template file name
* @param type $templatePath path where templates are stored
* @param type $fixtureDataPath fixture data path where generated file should be written
*/
public
function
generateFixtureFile
(
$templateName
,
$templatePath
,
$fixtureDataPath
)
{
$fixtures
=
[];
for
(
$i
=
0
;
$i
<
$this
->
count
;
$i
++
)
{
$fixtures
[
$i
]
=
$this
->
generateFixture
(
$templatePath
.
'/'
.
$templateName
.
'.php'
,
$i
);
}
$content
=
$this
->
exportFixtures
(
$fixtures
);
file_put_contents
(
$fixtureDataPath
.
'/'
.
$templateName
.
'.php'
,
$content
);
}
/**
* Prompts user with message if he confirm generation with given fixture templates files.
* @param array $files
* @return boolean
...
...
@@ -317,10 +451,11 @@ class FixtureController extends \yii\console\controllers\FixtureController
$this
->
stdout
(
"Templates will be taken from path:
\n
"
,
Console
::
FG_YELLOW
);
$this
->
stdout
(
"
\t
"
.
Yii
::
getAlias
(
$this
->
templatePath
)
.
"
\n\n
"
,
Console
::
FG_GREEN
);
foreach
(
$files
as
$
index
=>
$
fileName
)
{
$this
->
stdout
(
"
"
.
(
$index
+
1
)
.
". "
.
basename
(
$fileName
)
.
"
\n
"
,
Console
::
FG_GREEN
);
foreach
(
$files
as
$fileName
)
{
$this
->
stdout
(
"
\t
* "
.
$fileName
.
"
\n
"
,
Console
::
FG_GREEN
);
}
return
$this
->
confirm
(
'Generate above fixtures?'
);
}
}
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