src/ReflectionResolver.php
protected function getParameters(ReflectionFunctionAbstract $reflection, array $arguments = []): array
    {
        // TODO : améliorer ce bout de code ******************
        $parametersToReturn = static::getSeqArray($arguments); // utiliser plutot ce bout de code pour éviter d'initialiser un tableau lorsque les clés sont numeriques => https://github.com/illuminate/container/blob/master/BoundMethod.php#L119

        $reflectionParameters = array_slice($reflection->getParameters(), count($parametersToReturn));

        if (! count($reflectionParameters)) {
            return $parametersToReturn;
        }
        // TODO END ******************************************

        /* @var \ReflectionParameter $param */
        foreach ($reflectionParameters as $param) {
            /*
             * #1. search in arguments by parameter name
             * #1.1. search in arguments by class name
             * #2. if parameter has type hint
             * #2.1. search in container by class name
             * #3. if has default value, insert default value.
             * #4. exception
             */
            $paramName = $param->getName();

            try {
                if (array_key_exists($paramName, $arguments)) { // #1.
                    $parametersToReturn[] = $arguments[$paramName];

                    continue;
                }

                $paramClass = $param->getClass();

                if ($paramClass) { // #2.
                    $paramClassName = $paramClass->getName();

                    if (array_key_exists($paramClassName, $arguments)) {
                        $parametersToReturn[] = $arguments[$paramClassName];

                        continue;
                    } else { // #2.1.
                        try {
                            // TODO : on devrait pas créer une méthode make() qui soit un alias de get ? => https://github.com/illuminate/container/blob/master/Container.php#L616
                            // TODO : https://github.com/illuminate/container/blob/master/Container.php#L925
                            // TODO : ajouter des tests dans le cas ou la classe passée en parameter est optionnelle (cad avec une valeur par défaut), il faudrait aussi faire un test avec "?ClassObject" voir si on passe null par défaut ou si on léve une exception car la classe n'existe pas !!!! => https://github.com/illuminate/container/blob/master/Container.php#L935
                            $parametersToReturn[] = $this->container->get($paramClassName);

                            continue;
                        } catch (EntityNotFoundException $e) {
                        }
                    }
                }
                if ($param->isDefaultValueAvailable()) { // #3.
                    $parametersToReturn[] = $param->getDefaultValue();

                    continue;
                }

                throw new ContainerException("Parameter '{$paramName}' cannot be resolved"); // #4.
            } catch (ReflectionException $e) {
                // ReflectionException is thrown when the class doesn't exist.
                throw new ContainerException("Parameter '{$paramName}' cannot be resolved");
            }
        }

        return $parametersToReturn;
    }
protected function getParameters(ReflectionFunctionAbstract $reflection, array $arguments = []): array
    {
        // TODO : améliorer ce bout de code ******************
        $parametersToReturn = static::getSeqArray($arguments); // utiliser plutot ce bout de code pour éviter d'initialiser un tableau lorsque les clés sont numeriques => https://github.com/illuminate/container/blob/master/BoundMethod.php#L119

        $reflectionParameters = array_slice($reflection->getParameters(), count($parametersToReturn));

        if (! count($reflectionParameters)) {
            return $parametersToReturn;
        }
        // TODO END ******************************************

        /* @var \ReflectionParameter $param */
        foreach ($reflectionParameters as $param) {
            /*
             * #1. search in arguments by parameter name
             * #1.1. search in arguments by class name
             * #2. if parameter has type hint
             * #2.1. search in container by class name
             * #3. if has default value, insert default value.
             * #4. exception
             */
            $paramName = $param->getName();

            try {
                if (array_key_exists($paramName, $arguments)) { // #1.
                    $parametersToReturn[] = $arguments[$paramName];

                    continue;
                }

                $paramClass = $param->getClass();

                if ($paramClass) { // #2.
                    $paramClassName = $paramClass->getName();

                    if (array_key_exists($paramClassName, $arguments)) {
                        $parametersToReturn[] = $arguments[$paramClassName];

                        continue;
                    } else { // #2.1.
                        try {
                            // TODO : on devrait pas créer une méthode make() qui soit un alias de get ? => https://github.com/illuminate/container/blob/master/Container.php#L616
                            // TODO : https://github.com/illuminate/container/blob/master/Container.php#L925
                            // TODO : ajouter des tests dans le cas ou la classe passée en parameter est optionnelle (cad avec une valeur par défaut), il faudrait aussi faire un test avec "?ClassObject" voir si on passe null par défaut ou si on léve une exception car la classe n'existe pas !!!! => https://github.com/illuminate/container/blob/master/Container.php#L935
                            $parametersToReturn[] = $this->container->get($paramClassName);

                            continue;
                        } catch (EntityNotFoundException $e) {
                        }
                    }
                }
                if ($param->isDefaultValueAvailable()) { // #3.
                    $parametersToReturn[] = $param->getDefaultValue();

                    continue;
                }

                throw new ContainerException("Parameter '{$paramName}' cannot be resolved"); // #4.
            } catch (ReflectionException $e) {
                // ReflectionException is thrown when the class doesn't exist.
                throw new ContainerException("Parameter '{$paramName}' cannot be resolved");
            }
        }

        return $parametersToReturn;
    }
