예제 #1
0
    protected function processParams(&$def, DerivedClassScanner $sClass, MethodScanner $sMethod)
    {
        if (count($sMethod->getParameters()) === 0) {
            return;
        }

        $methodName = $sMethod->getName();

        $def['parameters'][$methodName] = array();

        foreach ($sMethod->getParameters(true) as $position => $p) {

            /** @var $p \Zend\Code\Scanner\ParameterScanner  */
            $actualParamName = $p->getName();

            $paramName = $this->createDistinctParameterName($actualParamName, $sClass->getName());

            $fqName = $sClass->getName() . '::' . $sMethod->getName() . ':' . $position;

            $def['parameters'][$methodName][$fqName] = array();

            // set the class name, if it exists
            $def['parameters'][$methodName][$fqName][] = $actualParamName;
            $def['parameters'][$methodName][$fqName][] = ($p->getClass() !== null) ? $p->getClass() : null;
            $def['parameters'][$methodName][$fqName][] = !$p->isOptional();
        }
    }
예제 #2
0
파일: Compiler.php 프로젝트: ruflin/zf2
    public function compileScannerInjectionMethods(DerivedClassScanner $c)
    {
        // return value
        $methods = array();

        // name of top level class (only, not derived)
        $className = $c->getName();
        
        // constructor injection      
        $cRules = $this->getIntrospectionRuleset()->getConstructorRules();
        
        if ($cRules['enabled']) {
            if ($c->hasMethod('__construct')) {
                $constructScanner = $c->getMethod('__construct');
                if ($constructScanner->isPublic() && $constructScanner->getNumberOfParameters() > 0) {
                    do {
                        // explicity in included classes
                        if ($cRules['includedClasses'] && !in_array($className, $cRules['includedClasses'])) {
                            break;
                        }
                        // explicity NOT in excluded classes
                        if ($cRules['excludedClasses'] && in_array($className, $cRules['excludedClasses'])) {
                            break;
                        }
                        gettype($constructScanner);
                        $methods['__construct'] = $this->compileScannerInjectionMethodParmeters(
                            $constructScanner,
                            IntrospectionRuleset::TYPE_CONSTRUCTOR
                        );
                    } while (false);
                }
            }
        }
        
            // setter injection
        $sRules = $this->getIntrospectionRuleset()->getSetterRules();
        
        if ($sRules['enabled']) {
            /* @var $m ReflectionMethod */
            foreach ($c->getMethods(true) as $m) {
                //$declaringClassName = $m->getDeclaringClass()->getName();
                
                if (!$m->isPublic() || $m->getNumberOfParameters() == 0) {
                    continue;
                }
                
                // explicitly in the include classes
                if ($sRules['includedClasses'] && !in_array($className, $sRules['includedClasses'])) {
                    continue;
                }

                // explicity NOT in excluded classes
                if ($sRules['excludedClasses']
                    && (in_array($className, $sRules['excludedClasses'])
                        //|| in_array($declaringClassName, $sRules['excludedClasses'])) 
                    )) {
                    continue;
                }
                
                // declaring class 
                
                // if there is a pattern & it does not match
                if ($sRules['pattern'] && !preg_match('/' . $sRules['pattern'] . '/', $m->getName())) {
                    continue;
                }
                // if there are more than methodsMaxParameters, continue
                if ($sRules['methodMaximumParams'] && ($m->getNumberOfParameters() > $sRules['methodMaximumParams'])) {
                    continue;
                }
                $methods[$m->getName()] = $this->compileScannerInjectionMethodParmeters(
                    $m,
                    IntrospectionRuleset::TYPE_SETTER
                );
            }
        }

        // interface injection
        $iRules = $this->getIntrospectionRuleset()->getInterfaceRules();
        
        if ($iRules['enabled']) {
            foreach ($c->getInterfaces(true) as $i) {

                // explicitly in the include interfaces
                if ($iRules['includedInterfaces'] && !in_array($i->getName(), $iRules['includedInterfaces'])) {
                    continue;
                }
                // explicity NOT in excluded classes
                if ($iRules['excludedInterfaces'] && in_array($i->getName(), $iRules['excludedInterfaces'])) {
                    continue;
                }
                // if there is a pattern, and it does not match, continue
                if ($iRules['pattern'] && !preg_match('#' . preg_quote($iRules['pattern'], '#') . '#', $i->getName())) {
                    continue;
                }
                foreach ($i->getMethods() as $m) {
                    $methods[$m->getName()] = $this->compileScannerInjectionMethodParmeters(
                        $m,
                        IntrospectionRuleset::TYPE_INTERFACE
                    );
                }
            }
        }
        
        
        return $methods;

    }