Skip to content

Commit 55b11c6

Browse files
committed
x-scenarios: name, description.
1 parent d593a63 commit 55b11c6

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

src/generator/default/dbmodel.php

+10
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,16 @@
4545
*/
4646
abstract class <?= $model->getClassName() ?> extends \yii\db\ActiveRecord
4747
{
48+
<?php if($scenarios = $model->getScenarios()):
49+
foreach($scenarios as $scenario): ?>
50+
/**
51+
* <?=$scenario['description']?>
52+
53+
*/
54+
public const <?= $scenario['const'] ?> = '<?= $scenario['name'] ?>';
55+
56+
<?php endforeach; ?>
57+
<?php endif ?>
4858
<?php if (count($model->virtualAttributes())):?>
4959
protected $virtualAttributes = ['<?=implode("', '", array_map(function ($attr) {
5060
return $attr->columnName;

src/lib/items/DbModel.php

+56
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ class DbModel extends BaseObject
8181

8282
public $isNotDb = false;
8383

84+
/**
85+
* @var array Automatically generated scenarios from the model 'x-scenarios'.
86+
*/
87+
private array $scenarios;
88+
8489
public function getTableAlias():string
8590
{
8691
return '{{%' . $this->tableName . '}}';
@@ -178,4 +183,55 @@ public function dbAttributes():array
178183
return !$attribute->isVirtual;
179184
});
180185
}
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+
181237
}

0 commit comments

Comments
 (0)