Fix #20332: Added support for the '__class' key in \yii\di\Instance:eunsure(['__class' => ...])

This commit is contained in:
Alex
2025-02-27 17:32:44 +03:00
committed by GitHub
parent 53ce35423e
commit dbb82a25a2
3 changed files with 11 additions and 2 deletions

View File

@ -34,6 +34,7 @@ Yii Framework 2 Change Log
- Chg #20276: Removed autogenerated migration phpdoc (userator) - Chg #20276: Removed autogenerated migration phpdoc (userator)
- New #20185: Add `BackedEnum` support to `AttributeTypecastBehavior` (briedis) - New #20185: Add `BackedEnum` support to `AttributeTypecastBehavior` (briedis)
- New #20279: Add to the `\yii\web\Request` CSRF validation by custom HTTP header (olegbaturin) - New #20279: Add to the `\yii\web\Request` CSRF validation by custom HTTP header (olegbaturin)
- New #20332: Added support for the '__class' key in `\yii\di\Instance:eunsure(['__class' => ...])` (LAV45)
2.0.51 July 18, 2024 2.0.51 July 18, 2024

View File

@ -118,11 +118,18 @@ class Instance
public static function ensure($reference, $type = null, $container = null) public static function ensure($reference, $type = null, $container = null)
{ {
if (is_array($reference)) { if (is_array($reference)) {
$class = isset($reference['class']) ? $reference['class'] : $type;
if (!$container instanceof Container) { if (!$container instanceof Container) {
$container = Yii::$container; $container = Yii::$container;
} }
if (isset($reference['__class'])) {
$class = $reference['__class'];
unset($reference['__class'], $type['class']);
} elseif (isset($reference['class'])) {
$class = $reference['class'];
unset($reference['class']); unset($reference['class']);
} else {
$class = $type;
}
$component = $container->get($class, [], $reference); $component = $container->get($class, [], $reference);
if ($type === null || $component instanceof $type) { if ($type === null || $component instanceof $type) {
return $component; return $component;

View File

@ -97,6 +97,7 @@ class InstanceTest extends TestCase
$this->assertInstanceOf(Connection::className(), Instance::ensure('db')); $this->assertInstanceOf(Connection::className(), Instance::ensure('db'));
$this->assertInstanceOf(Connection::className(), Instance::ensure(new Connection())); $this->assertInstanceOf(Connection::className(), Instance::ensure(new Connection()));
$this->assertInstanceOf(Connection::className(), Instance::ensure(['class' => 'yii\db\Connection', 'dsn' => 'test'])); $this->assertInstanceOf(Connection::className(), Instance::ensure(['class' => 'yii\db\Connection', 'dsn' => 'test']));
$this->assertInstanceOf(Connection::className(), Instance::ensure(['__class' => 'yii\db\Connection', 'dsn' => 'test']));
Yii::$container = new Container(); Yii::$container = new Container();
} }