diff --git a/.travis/run-tests.sh b/.travis/run-tests.sh deleted file mode 100755 index a84e0ba2..00000000 --- a/.travis/run-tests.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -travisdir=$(dirname "$0") -testdir="$travisdir/../tests" -testedcomponents=(`cat "$travisdir/tested-components"`) -result=0 - -for tested in "${testedcomponents[@]}" - do - echo "$tested:" - phpunit -c $testdir/phpunit.xml.dist $testdir/$tested - result=$(($result || $?)) -done - -exit $result diff --git a/.travis/skipped-components b/.travis/skipped-components deleted file mode 100644 index 171dfe9d..00000000 --- a/.travis/skipped-components +++ /dev/null @@ -1,7 +0,0 @@ -Zend/Amf -Zend/Date -Zend/Dojo -Zend/Queue -Zend/Service -Zend/Test -Zend/Wildfire diff --git a/.travis/tested-components b/.travis/tested-components deleted file mode 100644 index b0b94380..00000000 --- a/.travis/tested-components +++ /dev/null @@ -1,61 +0,0 @@ -Zend/Acl -Zend/Authentication -Zend/Barcode -Zend/Cache -Zend/Captcha -Zend/Cloud -Zend/Code -Zend/Config -Zend/Console -Zend/Crypt -Zend/Currency -Zend/Db -Zend/Di -Zend/DocBook -Zend/Dojo -Zend/Dom -Zend/EventManager -Zend/Feed -Zend/File -Zend/Filter -Zend/Form -Zend/GData -Zend/Http -Zend/InfoCard -Zend/InputFilter -Zend/Json -Zend/Ldap -Zend/Loader -Zend/Locale -Zend/Log -Zend/Mail -Zend/Markup -Zend/Math -Zend/Measure -Zend/Memory -Zend/Mime -Zend/ModuleManager -Zend/Mvc -Zend/Navigation -Zend/OAuth -Zend/OpenId -Zend/Paginator -Zend/Pdf -Zend/ProgressBar -Zend/RegistryTest.php -Zend/Rest -Zend/Search -Zend/Serializer -Zend/Server -Zend/Session -Zend/Soap -Zend/Stdlib -Zend/Tag -Zend/Text -Zend/TimeSync -Zend/Translator -Zend/Uri -Zend/Validator -Zend/VersionTest.php -Zend/View -Zend/XmlRpc diff --git a/src/Configuration.php b/src/Configuration.php index 855bec97..9662d63c 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -7,15 +7,16 @@ class Configuration { - protected $data = array(); - /** - * @var Zend\Di\DependencyInjector + * @var array */ - protected $di = null; - + protected $data = array(); + /** + * Constructor + * * @param array|Traversable $options + * @throws Exception\InvalidArgumentException */ public function __construct($options) { @@ -30,7 +31,13 @@ public function __construct($options) } $this->data = $options; } - + + /** + * Configure + * + * @param Di $di + * @return void + */ public function configure(Di $di) { if (isset($this->data['definition'])) { diff --git a/src/Definition/Builder/PhpClass.php b/src/Definition/Builder/PhpClass.php index 5939abeb..844226d1 100644 --- a/src/Definition/Builder/PhpClass.php +++ b/src/Definition/Builder/PhpClass.php @@ -9,13 +9,24 @@ class PhpClass protected $instantiator = '__construct'; protected $injectionMethods = array(); protected $superTypes = array(); - + + /** + * Set name + * + * @param string $name + * @return PhpClass + */ public function setName($name) { $this->name = $name; return $this; } - + + /** + * Get name + * + * @return string + */ public function getName() { return $this->name; @@ -31,18 +42,29 @@ public function getInstantiator() { return $this->instantiator; } - + public function addSuperType($superType) { $this->superTypes[] = $superType; return $this; } - + + /** + * Get super types + * + * @return array + */ public function getSuperTypes() { return $this->superTypes; } - + + /** + * Add injection method + * + * @param InjectionMethod $injectionMethod + * @return PhpClass + */ public function addInjectionMethod(InjectionMethod $injectionMethod) { $this->injectionMethods[] = $injectionMethod; diff --git a/src/Definition/BuilderDefinition.php b/src/Definition/BuilderDefinition.php index 734edc95..0f2b26e2 100644 --- a/src/Definition/BuilderDefinition.php +++ b/src/Definition/BuilderDefinition.php @@ -6,9 +6,22 @@ class BuilderDefinition implements DefinitionInterface { + /** + * @var string + */ protected $defaultClassBuilder = 'Zend\Di\Definition\Builder\PhpClass'; + + /** + * @var array + */ protected $classes = array(); + /** + * Create classes from array + * + * @param array $builderData + * @return void + */ public function createClassesFromArray(array $builderData) { foreach ($builderData as $className => $classInfo) { @@ -42,7 +55,13 @@ public function createClassesFromArray(array $builderData) $this->addClass($class); } } - + + /** + * Add class + * + * @param Builder\PhpClass $phpClass + * @return BuilderDefinition + */ public function addClass(Builder\PhpClass $phpClass) { $this->classes[] = $phpClass; @@ -93,7 +112,10 @@ public function getClassBuilder() { return $this->defaultClassBuilder; } - + + /** + * @return array + */ public function getClasses() { $classNames = array(); @@ -102,7 +124,11 @@ public function getClasses() } return $classNames; } - + + /** + * @param string $class + * @return bool + */ public function hasClass($class) { foreach ($this->classes as $classObj) { @@ -112,7 +138,11 @@ public function hasClass($class) } return false; } - + + /** + * @param string $name + * @return bool + */ protected function getClass($name) { foreach ($this->classes as $classObj) { @@ -122,7 +152,12 @@ protected function getClass($name) } return false; } - + + /** + * @param string $class + * @return array + * @throws Exception\RuntimeException + */ public function getClassSupertypes($class) { $class = $this->getClass($class); @@ -131,7 +166,12 @@ public function getClassSupertypes($class) } return $class->getSuperTypes(); } - + + /** + * @param string $class + * @return array|string + * @throws Exception\RuntimeException + */ public function getInstantiator($class) { $class = $this->getClass($class); @@ -140,17 +180,27 @@ public function getInstantiator($class) } return $class->getInstantiator(); } - + + /** + * @param string $class + * @return bool + * @throws Exception\RuntimeException + */ public function hasMethods($class) { - /* @var $class Zend\Di\Definition\Builder\PhpClass */ + /* @var $class \Zend\Di\Definition\Builder\PhpClass */ $class = $this->getClass($class); if ($class === false) { throw new Exception\RuntimeException('Cannot find class object in this builder definition.'); } return (count($class->getInjectionMethods()) > 0); } - + + /** + * @param string $class + * @return array + * @throws Exception\RuntimeException + */ public function getMethods($class) { $class = $this->getClass($class); @@ -164,7 +214,13 @@ public function getMethods($class) } return $methodNames; } - + + /** + * @param string $class + * @param string $method + * @return bool + * @throws Exception\RuntimeException + */ public function hasMethod($class, $method) { $class = $this->getClass($class); @@ -181,8 +237,8 @@ public function hasMethod($class, $method) } /** - * @param $class - * @param $method + * @param string $class + * @param string $method * @return bool */ public function hasMethodParameters($class, $method) @@ -202,7 +258,13 @@ public function hasMethodParameters($class, $method) } return (count($method->getParameters()) > 0); } - + + /** + * @param string $class + * @param string $method + * @return array + * @throws Exception\RuntimeException + */ public function getMethodParameters($class, $method) { $class = $this->getClass($class); diff --git a/src/Definition/ClassDefinition.php b/src/Definition/ClassDefinition.php index 0f0fe3ce..4970b64a 100644 --- a/src/Definition/ClassDefinition.php +++ b/src/Definition/ClassDefinition.php @@ -29,6 +29,11 @@ public function setSupertypes(array $supertypes) return $this; } + /** + * @param string $method + * @param bool|null $isRequired + * @return ClassDefinition + */ public function addMethod($method, $isRequired = null) { if ($isRequired === null) { @@ -43,6 +48,7 @@ public function addMethod($method, $isRequired = null) * @param $method * @param $parameterName * @param array $parameterInfo (keys: required, type) + * @return ClassDefinition */ public function addMethodParameter($method, $parameterName, array $parameterInfo) { diff --git a/src/Definition/CompilerDefinition.php b/src/Definition/CompilerDefinition.php index 0f1b0882..27be5fa8 100644 --- a/src/Definition/CompilerDefinition.php +++ b/src/Definition/CompilerDefinition.php @@ -2,22 +2,23 @@ namespace Zend\Di\Definition; -use Zend\Code\Scanner\DerivedClassScanner, - Zend\Code\Scanner\AggregateDirectoryScanner, - Zend\Code\Scanner\DirectoryScanner, - Zend\Code\Scanner\FileScanner, - - Zend\Di\Definition\Annotation, - Zend\Code\Annotation\AnnotationManager, - Zend\Code\Reflection, - Zend\Code\Annotation\AnnotationCollection; +use Zend\Code\Annotation\AnnotationCollection; +use Zend\Code\Annotation\AnnotationManager; +use Zend\Code\Scanner\AggregateDirectoryScanner; +use Zend\Code\Scanner\DirectoryScanner; +use Zend\Code\Scanner\DerivedClassScanner; +use Zend\Code\Scanner\FileScanner; +use Zend\Code\Reflection; +use Zend\Di\Definition\Annotation; class CompilerDefinition implements DefinitionInterface { protected $isCompiled = false; protected $introspectionStrategy = null; - + + protected $allowReflectionExceptions = false; + /** * @var AggregateDirectoryScanner */ @@ -25,19 +26,35 @@ class CompilerDefinition implements DefinitionInterface protected $classes = array(); + /** + * Constructor + * + * @param null|IntrospectionStrategy $introspectionStrategy + */ public function __construct(IntrospectionStrategy $introspectionStrategy = null) { $this->introspectionStrategy = ($introspectionStrategy) ?: new IntrospectionStrategy(); $this->directoryScanner = new AggregateDirectoryScanner(); } + /** + * Set introspection strategy + * + * @param IntrospectionStrategy $introspectionStrategy + */ public function setIntrospectionStrategy(IntrospectionStrategy $introspectionStrategy) { $this->introspectionStrategy = $introspectionStrategy; } - + + public function setAllowReflectionExceptions($allowReflectionExceptions = true) + { + $this->allowReflectionExceptions = (bool) $allowReflectionExceptions; + } + /** - * + * Get introspection strategy + * * @return IntrospectionStrategy */ public function getIntrospectionStrategy() @@ -45,16 +62,31 @@ public function getIntrospectionStrategy() return $this->introspectionStrategy; } + /** + * Add directory + * + * @param string $directory + */ public function addDirectory($directory) { $this->addDirectoryScanner(new DirectoryScanner($directory)); } + /** + * Add directory scanner + * + * @param DirectoryScanner $directoryScanner + */ public function addDirectoryScanner(DirectoryScanner $directoryScanner) { $this->directoryScanner->addDirectoryScanner($directoryScanner); } - + + /** + * Add code scanner file + * + * @param FileScanner $fileScanner + */ public function addCodeScannerFile(FileScanner $fileScanner) { if ($this->directoryScanner == null) { @@ -63,10 +95,17 @@ public function addCodeScannerFile(FileScanner $fileScanner) $this->directoryScanner->addFileScanner($fileScanner); } - + + /** + * Compile + * + * @return void + */ public function compile() { - /* @var $classScanner \Zend\Code\Scanner\DerivedClassScanner */ + /* + * @var $classScanner \Zend\Code\Scanner\DerivedClassScanner + */ foreach ($this->directoryScanner->getClassNames() as $class) { $this->processClass($class); } @@ -83,8 +122,14 @@ protected function processClass($class) { $strategy = $this->introspectionStrategy; // localize for readability - /** @var $rClass \Zend\Code\Reflection\ClassReflection */ - $rClass = new Reflection\ClassReflection($class); + try { + $rClass = new Reflection\ClassReflection($class); + } catch (\ReflectionException $e) { + if (!$this->allowReflectionExceptions) { + throw $e; + } + return; + } $className = $rClass->getName(); $matches = null; // used for regex below @@ -103,7 +148,8 @@ protected function processClass($class) $annotations = $rClass->getAnnotations($strategy->getAnnotationManager()); if (($annotations instanceof AnnotationCollection) - && $annotations->hasAnnotation('Zend\Di\Definition\Annotation\Instantiator')) { + && $annotations->hasAnnotation('Zend\Di\Definition\Annotation\Instantiator') + ) { // @todo Instnatiator support in annotations } } @@ -129,7 +175,14 @@ protected function processClass($class) if ($rClass->hasMethod('__construct')) { $def['methods']['__construct'] = true; // required - $this->processParams($def, $rClass, $rClass->getMethod('__construct')); + try { + $this->processParams($def, $rClass, $rClass->getMethod('__construct')); + } catch (\ReflectionException $e) { + if (!$this->allowReflectionExceptions) { + throw $e; + } + return; + } } @@ -145,7 +198,8 @@ protected function processClass($class) $annotations = $rMethod->getAnnotations($strategy->getAnnotationManager()); if (($annotations instanceof AnnotationCollection) - && $annotations->hasAnnotation('Zend\Di\Definition\Annotation\Inject')) { + && $annotations->hasAnnotation('Zend\Di\Definition\Annotation\Inject') + ) { $def['methods'][$methodName] = true; $this->processParams($def, $rClass, $rMethod); diff --git a/src/Definition/IntrospectionStrategy.php b/src/Definition/IntrospectionStrategy.php index ce6bcd36..32007209 100644 --- a/src/Definition/IntrospectionStrategy.php +++ b/src/Definition/IntrospectionStrategy.php @@ -3,6 +3,7 @@ namespace Zend\Di\Definition; use Zend\Code\Annotation\AnnotationManager; +use Zend\Code\Annotation\Parser\GenericAnnotationParser; class IntrospectionStrategy { @@ -26,52 +27,95 @@ class IntrospectionStrategy */ protected $annotationManager = null; + /** + * Constructor + * + * @param null|AnnotationManager $annotationManager + */ public function __construct(AnnotationManager $annotationManager = null) { $this->annotationManager = ($annotationManager) ?: $this->createDefaultAnnotationManager(); } + /** + * Get annotation manager + * + * @return null|AnnotationManager + */ public function getAnnotationManager() { return $this->annotationManager; } + /** + * Create default annotation manager + * + * @return AnnotationManager + */ public function createDefaultAnnotationManager() { $annotationManager = new AnnotationManager; - $annotationManager->registerAnnotation(new Annotation\Inject()); + $parser = new GenericAnnotationParser(); + $parser->registerAnnotation(new Annotation\Inject()); + $annotationManager->attach($parser); return $annotationManager; } - - + /** + * set use annotations + * + * @param bool $useAnnotations + */ public function setUseAnnotations($useAnnotations) { - $this->useAnnotations = $useAnnotations; + $this->useAnnotations = (bool) $useAnnotations; } + /** + * Get use annotations + * + * @return bool + */ public function getUseAnnotations() { return $this->useAnnotations; } - - public function setMethodNameInclusionPatterns($methodNameInclusionPatterns) + /** + * Set method name inclusion pattern + * + * @param array $methodNameInclusionPatterns + */ + public function setMethodNameInclusionPatterns(array $methodNameInclusionPatterns) { $this->methodNameInclusionPatterns = $methodNameInclusionPatterns; } + /** + * Get method name inclusion pattern + * + * @return array + */ public function getMethodNameInclusionPatterns() { return $this->methodNameInclusionPatterns; } - - public function setInterfaceInjectionInclusionPatterns($interfaceInjectionInclusionPatterns) + /** + * Set interface injection inclusion patterns + * + * @param array $interfaceInjectionInclusionPatterns + */ + public function setInterfaceInjectionInclusionPatterns(array $interfaceInjectionInclusionPatterns) { $this->interfaceInjectionInclusionPatterns = $interfaceInjectionInclusionPatterns; } + /** + * Get interface injection inclusion patterns + * + * @return array + */ public function getInterfaceInjectionInclusionPatterns() { return $this->interfaceInjectionInclusionPatterns; diff --git a/src/Definition/PartialMarker.php b/src/Definition/PartialMarker.php index 459b26e5..e5cdfffb 100644 --- a/src/Definition/PartialMarker.php +++ b/src/Definition/PartialMarker.php @@ -4,5 +4,4 @@ interface PartialMarker { - } diff --git a/src/Definition/RuntimeDefinition.php b/src/Definition/RuntimeDefinition.php index 20a512a1..cbc7cb15 100644 --- a/src/Definition/RuntimeDefinition.php +++ b/src/Definition/RuntimeDefinition.php @@ -2,10 +2,10 @@ namespace Zend\Di\Definition; -use Zend\Di\Definition\Annotation, - Zend\Code\Annotation\AnnotationManager, - Zend\Code\Annotation\AnnotationCollection, - Zend\Code\Reflection; +use Zend\Di\Definition\Annotation; +use Zend\Code\Annotation\AnnotationCollection; +use Zend\Code\Annotation\AnnotationManager; +use Zend\Code\Reflection; class RuntimeDefinition implements DefinitionInterface { @@ -31,7 +31,10 @@ class RuntimeDefinition implements DefinitionInterface protected $injectionMethods = array(); /** + * Constructor * + * @param null|IntrospectionStrategy $introspectionStrategy + * @param array|null $explicitClasses */ public function __construct(IntrospectionStrategy $introspectionStrategy = null, array $explicitClasses = null) { @@ -58,6 +61,11 @@ public function getIntrospectionStrategy() return $this->introspectionStrategy; } + /** + * Set explicit classes + * + * @param array $explicitClasses + */ public function setExplicitClasses(array $explicitClasses) { $this->explicitLookups = true; @@ -73,7 +81,7 @@ public function forceLoadClass($class) } /** - * Return nothing + * Retrieves registered classes names * * @return array */ @@ -168,6 +176,13 @@ public function getMethods($class) return $this->classes[$class]['methods']; } + /** + * Check if method has parameters + * + * @param string $class + * @param string $method + * @return bool + */ public function hasMethodParameters($class, $method) { if (!isset($this->classes[$class])) { diff --git a/src/DefinitionList.php b/src/DefinitionList.php index 22c504d8..22f21abf 100644 --- a/src/DefinitionList.php +++ b/src/DefinitionList.php @@ -16,7 +16,14 @@ public function __construct($definitions) $this->push($definition); } } - + + /** + * Add definitions + * + * @param Definition\DefinitionInterface $definition + * @param bool $addToBackOfList + * @return void + */ public function addDefinition(Definition\DefinitionInterface $definition, $addToBackOfList = true) { if ($addToBackOfList) { @@ -42,8 +49,10 @@ public function getDefinitionsByType($type) } /** + * Get definition by type + * * @param string $type - * @return Definition + * @return Definition\DefinitionInterface */ public function getDefinitionByType($type) { @@ -71,7 +80,11 @@ public function forClass($class) return $this->getDefinitionForClass($class); } - + /** + * Get classes + * + * @return array + */ public function getClasses() { $classes = array(); @@ -81,7 +94,13 @@ public function getClasses() } return $classes; } - + + /** + * Check for class + * + * @param string $class + * @return bool + */ public function hasClass($class) { /** @var $definition Definition\DefinitionInterface */ @@ -119,7 +138,13 @@ public function getInstantiator($class) } return false; } - + + /** + * Check for methods + * + * @param string $class + * @return bool + */ public function hasMethods($class) { /** @var $definition Definition\DefinitionInterface */ @@ -134,7 +159,14 @@ public function hasMethods($class) } return false; } - + + /** + * Check for method + * + * @param string $class + * @param string $method + * @return bool + */ public function hasMethod($class, $method) { /** @var $definition Definition\DefinitionInterface */ @@ -149,7 +181,13 @@ public function hasMethod($class, $method) } return false; } - + + /** + * Get methods + * + * @param string $class + * @return array| + */ public function getMethods($class) { /** @var $definition Definition\DefinitionInterface */ diff --git a/src/Di.php b/src/Di.php index b6117b76..d41a82d6 100644 --- a/src/Di.php +++ b/src/Di.php @@ -2,6 +2,8 @@ namespace Zend\Di; +use Closure; + class Di implements DependencyInjectionInterface { /** @@ -34,10 +36,11 @@ class Di implements DependencyInjectionInterface protected $references = array(); /** + * Constructor + * * @param null|DefinitionList $definitions * @param null|InstanceManager $instanceManager * @param null|Configuration $config - * @return Di */ public function __construct(DefinitionList $definitions = null, InstanceManager $instanceManager = null, Configuration $config = null) { @@ -144,6 +147,8 @@ public function get($name, array $params = array()) * @param array $params Parameters to pass to the constructor * @param bool $isShared * @return object|null + * @throws Exception\ClassNotFoundException + * @throws Exception\RuntimeException */ public function newInstance($name, array $params = array(), $isShared = true) { @@ -215,6 +220,8 @@ public function newInstance($name, array $params = array(), $isShared = true) } /** + * Inject dependencies + * * @param object $instance * @param array $params * @return void @@ -240,7 +247,6 @@ public function injectDependencies($instance, array $params = array()) $this->handleInjectDependencies($instance, $injectionMethods, $params, $class, null, null); } - protected function handleInjectDependencies($instance, $injectionMethods, $params, $instanceClass, $instanceAlias, $requestedName) { // localize dependencies @@ -360,6 +366,7 @@ protected function createInstanceViaConstructor($class, $params, $alias = null) * @param string $alias * @return object * @throws Exception\InvalidCallbackException + * @throws Exception\RuntimeException */ protected function createInstanceViaCallback($callback, $params, $alias) { @@ -391,6 +398,7 @@ protected function createInstanceViaCallback($callback, $params, $alias) * @param string $method * @param array $params * @param string $alias + * @return bool */ protected function resolveAndCallInjectionMethodForInstance($instance, $method, $params, $alias, $methodIsRequired, $methodClass = null) { @@ -415,6 +423,7 @@ protected function resolveAndCallInjectionMethodForInstance($instance, $method, * @param bool $isInstantiator * @param string $alias * @return array + * @throws Exception\CircularDependencyException */ protected function resolveMethodParameters($class, $method, array $callTimeUserParams, $alias, $methodIsRequired, $isInstantiator = false) { @@ -481,7 +490,7 @@ protected function resolveMethodParameters($class, $method, array $callTimeUserP $callTimeCurValue =& $callTimeUserParams[$name]; } - if (is_string($callTimeCurValue)) { + if ($type !== false && is_string($callTimeCurValue)) { if ($this->instanceManager->hasAlias($callTimeCurValue)) { // was an alias provided? $computedParams['required'][$fqParamPos] = array( @@ -525,8 +534,7 @@ protected function resolveMethodParameters($class, $method, array $callTimeUserP $iConfigCurValue =& $iConfig[$thisIndex]['parameters'][$name]; } - if (is_string($iConfigCurValue) - && $type === false) { + if ($type === false && is_string($iConfigCurValue)) { $computedParams['value'][$fqParamPos] = $iConfigCurValue; } elseif (is_string($iConfigCurValue) && isset($aliases[$iConfigCurValue])) { @@ -541,7 +549,7 @@ protected function resolveMethodParameters($class, $method, array $callTimeUserP $iConfigCurValue ); } elseif (is_object($iConfigCurValue) - && $iConfigCurValue instanceof \Closure + && $iConfigCurValue instanceof Closure && $type !== 'Closure') { $computedParams['value'][$fqParamPos] = $iConfigCurValue(); } else { diff --git a/src/Display/Console.php b/src/Display/Console.php index dbdb7fc7..de48d393 100644 --- a/src/Display/Console.php +++ b/src/Display/Console.php @@ -10,8 +10,19 @@ class Console * @var Di */ protected $di = null; + + /** + * @var array + */ protected $runtimeClasses = array(); + /** + * Export + * + * @param Di $di + * @param array $runtimeClasses + * @return void + */ public static function export(Di $di, array $runtimeClasses = array()) { $console = new static($di); @@ -19,6 +30,11 @@ public static function export(Di $di, array $runtimeClasses = array()) $console->render($di); } + /** + * Constructor + * + * @param null|Di $di + */ public function __construct(Di $di = null) { $this->di = ($di) ?: new Di; diff --git a/src/InstanceManager.php b/src/InstanceManager.php index 1ee38d31..96f5151a 100644 --- a/src/InstanceManager.php +++ b/src/InstanceManager.php @@ -71,9 +71,13 @@ public function getSharedInstance($classOrAlias) { return $this->sharedInstances[$classOrAlias]; } - + /** - * addSharedInstance() + * Add shared instance + * + * @param object $instance + * @param string $classOrAlias + * @throws Exception\InvalidArgumentException */ public function addSharedInstance($instance, $classOrAlias) { @@ -144,13 +148,23 @@ public function getSharedInstanceWithParameters($classOrAlias, array $params, $f } return false; } - - + + /** + * Check for an alias + * + * @param string $alias + * @return bool + */ public function hasAlias($alias) { return (isset($this->aliases[$alias])); } - + + /** + * Get aliases + * + * @return array + */ public function getAliases() { return $this->aliases; @@ -160,7 +174,8 @@ public function getAliases() * getClassFromAlias() * * @param string - * @return bool + * @return string|bool + * @throws Exception\RuntimeException */ public function getClassFromAlias($alias) { @@ -201,11 +216,11 @@ protected function getBaseAlias($alias) } /** - * addAlias() + * Add alias * * @throws Exception\InvalidArgumentException - * @param $alias - * @param $class + * @param string $alias + * @param string $class * @param array $parameters * @return void */ @@ -221,7 +236,13 @@ public function addAlias($alias, $class, array $parameters = array()) $this->setParameters($alias, $parameters); } } - + + /** + * Check for configuration + * + * @param string $aliasOrClass + * @return bool + */ public function hasConfiguration($aliasOrClass) { $key = ($this->hasAlias($aliasOrClass)) ? 'alias:' . $this->getBaseAlias($aliasOrClass) : $aliasOrClass; @@ -249,6 +270,11 @@ public function setConfiguration($aliasOrClass, array $configuration, $append = $this->configurations[$key] = array_replace_recursive($this->configurations[$key], $configuration); } + /** + * Get classes + * + * @return array + */ public function getClasses() { $classes = array(); @@ -275,6 +301,7 @@ public function getConfiguration($aliasOrClass) * * @param string $type Alias or Class * @param array $parameters Multi-dim array of parameters and their values + * @return void */ public function setParameters($aliasOrClass, array $parameters) { @@ -287,23 +314,44 @@ public function setParameters($aliasOrClass, array $parameters) * * @param string $type Alias or Class * @param array $methods Multi-dim array of methods and their parameters + * @return void */ public function setInjections($aliasOrClass, array $injections) { $this->setConfiguration($aliasOrClass, array('injections' => $injections), true); } + /** + * Set shared + * + * @param string $aliasOrClass + * @param bool $isShared + * @return void + */ public function setShared($aliasOrClass, $isShared) { - $this->setConfiguration($aliasOrClass, array('shared' => $isShared), true); + $this->setConfiguration($aliasOrClass, array('shared' => (bool) $isShared), true); } + /** + * Check for type preferences + * + * @param string $interfaceOrAbstract + * @return bool + */ public function hasTypePreferences($interfaceOrAbstract) { $key = ($this->hasAlias($interfaceOrAbstract)) ? 'alias:' . $interfaceOrAbstract : $interfaceOrAbstract; return (isset($this->typePreferences[$key]) && $this->typePreferences[$key]); } + /** + * Set type preference + * + * @param string $interfaceOrAbstract + * @param array $preferredImplementations + * @return InstanceManager + */ public function setTypePreference($interfaceOrAbstract, array $preferredImplementations) { $key = ($this->hasAlias($interfaceOrAbstract)) ? 'alias:' . $interfaceOrAbstract : $interfaceOrAbstract; @@ -313,6 +361,12 @@ public function setTypePreference($interfaceOrAbstract, array $preferredImplemen return $this; } + /** + * Get type preferences + * + * @param string $interfaceOrAbstract + * @return array + */ public function getTypePreferences($interfaceOrAbstract) { $key = ($this->hasAlias($interfaceOrAbstract)) ? 'alias:' . $interfaceOrAbstract : $interfaceOrAbstract; @@ -321,7 +375,13 @@ public function getTypePreferences($interfaceOrAbstract) } return array(); } - + + /** + * Unset type preferences + * + * @param string $interfaceOrAbstract + * @return void + */ public function unsetTypePreferences($interfaceOrAbstract) { $key = ($this->hasAlias($interfaceOrAbstract)) ? 'alias:' . $interfaceOrAbstract : $interfaceOrAbstract; @@ -348,7 +408,7 @@ public function removeTypePreference($interfaceOrAbstract, $preferredType) return $this; } - + protected function createHashForKeys($classOrAlias, $paramKeys) { return $classOrAlias . ':' . implode('|', $paramKeys); diff --git a/src/ServiceLocator.php b/src/ServiceLocator.php index 89852ce1..a0947dc4 100644 --- a/src/ServiceLocator.php +++ b/src/ServiceLocator.php @@ -2,6 +2,8 @@ namespace Zend\Di; +use Closure; + class ServiceLocator implements ServiceLocatorInterface { /** @@ -72,7 +74,7 @@ public function get($name, array $params = array()) } $service = $this->services[$name]; - if ($service instanceof \Closure + if ($service instanceof Closure || (!is_object($service) && is_callable($service)) ) { $this->services[$name] = $service = call_user_func_array($service, $params); diff --git a/src/ServiceLocator/DependencyInjectorProxy.php b/src/ServiceLocator/DependencyInjectorProxy.php index 3202e169..edc1e4d8 100644 --- a/src/ServiceLocator/DependencyInjectorProxy.php +++ b/src/ServiceLocator/DependencyInjectorProxy.php @@ -2,8 +2,8 @@ namespace Zend\Di\ServiceLocator; -use Zend\Di\Di, - Zend\Di\Exception; +use Zend\Di\Di; +use Zend\Di\Exception; class DependencyInjectorProxy extends Di { @@ -79,6 +79,7 @@ public function createInstanceViaConstructor($class, $params, $alias = null) * @param callback $callback * @param null|array $params * @return GeneratorInstance + * @throws Exception\InvalidCallbackException */ public function createInstanceViaCallback($callback, $params, $alias = null) { @@ -126,6 +127,8 @@ public function handleInjectionMethodForObject($class, $method, $params, $alias, * @param array $params * @param bool $isShared * @return GeneratorInstance + * @throws Exception\ClassNotFoundException + * @throws Exception\RuntimeException */ public function newInstance($name, array $params = array(), $isShared = true) { diff --git a/src/ServiceLocator/Generator.php b/src/ServiceLocator/Generator.php index 743f7ddc..dfa602aa 100644 --- a/src/ServiceLocator/Generator.php +++ b/src/ServiceLocator/Generator.php @@ -2,9 +2,9 @@ namespace Zend\Di\ServiceLocator; -use Zend\Di\Di, - Zend\Code\Generator as CodeGen, - Zend\Di\Exception; +use Zend\Code\Generator as CodeGen; +use Zend\Di\Di; +use Zend\Di\Exception; /** * @todo refactor to use new Definition interface @@ -62,6 +62,7 @@ public function setNamespace($namespace) * * @param null|string $filename * @return CodeGen\FileGenerator + * @throws Exception\RuntimeException */ public function getCodeGenerator($filename = null) { diff --git a/src/ServiceLocator/GeneratorInstance.php b/src/ServiceLocator/GeneratorInstance.php index 7bc992dc..c4f889bc 100644 --- a/src/ServiceLocator/GeneratorInstance.php +++ b/src/ServiceLocator/GeneratorInstance.php @@ -4,11 +4,33 @@ class GeneratorInstance { + /** + * @var string + */ protected $name; + + /** + * @var mixed + */ protected $constructor; + + /** + * @var array + */ protected $params; + + /** + * @var array + */ protected $methods = array(); + /** + * Constructor + * + * @param string $name + * @param mixed $constructor + * @param array $params + */ public function __construct($name, $constructor, array $params) { $this->name = $name; @@ -16,6 +38,11 @@ public function __construct($name, $constructor, array $params) $this->params = $params; } + /** + * Get name + * + * @return string + */ public function getName() { return $this->name; @@ -36,22 +63,43 @@ public function setName($name) return $this; } + /** + * Get constructor + * + * @return mixed + */ public function getConstructor() { return $this->constructor; } + /** + * Get params + * + * @return array + */ public function getParams() { return $this->params; } + /** + * Set methods + * + * @param array $methods + * @return GeneratorInstance + */ public function setMethods(array $methods) { $this->methods = $methods; return $this; } + /** + * Get methods + * + * @return array + */ public function getMethods() { return $this->methods; diff --git a/test/ConfigurationTest.php b/test/ConfigurationTest.php index e71ab172..dc8cfd2d 100644 --- a/test/ConfigurationTest.php +++ b/test/ConfigurationTest.php @@ -2,10 +2,10 @@ namespace ZendTest\Di; -use Zend\Di\Configuration, - Zend\Di\Di, - Zend\Config\Factory as ConfigFactory, - PHPUnit_Framework_TestCase as TestCase; +use Zend\Di\Configuration; +use Zend\Di\Di; +use Zend\Config\Factory as ConfigFactory; +use PHPUnit_Framework_TestCase as TestCase; class ConfigurationTest extends TestCase { diff --git a/test/Definition/BuilderDefinitionTest.php b/test/Definition/BuilderDefinitionTest.php index 5e006510..236e81af 100644 --- a/test/Definition/BuilderDefinitionTest.php +++ b/test/Definition/BuilderDefinitionTest.php @@ -2,10 +2,10 @@ namespace ZendTest\Di\Definition; -use Zend\Di\Definition\BuilderDefinition, - Zend\Di\Definition\Builder, - Zend\Config\Factory as ConfigFactory, - PHPUnit_Framework_TestCase as TestCase; +use Zend\Di\Definition\BuilderDefinition; +use Zend\Di\Definition\Builder; +use Zend\Config\Factory as ConfigFactory; +use PHPUnit_Framework_TestCase as TestCase; class BuilderDefinitionTest extends TestCase { diff --git a/test/Definition/CompilerDefinitionTest.php b/test/Definition/CompilerDefinitionTest.php index e2be05b4..fd3f5539 100644 --- a/test/Definition/CompilerDefinitionTest.php +++ b/test/Definition/CompilerDefinitionTest.php @@ -2,10 +2,10 @@ namespace ZendTest\Di\Definition; -use Zend\Di\Definition\CompilerDefinition, - Zend\Code\Scanner\DirectoryScanner, - Zend\Code\Scanner\FileScanner, - PHPUnit_Framework_TestCase as TestCase; +use Zend\Di\Definition\CompilerDefinition; +use Zend\Code\Scanner\DirectoryScanner; +use Zend\Code\Scanner\FileScanner; +use PHPUnit_Framework_TestCase as TestCase; class CompilerDefinitionTest extends TestCase { @@ -79,4 +79,24 @@ public function testCompilerFileScanner() $this->assertContains('ZendTest\Di\TestAsset\CompilerClasses\C', $definition->getClassSupertypes('ZendTest\Di\TestAsset\CompilerClasses\E')); $this->assertContains('ZendTest\Di\TestAsset\CompilerClasses\D', $definition->getClassSupertypes('ZendTest\Di\TestAsset\CompilerClasses\E')); } + + public function testCompilerReflectionException() + { + $this->setExpectedException('ReflectionException', 'Class ZendTest\Di\TestAsset\InvalidCompilerClasses\Foo does not exist'); + $definition = new CompilerDefinition; + $definition->addDirectory(__DIR__ . '/../TestAsset/InvalidCompilerClasses'); + $definition->compile(); + } + + public function testCompilerAllowReflectionException() + { + $definition = new CompilerDefinition; + $definition->setAllowReflectionExceptions(); + $definition->addDirectory(__DIR__ . '/../TestAsset/InvalidCompilerClasses'); + $definition->compile(); + $parameters = $definition->getMethodParameters('ZendTest\Di\TestAsset\InvalidCompilerClasses\InvalidClass', '__construct'); + + // The exception gets caught before the parameter's class is set + $this->assertCount(1, current($parameters)); + } } diff --git a/test/DiTest.php b/test/DiTest.php index d84b9de2..5117ba9d 100644 --- a/test/DiTest.php +++ b/test/DiTest.php @@ -2,11 +2,11 @@ namespace ZendTest\Di; -use Zend\Di\Di, - Zend\Di\DefinitionList, - Zend\Di\InstanceManager, - Zend\Di\Configuration, - Zend\Di\Definition; +use Zend\Di\Di; +use Zend\Di\DefinitionList; +use Zend\Di\InstanceManager; +use Zend\Di\Configuration; +use Zend\Di\Definition; class DiTest extends \PHPUnit_Framework_TestCase @@ -664,4 +664,25 @@ public function testInjectionForSetterInjectionWillNotUseSupertypeWhenChildParam $c = $di->get('ZendTest\Di\TestAsset\InheritanceClasses\C'); $this->assertEquals('b', $c->test); } + + /** + * @group ZF2-260 + */ + public function testDiWillInjectClassNameAsStringAtCallTime() + { + $di = new Di; + + $classDef = new Definition\ClassDefinition('ZendTest\Di\TestAsset\SetterInjection\D'); + $classDef->addMethod('setA', true); + $classDef->addMethodParameter('setA', 'a', array('type' => false, 'required' => true)); + $di->definitions()->addDefinition($classDef, false); + + $d = $di->get( + 'ZendTest\Di\TestAsset\SetterInjection\D', + array('a' => 'ZendTest\Di\TestAsset\SetterInjection\A') + ); + + $this->assertSame($d->a, 'ZendTest\Di\TestAsset\SetterInjection\A'); + } + } diff --git a/test/ServiceLocator/GeneratorTest.php b/test/ServiceLocator/GeneratorTest.php index 9d2c6722..3cb02e34 100644 --- a/test/ServiceLocator/GeneratorTest.php +++ b/test/ServiceLocator/GeneratorTest.php @@ -1,12 +1,12 @@ foo = $foo; + } +} diff --git a/test/TestAsset/SetterInjection/D.php b/test/TestAsset/SetterInjection/D.php new file mode 100644 index 00000000..ab945f78 --- /dev/null +++ b/test/TestAsset/SetterInjection/D.php @@ -0,0 +1,12 @@ +a = $a; + } +}