@@ -81,6 +81,11 @@ class DbModel extends BaseObject
81
81
82
82
public $ isNotDb = false ;
83
83
84
+ /**
85
+ * @var array Automatically generated scenarios from the model 'x-scenarios'.
86
+ */
87
+ private array $ scenarios ;
88
+
84
89
public function getTableAlias ():string
85
90
{
86
91
return '{{% ' . $ this ->tableName . '}} ' ;
@@ -178,4 +183,55 @@ public function dbAttributes():array
178
183
return !$ attribute ->isVirtual ;
179
184
});
180
185
}
186
+
187
+ /**
188
+ * @return array
189
+ */
190
+ public function getScenarios (): array
191
+ {
192
+ if (isset ($ this ->scenarios )) {
193
+ return $ this ->scenarios ;
194
+ }
195
+ $ this ->scenarios = $ this ->getScenariosByOpenapiSchema ();
196
+ return $ this ->scenarios ;
197
+ }
198
+
199
+ /**
200
+ * @return array
201
+ */
202
+ private function getScenariosByOpenapiSchema (): array
203
+ {
204
+ $ x_scenarios = $ this ->openapiSchema ->{'x-scenarios ' } ?? [];
205
+ if (empty ($ x_scenarios ) || !is_array ($ x_scenarios )) {
206
+ return [];
207
+ }
208
+
209
+ $ uniqueNames = [];
210
+ $ scenarios = array_filter ($ x_scenarios , function ($ scenario ) use (&$ uniqueNames ) {
211
+ $ name = $ scenario ['name ' ] ?? '' ;
212
+
213
+ // Check if the name is empty, already used, or does not meet the criteria
214
+ if (
215
+ empty ($ name ) ||
216
+ in_array ($ name , $ uniqueNames ) ||
217
+ !preg_match ('/^[a-zA-Z_][a-zA-Z0-9_]*$/ ' , $ name )
218
+ ) {
219
+ return false ; // Exclude this item
220
+ }
221
+
222
+ // Add the name to the uniqueNames array and keep the item
223
+ $ uniqueNames [] = $ name ;
224
+ return true ;
225
+ });
226
+
227
+ foreach ($ scenarios as $ key => $ scenario ) {
228
+ $ scenarios [$ key ]['const ' ] = 'SCENARIO_ ' . strtoupper ($ scenario ['name ' ]);
229
+ if (empty ($ scenario ['description ' ])) {
230
+ $ scenarios [$ key ]['description ' ] = 'Scenario ' . $ scenario ['name ' ];
231
+ }
232
+ }
233
+
234
+ return $ scenarios ;
235
+ }
236
+
181
237
}
0 commit comments