コード例 #1
0
 /**
  * (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;
 }
コード例 #2
0
 /**
  * (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;
 }
コード例 #3
0
 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);
 }
コード例 #4
0
ファイル: Core.php プロジェクト: im286er/Ding
 /**
  * (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;
 }
コード例 #5
0
ファイル: Test_Lifecycle_Aware.php プロジェクト: im286er/Ding
 public function beforeCreate(BeanDefinition $beanDefinition)
 {
     $props = $beanDefinition->getProperties();
     $props[] = new BeanPropertyDefinition('bc', BeanPropertyDefinition::PROPERTY_SIMPLE, 'yeah');
     $beanDefinition->setProperties($props);
     return $beanDefinition;
 }
コード例 #6
0
 /**
  * (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;
 }