Nette\DI\Helpers::autowireArguments PHP Метод

autowireArguments() публичный статический Метод

Generates list of arguments using autowiring.
public static autowireArguments ( ReflectionFunctionAbstract $method, array $arguments, $container ) : array
$method ReflectionFunctionAbstract
$arguments array
Результат array
    public static function autowireArguments(\ReflectionFunctionAbstract $method, array $arguments, $container)
    {
        $optCount = 0;
        $num = -1;
        $res = [];
        $methodName = ($method instanceof \ReflectionMethod ? $method->getDeclaringClass()->getName() . '::' : '') . $method->getName() . '()';
        foreach ($method->getParameters() as $num => $parameter) {
            if (!$parameter->isVariadic() && array_key_exists($parameter->getName(), $arguments)) {
                $res[$num] = $arguments[$parameter->getName()];
                unset($arguments[$parameter->getName()], $arguments[$num]);
                $optCount = 0;
            } elseif (array_key_exists($num, $arguments)) {
                $res[$num] = $arguments[$num];
                unset($arguments[$num]);
                $optCount = 0;
            } elseif (($class = PhpReflection::getParameterType($parameter)) && !PhpReflection::isBuiltinType($class)) {
                $res[$num] = $container->getByType($class, FALSE);
                if ($res[$num] === NULL) {
                    if ($parameter->allowsNull()) {
                        $optCount++;
                    } elseif (class_exists($class) || interface_exists($class)) {
                        if ($class !== ($hint = (new \ReflectionClass($class))->getName())) {
                            throw new ServiceCreationException("Service of type {$class} needed by {$methodName} not found, did you mean {$hint}?");
                        }
                        throw new ServiceCreationException("Service of type {$class} needed by {$methodName} not found. Did you register it in configuration file?");
                    } else {
                        throw new ServiceCreationException("Class {$class} needed by {$methodName} not found. Check type hint and 'use' statements.");
                    }
                } else {
                    if ($container instanceof ContainerBuilder) {
                        $res[$num] = '@' . $res[$num];
                    }
                    $optCount = 0;
                }
            } elseif ($class && $parameter->allowsNull() || $parameter->isOptional() || $parameter->isDefaultValueAvailable()) {
                // !optional + defaultAvailable = func($a = NULL, $b) since 5.4.7
                // optional + !defaultAvailable = i.e. Exception::__construct, mysqli::mysqli, ...
                $res[$num] = $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : NULL;
                $optCount++;
            } else {
                throw new ServiceCreationException("Parameter \${$parameter->getName()} in {$methodName} has no class type hint or default value, so its value must be specified.");
            }
        }
        // extra parameters
        while (array_key_exists(++$num, $arguments)) {
            $res[$num] = $arguments[$num];
            unset($arguments[$num]);
            $optCount = 0;
        }
        if ($arguments) {
            throw new ServiceCreationException("Unable to pass specified arguments to {$methodName}.");
        }
        return $optCount ? array_slice($res, 0, -$optCount) : $res;
    }

Usage Example

Пример #1
0
	/**
	 * @return Nette\Application\IResponse
	 */
	public function run(Application\Request $request)
	{
		$this->request = $request;

		if ($this->httpRequest && $this->router && !$this->httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
			$refUrl = clone $this->httpRequest->getUrl();
			$url = $this->router->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
			if ($url !== NULL && !$this->httpRequest->getUrl()->isEqual($url)) {
				return new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY);
			}
		}

		$params = $request->getParameters();
		if (!isset($params['callback'])) {
			throw new Application\BadRequestException('Parameter callback is missing.');
		}
		$params['presenter'] = $this;
		$callback = $params['callback'];
		$reflection = Nette\Utils\Callback::toReflection(Nette\Utils\Callback::check($callback));
		$params = Application\UI\PresenterComponentReflection::combineArgs($reflection, $params);

		if ($this->context) {
			foreach ($reflection->getParameters() as $param) {
				if ($param->getClassName()) {
					unset($params[$param->getPosition()]);
				}
			}

			$params = Nette\DI\Helpers::autowireArguments($reflection, $params, $this->context);
			$params['presenter'] = $this;
		}

		$response = call_user_func_array($callback, $params);

		if (is_string($response)) {
			$response = array($response, array());
		}
		if (is_array($response)) {
			list($templateSource, $templateParams) = $response;
			$response = $this->createTemplate()->setParameters($templateParams);
			if (!$templateSource instanceof \SplFileInfo) {
				$response->getLatte()->setLoader(new Latte\Loaders\StringLoader);
			}
			$response->setFile($templateSource);
		}
		if ($response instanceof Application\UI\ITemplate) {
			return new Responses\TextResponse($response);
		} else {
			return $response;
		}
	}
All Usage Examples Of Nette\DI\Helpers::autowireArguments