protected function getParameters ( ReflectionFunctionAbstract $ reflection , array $ arguments = [ ] ) : array { // TODO : améliorer ce bout de code ****************** $ parametersToReturn = static :: getSeqArray ( $ arguments ) ; // utiliser plutot ce bout de code pour éviter d'initialiser un tableau lorsque les clés sont numeriques => https://github.com/illuminate/container/blob/master/BoundMethod.php#L119 $ reflectionParameters = array_slice ( $ reflection -> getParameters ( ) , count ( $ parametersToReturn ) ) ; if ( ! count ( $ reflectionParameters ) ) { return $ parametersToReturn ; } // TODO END ****************************************** /* @var \ReflectionParameter $param */ foreach ( $ reflectionParameters as $ param ) { /*
             * #1. search in arguments by parameter name
             * #1.1. search in arguments by class name
             * #2. if parameter has type hint
             * #2.1. search in container by class name
             * #3. if has default value, insert default value.
             * #4. exception
             */ $ paramName = $ param -> getName ( ) ; try { if ( array_key_exists ( $ paramName , $ arguments ) ) { // #1. $ parametersToReturn [ ] = $ arguments [ $ paramName ] ; continue ; } $ paramClass = $ param -> getClass ( ) ; if ( $ paramClass ) { // #2. $ paramClassName = $ paramClass -> getName ( ) ; if ( array_key_exists ( $ paramClassName , $ arguments ) ) { $ parametersToReturn [ ] = $ arguments [ $ paramClassName ] ; continue ; } else { // #2.1. try { // TODO : on devrait pas créer une méthode make() qui soit un alias de get ? => https://github.com/illuminate/container/blob/master/Container.php#L616 // TODO : https://github.com/illuminate/container/blob/master/Container.php#L925 // TODO : ajouter des tests dans le cas ou la classe passée en parameter est optionnelle (cad avec une valeur par défaut), il faudrait aussi faire un test avec "?ClassObject" voir si on passe null par défaut ou si on léve une exception car la classe n'existe pas !!!! => https://github.com/illuminate/container/blob/master/Container.php#L935 $ parametersToReturn [ ] = $ this -> container -> get ( $ paramClassName ) ; continue ; } catch ( EntityNotFoundException $ e ) { } } } if ( $ param -> isDefaultValueAvailable ( ) ) { // #3. $ parametersToReturn [ ] = $ param -> getDefaultValue ( ) ; continue ; } throw new ContainerException ( "Parameter '{$paramName}' cannot be resolved" ) ; // #4. } catch ( ReflectionException $ e ) { // ReflectionException is thrown when the class doesn't exist. throw new ContainerException ( "Parameter '{$paramName}' cannot be resolved" ) ; } } return $ parametersToReturn ; }
TODO : renommer en getMethodDependencies() ou plutot en reflectArguments(ReflectionFunctionAbstract $method, array $args = []) : array ou alors en resolveFunctionArguments()
TODO : renommer en getMethodDependencies () ou plutot en reflectArguments ( ReflectionFunctionAbstract $method array $args = [] ) : array ou alors en resolveFunctionArguments ()