/** * (non-PHPdoc) * @see Ding\Bean\Lifecycle.IAfterDefinitionListener::afterDefinition() */ public function afterDefinition(BeanDefinition $bean) { $properties = $bean->getProperties(); $class = $bean->getClass(); $rClass = $this->reflectionFactory->getClass($class); foreach ($rClass->getProperties() as $rProperty) { $propertyName = $rProperty->getName(); $annotations = $this->reflectionFactory->getPropertyAnnotations($class, $propertyName); if ($annotations->contains('value')) { $annotation = $annotations->getSingleAnnotation('value'); if ($annotation->hasOption('value')) { $value = $annotation->getOptionSingleValue('value'); $properties[$propertyName] = new BeanPropertyDefinition($propertyName, BeanPropertyDefinition::PROPERTY_SIMPLE, $value); } } } $bean->setProperties($properties); if ($bean->isCreatedWithFactoryBean()) { $factoryMethod = $bean->getFactoryMethod(); $factoryBean = $bean->getFactoryBean(); $def = $this->_container->getBeanDefinition($factoryBean); $annotations = $this->reflectionFactory->getMethodAnnotations($def->getClass(), $factoryMethod); $this->_applyToConstructor($annotations, $bean); } else { if ($bean->isCreatedByConstructor()) { $class = $bean->getClass(); $rClass = $this->reflectionFactory->getClass($bean->getClass()); $rMethod = $rClass->getConstructor(); if ($rMethod) { $annotations = $this->reflectionFactory->getMethodAnnotations($class, $rMethod->getName()); $this->_applyToConstructor($annotations, $bean); } } } return $bean; }
/** * (non-PHPdoc) * @see Ding\Bean\Lifecycle.IAfterDefinitionListener::afterDefinition() */ public function afterDefinition(BeanDefinition $bean) { $class = $bean->getClass(); $rClass = $this->reflectionFactory->getClass($class); $properties = $bean->getProperties(); foreach ($rClass->getMethods() as $method) { $methodName = $method->getName(); if (strpos($methodName, 'set') !== 0) { continue; } $annotations = $this->reflectionFactory->getMethodAnnotations($class, $methodName); if (!$annotations->contains('resource')) { continue; } $propName = lcfirst(substr($methodName, 3)); $name = $propName; $annotation = $annotations->getSingleAnnotation('resource'); if ($annotation->hasOption('name')) { $name = $annotation->getOptionSingleValue('name'); } $properties[$propName] = new BeanPropertyDefinition($propName, BeanPropertyDefinition::PROPERTY_BEAN, $name); } foreach ($rClass->getProperties() as $property) { $propertyName = $property->getName(); $annotations = $this->reflectionFactory->getPropertyAnnotations($class, $propertyName); if (!$annotations->contains('resource')) { continue; } $annotation = $annotations->getSingleAnnotation('resource'); $name = $propertyName; if ($annotation->hasOption('name')) { $name = $annotation->getOptionSingleValue('name'); } $properties[$propertyName] = new BeanPropertyDefinition($propertyName, BeanPropertyDefinition::PROPERTY_BEAN, $name); } $bean->setProperties($properties); return $bean; }
private function _injectMethods(BeanDefinition $bean) { $class = $bean->getClass(); $rClass = $this->_reflectionFactory->getClass($class); $properties = $bean->getProperties(); foreach ($rClass->getMethods() as $method) { $methodName = $method->getName(); $annotations = $this->_reflectionFactory->getMethodAnnotations($class, $methodName); if (!$annotations->contains('inject') || $annotations->contains('bean') || $method->isConstructor()) { continue; } $annotation = $annotations->getSingleAnnotation('inject'); $namedAnnotation = null; if ($annotations->contains('named')) { $namedAnnotation = $annotations->getSingleAnnotation('named'); } // Just 1 arg now. Multiple arguments need support in the container side. $parameters = $method->getParameters(); if (empty($parameters)) { throw new InjectByTypeException($methodName, $methodName, 'Nothing to inject (no arguments in method)'); } if (count($parameters) > 1) { throw new InjectByTypeException($methodName, $methodName, 'Multiple arguments are not yet supported'); } $type = array_shift($parameters); $type = $type->getClass(); if ($type !== null) { $type = $type->getName(); } $newProperties = $this->_arrayToBeanProperties($methodName, $this->_inject($methodName, $annotation, $type, $namedAnnotation)); $properties = array_merge($properties, $newProperties); } $bean->setProperties($properties); }
/** * (non-PHPdoc) * @see Ding\Bean.IBeanDefinitionProvider::get() */ public function getBeanDefinition($name) { $bean = null; switch ($name) { case 'dingAnnotationParser': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Annotation\\Parser'); break; case 'dingAnnotationsCache': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Cache\\Locator\\CacheLocator'); $bean->setFactoryMethod('getAnnotationsCacheInstance'); break; case 'dingBeanCache': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Cache\\Locator\\CacheLocator'); $bean->setFactoryMethod('getBeansCacheInstance'); break; case 'dingDefinitionsCache': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Cache\\Locator\\CacheLocator'); $bean->setFactoryMethod('getDefinitionsCacheInstance'); break; case 'dingProxyCache': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Cache\\Locator\\CacheLocator'); $bean->setFactoryMethod('getProxyCacheInstance'); break; case 'dingAspectCache': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Cache\\Locator\\CacheLocator'); $bean->setFactoryMethod('getAspectCacheInstance'); break; case 'dingAspectManager': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Aspect\\AspectManager'); $bean->setProperties(array(new BeanPropertyDefinition('cache', BeanPropertyDefinition::PROPERTY_BEAN, 'dingAspectCache'))); break; case 'dingXmlBeanDefinitionProvider': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Provider\\Xml'); $bean->setArguments(array(new BeanConstructorArgumentDefinition(BeanConstructorArgumentDefinition::BEAN_CONSTRUCTOR_VALUE, $this->options['bdef']['xml']))); break; case 'dingAnnotationBeanDefinitionProvider': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Provider\\Annotation'); $bean->setArguments(array(new BeanConstructorArgumentDefinition(BeanConstructorArgumentDefinition::BEAN_CONSTRUCTOR_VALUE, $this->options['bdef']['annotation']))); $bean->setInitMethod('init'); $bean->setProperties(array(new BeanPropertyDefinition('cache', BeanPropertyDefinition::PROPERTY_BEAN, 'dingAnnotationsCache'))); break; case 'dingYamlBeanDefinitionProvider': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Provider\\Yaml'); $bean->setArguments(array(new BeanConstructorArgumentDefinition(BeanConstructorArgumentDefinition::BEAN_CONSTRUCTOR_VALUE, $this->options['bdef']['yaml']))); break; case 'dingAspectCallDispatcher': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Aspect\\Interceptor\\DispatcherImpl'); break; case 'dingAnnotationInitDestroyMethodDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\AnnotationInitDestroyMethodDriver'); break; case 'dingAnnotationValueDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\AnnotationValueDriver'); break; case 'dingMvcAnnotationDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\MvcAnnotationDriver'); break; case 'dingAnnotationRequiredDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\AnnotationRequiredDriver'); break; case 'dingAnnotationDiscovererDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\AnnotationDiscovererDriver'); $bean->setProperties(array(new BeanPropertyDefinition('cache', BeanPropertyDefinition::PROPERTY_BEAN, 'dingAnnotationsCache'))); $bean->setInitMethod('parse'); $bean->setArguments(array(new BeanConstructorArgumentDefinition(BeanConstructorArgumentDefinition::BEAN_CONSTRUCTOR_VALUE, $this->options['bdef']['annotation']['scanDir']))); break; case 'dingAnnotationResourceDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\AnnotationResourceDriver'); break; case 'dingAnnotationInjectDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\AnnotationInjectDriver'); break; case 'dingPropertiesDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\PropertiesDriver'); break; case 'dingLifecycleManager': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Lifecycle\\BeanLifecycleManager'); break; case 'dingMethodInjectionDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\MethodInjectionDriver'); break; case 'dingMessageSourceDriver': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Bean\\Factory\\Driver\\MessageSourceDriver'); break; case 'dingReflectionFactory': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Reflection\\ReflectionFactory'); $bean->setArguments(array(new BeanConstructorArgumentDefinition(BeanConstructorArgumentDefinition::BEAN_CONSTRUCTOR_VALUE, isset($this->options['bdef']['annotation'])))); $bean->setProperties(array(new BeanPropertyDefinition('cache', BeanPropertyDefinition::PROPERTY_BEAN, 'dingAnnotationsCache'), new BeanPropertyDefinition('annotationParser', BeanPropertyDefinition::PROPERTY_BEAN, 'dingAnnotationParser'))); break; case 'dingProxyFactory': $bean = new BeanDefinition($name); $bean->setClass('\\Ding\\Aspect\\Proxy'); $bean->setProperties(array(new BeanPropertyDefinition('cache', BeanPropertyDefinition::PROPERTY_BEAN, 'dingProxyCache'))); break; default: break; } return $bean; }
public function beforeCreate(BeanDefinition $beanDefinition) { $props = $beanDefinition->getProperties(); $props[] = new BeanPropertyDefinition('bc', BeanPropertyDefinition::PROPERTY_SIMPLE, 'yeah'); $beanDefinition->setProperties($props); return $beanDefinition; }
/** * (non-PHPdoc) * @see Ding\Bean\Lifecycle.IAfterDefinitionListener::afterDefinition() */ public function afterDefinition(BeanDefinition $bean) { foreach ($bean->getMethodInjections() as $method) { $aspectBeanName = BeanDefinition::generateName('MethodInjectionAspect'); $aspectBean = new BeanDefinition($aspectBeanName); $aspectBean->setClass('\\Ding\\Bean\\Factory\\Driver\\MethodInjectionAspect'); $aspectBean->setProperties(array(new BeanPropertyDefinition('beanName', BeanPropertyDefinition::PROPERTY_SIMPLE, $method[1]))); $this->_beans[$aspectBeanName] = $aspectBean; $aspectName = BeanDefinition::generateName('MethodInjectionAspect'); $pointcutName = BeanDefinition::generateName('MethodInjectionPointcut'); $pointcut = new PointcutDefinition($pointcutName, $method[0], 'invoke'); $this->_aspectManager->setPointcut($pointcut); $aspect = new AspectDefinition($aspectName, array($pointcutName), AspectDefinition::ASPECT_METHOD, $aspectBeanName, ''); $aspects = $bean->getAspects(); $aspects[] = $aspect; $bean->setAspects($aspects); } return $bean; }