Skip to content

Commit e0131e4

Browse files
authoredJul 10, 2023
Merge pull request #18 from SOHELAHMED7/master
Resolve: Improve FakerController to work with relations
2 parents da802e5 + 9c13bd8 commit e0131e4

File tree

4 files changed

+287
-5
lines changed

4 files changed

+287
-5
lines changed
 

Diff for: ‎README.md

+12
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,18 @@ The following list explains the directory structure in more detail:
196196
- `logs/` - log files
197197
- `runtime/` - temporary runtime files
198198

199+
200+
# Development
201+
202+
Below commands are helpful while developing this project:
203+
204+
```bash
205+
./yii gii/api --openApiPath=/app/openapi/schema.yaml --generateMigrations=0 --generateControllers=0 --generateUrls=0
206+
207+
./yii gii/api --openApiPath=/app/openapi/schema.yaml --generateMigrations=1 --generateControllers=0 --generateUrls=0 --generateModels=0 --generateModelFaker=0
208+
```
209+
210+
199211
# Support
200212

201213
**Need help with your API project?**

Diff for: ‎config/gii-generators.php

-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@
1111
'modelNamespace' => 'common\\models',
1212
'fakerNamespace' => 'common\\models\\faker',
1313
'migrationPath' => '@common/migrations',
14-
1514
],
1615
];

Diff for: ‎console/commands/FakerController.php

+72-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use yii\console\Controller;
66
use yii\helpers\Console;
7-
use yii\helpers\FileHelper;
7+
use yii\helpers\{FileHelper, VarDumper};
88
use yii\helpers\StringHelper;
99

