phprs\util\IoCFactory::injectDependent PHP 메소드

injectDependent() 공개 메소드

注入依赖
public injectDependent ( $refl, unknown $ins, unknown $meta, unknown $properties, $injector = null ) : void
$ins unknown
$meta unknown
$properties unknown
리턴 void
    public function injectDependent($refl, $ins, $meta, $properties, $injector = null)
    {
        $defaults = array();
        $class_name = $refl->getName();
        $class_defaults = $refl->getDefaultProperties();
        if (isset($meta['property'])) {
            foreach ($meta['property'] as $property => $value) {
                //参数是否可选
                if (isset($value['value']) && isset($value['value']['optional']) && $value['value']['optional']) {
                    continue;
                }
                //设置了默认值
                if (isset($value['value']) && isset($value['value']['default'])) {
                    $defaults[$property] = $value['value']['default'];
                    continue;
                }
                // 是否设置了默认值
                if (array_key_exists($property, $class_defaults)) {
                    continue;
                }
                Verify::isTrue(array_key_exists($property, $properties), "{$class_name}::{$property} is required");
            }
        }
        // 设置属性
        if ($properties !== null) {
            foreach ($properties as $name => $value) {
                unset($defaults[$name]);
                $v = $this->getProperty($value);
                self::setPropertyValue($refl, $ins, $name, $v);
            }
        }
        // 注入依赖
        if (isset($meta['inject'])) {
            foreach ($meta['inject'] as $property => $value) {
                //先设置必须的属性
                if (is_array($value['value'])) {
                    $src = $value['value']['src'];
                    //参数是否可选
                    if (isset($value['value']) && isset($value['value']['optional']) && $value['value']['optional']) {
                        continue;
                    }
                    //设置了默认值
                    if (isset($value['value']) && isset($value['value']['default'])) {
                        $defaults[$property] = $value['value']['default'];
                        continue;
                    }
                } else {
                    $src = $value['value'];
                }
                //是否设置了默认值
                if (array_key_exists($property, $class_defaults)) {
                    continue;
                }
                if ($src === "ioc_factory" || $src == "factory") {
                    continue;
                } else {
                    $got = false;
                    Verify::isTrue($injector !== null, "{$class_name}::{$property} is required");
                    $val = $injector($src, $got);
                    Verify::isTrue($got, "{$class_name}::{$property} is required");
                    self::setPropertyValue($refl, $ins, $property, $val);
                    unset($meta['inject'][$property]);
                }
            }
            //在设置可选的
            foreach ($meta['inject'] as $property => $value) {
                if (is_array($value['value'])) {
                    $src = $value['value']['src'];
                } else {
                    $src = $value['value'];
                }
                if ($src == "ioc_factory" || $src == "factory") {
                    self::setPropertyValue($refl, $ins, $property, $this);
                    unset($defaults[$property]);
                } else {
                    if ($injector) {
                        $val = $injector($src, $got);
                        if ($got) {
                            self::setPropertyValue($refl, $ins, $property, $val);
                            unset($defaults[$property]);
                        }
                    }
                }
            }
        }
        // 设置默认属性
        foreach ($defaults as $name => $value) {
            unset($defaults[$name]);
            $v = $this->getProperty($value);
            self::setPropertyValue($refl, $ins, $name, $v);
        }
    }