mougrim/yii2-container-configurator

该软件包已被废弃,不再维护。未建议替代软件包。

Yii2 容器配置器

v0.0.1 2015-07-17 06:54 UTC

This package is auto-updated.

Last update: 2024-08-29 17:15:56 UTC


README

如果您想维护它,您可以创建一个分支。

Yii 2 容器配置器扩展

此扩展可以使用简单的PHP数组配置yii2的容器,并使用延迟加载。

有关许可证信息,请参阅LICENSE文件。

安装

安装此扩展的首选方式是通过composer

运行以下命令:

php composer.phar require --prefer-dist mougrim/yii2-container-configurator

或者

"mougrim/yii2-container-configurator": "*"

将以下内容添加到您的composer.json文件的require部分:

编辑文件config/main.php

<?php
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;
use yii\di\Container;
...

Yii::$container->set(
    'containerConfigurator',
    function (Container $container) {
        $containerConfigurator = new ContainerConfigurator($container);
        $containerConfigurator->configure(require __DIR__ . '/container.php'); // di container config path
        return $containerConfigurator;
    }
);

...

return [
    ...
    'bootstrap'  => [
        ...
        'containerConfigurator'
    ],
    'components' => [
        'containerConfigurator' => 'containerConfigurator',
        ...
    ],
];

并创建config/container.php

<?php
return [
    // your di container config
]

使用方法

回调

您可以在容器配置中使用回调

<?php
return [
    'app' => function () {
        return Yii::$app;
    },
]; 

此回调将在所有get调用中调用

Yii::$container->get('app');

服务

默认情况下,组件作为服务创建,即在第一次get时创建一次

<?php
use yii\web\Response;

return [
    'front.response' => [
        'class' => Response::class, // class name
    ],
];

原型

如果您希望每次get都创建新实例,可以使用原型

<?php
use yii\web\Response;
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;

return [
    'front.response' => [
        'class' => Response::class, // class name
        'type' => ContainerConfigurator::COMPONENT_TYPE_PROTOTYPE,
    ],
];

别名

如果您想添加服务或原型的别名

<?php
use yii\web\Response;
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;

return [
    'front.response' => [
        'class' => Response::class, // class name
    ],
    'front.response-alias' => 'front.response',
];

现在这是

<?php
Yii::$container->get('front.response-alias');

相当于这是

<?php
Yii::$container->get('front.response');

参数格式

参数类型参考

如果您想从di注入,可以使用参数类型参考

[
    'id' => 'front.request',
    'type' => ContainerConfigurator::ARGUMENT_TYPE_REFERENCE,
]

参数类型值

如果您想注入一些值,可以使用参数类型值

[
    'type' => ContainerConfigurator::ARGUMENT_TYPE_VALUE,
    'value' => 'some value',
],

传递参数到构造函数

如果您想将参数传递到构造函数,可以使用'arguments'

<?php
use frontend\controllers\SiteController;
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;

return [
    'controllers.site' => [
        'class' => SiteController::class,
        'arguments' => [
            2 => [ // argument number
                'id' => 'front.request',
                'type' => ContainerConfigurator::ARGUMENT_TYPE_REFERENCE,
            ],
        ],
    ],
];

SiteController

<?php
namespace frontend\controllers;

use yii\base\Module;
use yii\web\Controller
use yii\web\Request;

class SiteController extends Controller
{
    private $request;

    public function __construct(
        $id,
        Module $module,
        Request $request,
        array $config = []
    )
    {
        parent::__construct($id, $module, $config);
        $this->request = $request;
    }
}

并在config/main.php中的控制器映射中添加

    ...
    'controllerMap' => [
        ...
        'site' => 'controllers.site',
    ],
    ...

设置属性

如果您想设置属性,可以使用'properties'

<?php
use frontend\controllers\SiteController;
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;

return [
    'controllers.site' => [
        'class' => SiteController::class,
        'properties' => [
            'request' => [
                'id' => 'front.request',
                'type' => ContainerConfigurator::ARGUMENT_TYPE_REFERENCE,
            ],
        ],
    ],
];

调用回调

如果您想调用回调,可以使用'call',但在yii对象(从\yii\base\Object扩展)中,回调将在方法init之后调用

<?php
use frontend\controllers\SiteController;
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;

return [
    'controllers.site' => [
        'class' => SiteController::class,
        'call' => [
            'setRequest' => [ 
                [
                    'id' => 'front.request',
                    'type' => ContainerConfigurator::ARGUMENT_TYPE_REFERENCE,
                ],
            ],
        ],
    ],
];

扩展

如果您想扩展配置,可以使用'extends'

<?php
use frontend\controllers\SiteController;
use mougrim\yii2ContainerConfigurator\ContainerConfigurator;

return [
    'components.controller' => [
        'type' => ContainerConfigurator::COMPONENT_TYPE_PROTOTYPE,
        'properties' => [
            'app' => [
                'id' => 'app',
                'type' => ContainerConfigurator::ARGUMENT_TYPE_REFERENCE,
            ],
        ],
    ],
    'controllers.site' => [
        'class' => SiteController::class,
        'extends' => 'components.controller',
        'arguments' => [
            2 => [
                'id' => 'front.request',
                'type' => ContainerConfigurator::ARGUMENT_TYPE_REFERENCE,
            ],
        ],
    ],
];