1010
/**
@@ -19,9 +19,11 @@ public function actionIndex()
1919
'except' => ['BaseModelFaker.php'],
2020
]);
2121

22-
foreach($fakers as $fakerFile) {
23-
$className = 'common\\models\\faker\\' . StringHelper::basename($fakerFile, '.php');
24-
$this->stdout('Generating fake data for ' . StringHelper::basename($fakerFile, 'Faker.php') . '...');
22+
$sortedFakersModels = static::sortModels($fakers, '\\common\\models\\faker\\');
23+
24+
foreach($sortedFakersModels as $justModelClassName) {
25+
$className = 'common\\models\\faker\\' . StringHelper::basename($justModelClassName, '.php').'Faker';
26+
$this->stdout('Generating fake data for ' . StringHelper::basename($justModelClassName, 'Faker.php') . '...');
2527
$faker = new $className;
2628
for($i = 0; $i < 10; $i++) {
2729
$model = $faker->generateModel();
@@ -33,4 +35,70 @@ public function actionIndex()
3335
$this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);
3436
}
3537
}
38+
39+
public static function sortModels(array $fakers, string $fakerNamespace = 'app\\models\\')
40+
{
41+
$modelsDependencies = [];
42+
foreach($fakers as $fakerFile) {
43+
$className = $fakerNamespace . StringHelper::basename($fakerFile, '.php');
44+
$faker = new $className;
45+
46+
$modelClassName = str_replace(
47+
'Faker',
48+
'',
49+
StringHelper::basename($fakerFile, '.php')
50+
);
51+
52+
if (!method_exists($className, 'dependentOn')) {
53+
$modelsDependencies[$modelClassName] = null;
54+
} else {
55+
$modelsDependencies[$modelClassName] = $className::dependentOn();
56+
}
57+
}
58+
59+
$standalone = array_filter($modelsDependencies, function ($elm) {
60+
return $elm === null;
61+
});
62+
63+
$dependent = array_filter($modelsDependencies, function ($elm) {
64+
return $elm !== null;
65+
});
66+
67+
$justDepenentModels = array_keys($dependent);
68+
$sortedDependentModels = $justDepenentModels;
69+
70+
foreach ($justDepenentModels as $model) {
71+
if ($modelsDependencies[$model] !== null) {
72+
foreach ($modelsDependencies[$model] as $dependentOn) {
73+
if ($modelsDependencies[$dependentOn] !== null) {
74+
// move $dependentOn before $model
75+
76+
// move model to sort/order
77+
// in that function if it is already before (sorted) then avoid it
78+
static::moveModel($sortedDependentModels, $dependentOn, $model);
79+
}
80+
}
81+
}
82+
}
83+
84+
$finalSortedModels = array_merge(array_keys($standalone), $sortedDependentModels);
85+
return $finalSortedModels;
86+
}
87+
88+
public static function moveModel(&$sortedDependentModels, $dependentOn, $model)
89+
{
90+
$modelKey = array_search($model, $sortedDependentModels);
91+
$depKey = array_search($dependentOn, $sortedDependentModels);
92+
if ($depKey < $modelKey) {
93+
return;
94+
}
95+
96+
unset($sortedDependentModels[$depKey]);
97+
98+
$restRight = array_slice($sortedDependentModels, $modelKey);
99+
$theKey = (($modelKey) < 0) ? 0 : ($modelKey);
100+
$restLeft = array_slice($sortedDependentModels, 0, $theKey);
101+
102+
$sortedDependentModels = array_merge($restLeft, [$dependentOn], $restRight);
103+
}
36104
}

Diff for: ‎openapi/schema.yaml

+203
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
openapi: 3.0.3
2+
# Edit this schema and start your project
3+
# This is sample schema
4+
# To generate code which is based on this schema
5+
# run commands mentioned Development section in README.md file
6+
info:
7+
title: 'Proxy-Service'
8+
description: ""
9+
version: 1.0.0
10+
contact:
11+
name: '...'
12+
email: you@example.com
13+
servers:
14+
- url: 'http://localhost:8937'
15+
description: 'Local Dev API'
16+
security:
17+
- BasicAuth: []
18+
components:
19+
securitySchemes:
20+
BasicAuth:
21+
type: http
22+
scheme: basic
23+
schemas:
24+
Account:
25+
description: user account
26+
type: object
27+
required:
28+
- id
29+
- name
30+
properties:
31+
id:
32+
type: integer
33+
name:
34+
description: account name
35+
type: string
36+
maxLength: 40
37+
x-faker: 'substr($faker->userName(), 0, 40)'
38+
39+
Domain:
40+
description: domain
41+
type: object
42+
required:
43+
- id
44+
- name
45+
- account
46+
- created_at
47+
properties:
48+
id:
49+
type: integer
50+
name:
51+
description: domain or sub-domain name, in DNS syntax, IDN are converted
52+
type: string
53+
maxLength: 128
54+
x-faker: '$faker->domainName'
55+
account:
56+
$ref: '#/components/schemas/Account'
57+
58+
routings:
59+
type: array
60+
items:
61+
$ref: '#/components/schemas/Routing'
62+
63+
created_at:
64+
readOnly: true
65+
type: string
66+
format: datetime
67+
x-db-type: datetime
68+
nullable: false
69+
70+
Routing:
71+
description: rounting specification
72+
type: object
73+
required:
74+
- id
75+
- domain
76+
properties:
77+
id:
78+
type: integer
79+
domain:
80+
$ref: '#/components/schemas/Domain'
81+
path:
82+
type: string
83+
maxLength: 255
84+
x-faker: '$faker->randomElement(["/", "/", "/", "/", "/api", "/tools", "/assets/web"])'
85+
86+
ssl:
87+
type: boolean
88+
redirect_to_ssl:
89+
type: boolean
90+
91+
service:
92+
type: string
93+
maxLength: 255
94+
x-faker: '"http://tador.cebe.net/" . $faker->domainName'
95+
96+
created_at:
97+
readOnly: true
98+
type: string
99+
format: datetime
100+
x-db-type: datetime
101+
nullable: true
102+
d123:
103+
$ref: '#/components/schemas/D123'
104+
a123:
105+
$ref: '#/components/schemas/A123'
106+
107+
D123:
108+
description: desc
109+
type: object
110+
required:
111+
- id
112+
properties:
113+
id:
114+
type: integer
115+
name:
116+
type: string
117+
A123:
118+
description: desc
119+
type: object
120+
required:
121+
- id
122+
properties:
123+
id:
124+
type: integer
125+
name:
126+
type: string
127+
b123:
128+
$ref: '#/components/schemas/B123'
129+
B123:
130+
description: desc
131+
type: object
132+
required:
133+
- id
134+
properties:
135+
id:
136+
type: integer
137+
name:
138+
type: string
139+
c123:
140+
$ref: '#/components/schemas/C123'
141+
C123:
142+
description: desc
143+
type: object
144+
required:
145+
- id
146+
properties:
147+
id:
148+
type: integer
149+
name:
150+
type: string
151+
E123:
152+
description: desc
153+
type: object
154+
required:
155+
- id
156+
properties:
157+
id:
158+
type: integer
159+
name:
160+
type: string
161+
b123:
162+
$ref: '#/components/schemas/B123'
163+
164+
165+
paths:
166+
/:
167+
get:
168+
responses: []
169+
description: none
170+
171+
172+
173+
# Dependencies:
174+
# 'E123' => [
175+
# 0 => 'B123'
176+
# ]
177+
# 'Account' => null
178+
# 'C123' => null
179+
# 'Domain' => [
180+
# 0 => 'Account'
181+
# ]
182+
# 'B123' => [
183+
# 0 => 'C123'
184+
# ]
185+
# 'Routing' => [
186+
# 0 => 'Domain'
187+
# 1 => 'D123'
188+
# 2 => 'A123'
189+
# ]
190+
# 'D123' => null
191+
# 'A123' => [
192+
# 0 => 'B123'
193+
# ]
194+
195+
# Sorted:
196+
# 'Account',
197+
# 'C123',
198+
# 'D123',
199+
# 'B123',
200+
# 'E123',
201+
# 'Domain',
202+
# 'A123',
203+
# 'Routing',

0 commit comments

Comments
 (0)
Please sign in to comment.