85 if ($this->classInfoFactory == NULL) {
97 if ($this->cache == NULL) {
109 if ($this->instantiator == NULL) {
110 $this->instantiator = new \Doctrine\Instantiator\Instantiator();
123 public function getInstance($className, $givenConstructorArguments = array()) {
124 $this->prototypeObjectsWhichAreCurrentlyInstanciated = array();
138 if ($classInfo->getIsInitializeable() && is_callable(array($object,
'initializeObject'))) {
139 $object->initializeObject();
156 if ($className[0] ===
'\\') {
157 $className = substr($className, 1);
160 if ($className ===
'TYPO3\\CMS\\Extbase\\Object\\Container\\Container') {
163 if ($className ===
'TYPO3\\CMS\\Core\\Cache\\CacheManager') {
164 return \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
'TYPO3\\CMS\\Core\\Cache\\CacheManager');
166 if ($className ===
'TYPO3\\CMS\\Core\\Package\\PackageManager') {
167 return \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
'TYPO3\\CMS\\Core\\Package\\PackageManager');
170 if (isset($this->singletonInstances[$className])) {
171 if (count($givenConstructorArguments) > 0) {
172 throw new \TYPO3\CMS\Extbase\Object\Exception(
'Object "' . $className .
'" fetched from singleton cache, thus, explicit constructor arguments are not allowed.', 1292857934);
174 return $this->singletonInstances[$className];
177 $classIsSingleton = $classInfo->getIsSingleton();
178 if (!$classIsSingleton) {
179 if (array_key_exists($className, $this->prototypeObjectsWhichAreCurrentlyInstanciated) !== FALSE) {
180 throw new \TYPO3\CMS\Extbase\Object\Exception\CannotBuildObjectException(
'Cyclic dependency in prototype object, for class "' . $className .
'".', 1295611406);
182 $this->prototypeObjectsWhichAreCurrentlyInstanciated[$className] = TRUE;
186 if ($classInfo->getIsInitializeable() && is_callable(array($instance,
'initializeObject'))) {
187 $instance->initializeObject();
189 if (!$classIsSingleton) {
190 unset($this->prototypeObjectsWhichAreCurrentlyInstanciated[$className]);
206 $className = $classInfo->getClassName();
207 $classIsSingleton = $classInfo->getIsSingleton();
208 if ($classIsSingleton && count($givenConstructorArguments) > 0) {
209 throw new \TYPO3\CMS\Extbase\Object\Exception(
'Object "' . $className .
'" has explicit constructor arguments but is a singleton; this is not allowed.', 1292858051);
212 array_unshift($constructorArguments, $className);
213 $instance = call_user_func_array(array(
'TYPO3\\CMS\\Core\\Utility\\GeneralUtility',
'makeInstance'), $constructorArguments);
214 if ($classIsSingleton) {
215 $this->singletonInstances[$className] = $instance;
228 if (!$classInfo->hasInjectMethods() && !$classInfo->hasInjectProperties()) {
231 foreach ($classInfo->getInjectMethods() as $injectMethodName => $classNameToInject) {
234 $classInfo->getIsSingleton() && !$instanceToInject instanceof \TYPO3\CMS\Core\SingletonInterface
235 && strpos($classNameToInject,
'TYPO3\\CMS') === FALSE
237 $this->
log(
'The singleton "' . $classInfo->getClassName() .
'" needs a prototype in "' . $injectMethodName .
'". This is often a bad code smell; often you rather want to inject a singleton.', 1);
239 if (is_callable(array($instance, $injectMethodName))) {
240 $instance->{$injectMethodName}($instanceToInject);
243 foreach ($classInfo->getInjectProperties() as $injectPropertyName => $classNameToInject) {
245 if ($classInfo->getIsSingleton() && !$instanceToInject instanceof \TYPO3\CMS\Core\SingletonInterface) {
246 $this->
log(
'The singleton "' . $classInfo->getClassName() .
'" needs a prototype in "' . $injectPropertyName .
'". This is often a bad code smell; often you rather want to inject a singleton.', 1);
250 $propertyReflection->setAccessible(TRUE);
251 $propertyReflection->setValue($instance, $instanceToInject);
262 protected function log($message, $severity) {
274 $this->alternativeImplementation[$className] = $alternativeClassName;
288 $constructorArgumentInformation = $classInfo->getConstructorArguments();
289 foreach ($constructorArgumentInformation as $index => $argumentInformation) {
291 if (array_key_exists($index, $givenConstructorArguments) && (!isset($argumentInformation[
'dependency']) || is_a($givenConstructorArguments[$index], $argumentInformation[
'dependency']))) {
292 $parameter = $givenConstructorArguments[$index];
294 if (isset($argumentInformation[
'dependency']) && !array_key_exists(
'defaultValue', $argumentInformation)) {
296 if ($classInfo->getIsSingleton() && !$parameter instanceof \TYPO3\CMS\Core\SingletonInterface) {
297 $this->
log(
'The singleton "' . $className .
'" needs a prototype in the constructor. This is often a bad code smell; often you rather want to inject a singleton.', 1);
299 } elseif (array_key_exists(
'defaultValue', $argumentInformation)) {
300 $parameter = $argumentInformation[
'defaultValue'];
302 throw new \InvalidArgumentException(
'not a correct info array of constructor dependencies was passed!');
318 if (isset($this->alternativeImplementation[$className])) {
319 $className = $this->alternativeImplementation[$className];
321 if (substr($className, -9) ===
'Interface') {
322 $className = substr($className, 0, -9);
334 $classNameHash = md5($className);
349 return $this->
getClassInfo($className)->getIsSingleton();
getConstructorArguments($className, \TYPO3\CMS\Extbase\Object\Container\ClassInfo $classInfo, array $givenConstructorArguments)
getInstanceInternal($className, $givenConstructorArguments=array())
registerImplementation($className, $alternativeClassName)
$prototypeObjectsWhichAreCurrentlyInstanciated
static devLog($msg, $extKey, $severity=0, $dataVar=FALSE)
static getClassNameForAlias($alias)
instanciateObject(\TYPO3\CMS\Extbase\Object\Container\ClassInfo $classInfo, array $givenConstructorArguments)
static makeInstance($className)
getInstance($className, $givenConstructorArguments=array())
injectDependencies($instance, \TYPO3\CMS\Extbase\Object\Container\ClassInfo $classInfo)
getEmptyObject($className)
$alternativeImplementation
getImplementationClassName($className)