TYPO3  7.6
ClassAliasLoader.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\ClassAliasLoader;
3 
4 /*
5  * This file is part of the class alias loader package.
6  *
7  * (c) Helmut Hummel <info@helhum.io>
8  *
9  * For the full copyright and license information, please view the LICENSE
10  * file that was distributed with this source code.
11  */
12 
13 use Composer\Autoload\ClassLoader as ComposerClassLoader;
14 
20 {
25 
29  protected $aliasMap = array(
30  'aliasToClassNameMapping' => array(),
31  'classNameToAliasMapping' => array()
32  );
33 
37  protected $caseSensitiveClassLoading = true;
38 
42  public function __construct(ComposerClassLoader $composerClassLoader)
43  {
44  $this->composerClassLoader = $composerClassLoader;
45  }
46 
52  public function setAliasMap(array $aliasMap)
53  {
54  $this->aliasMap = $aliasMap;
55  }
56 
61  {
62  $this->caseSensitiveClassLoading = $caseSensitiveClassLoading;
63  }
64 
70  public function addAliasMap(array $aliasMap)
71  {
72  foreach ($aliasMap['aliasToClassNameMapping'] as $alias => $originalClassName) {
73  $lowerCaseAlias = strtolower($alias);
74  $this->aliasMap['aliasToClassNameMapping'][$lowerCaseAlias] = $originalClassName;
75  $this->aliasMap['classNameToAliasMapping'][$originalClassName][$lowerCaseAlias] = $lowerCaseAlias;
76  }
77  }
78 
85  public function getClassNameForAlias($aliasOrClassName)
86  {
87  $lookUpClassName = strtolower($aliasOrClassName);
88 
89  return isset($this->aliasMap['aliasToClassNameMapping'][$lookUpClassName]) ? $this->aliasMap['aliasToClassNameMapping'][$lookUpClassName] : $aliasOrClassName;
90  }
91 
97  public function register($prepend = false)
98  {
99  $this->composerClassLoader->unregister();
100  spl_autoload_register(array($this, 'loadClassWithAlias'), true, $prepend);
101  }
102 
106  public function unregister()
107  {
108  spl_autoload_unregister(array($this, 'loadClassWithAlias'));
109  }
110 
117  public function loadClassWithAlias($className)
118  {
119  $originalClassName = $this->getOriginalClassName($className);
120  return $originalClassName ? $this->loadOriginalClassAndSetAliases($originalClassName) : $this->loadClass($className);
121  }
122 
129  public function loadClass($className) {
130  $classFound = $this->composerClassLoader->loadClass($className);
131  if (!$classFound && !$this->caseSensitiveClassLoading) {
132  $classFound = $this->composerClassLoader->loadClass(strtolower($className));
133  }
134  return $classFound;
135  }
136 
143  protected function getOriginalClassName($aliasOrClassName)
144  {
145  // Is an original class which has an alias
146  if (array_key_exists($aliasOrClassName, $this->aliasMap['classNameToAliasMapping'])) {
147  return $aliasOrClassName;
148  }
149 
150  // Is an alias (we're graceful regarding casing for alias definitions)
151  $lowerCasedClassName = strtolower($aliasOrClassName);
152  if (array_key_exists($lowerCasedClassName, $this->aliasMap['aliasToClassNameMapping'])) {
153  return $this->aliasMap['aliasToClassNameMapping'][$lowerCasedClassName];
154  }
155  // No alias registered for this class name, return and remember that info
156  return $this->aliasMap['classNameToAliasMapping'][$aliasOrClassName] = NULL;
157  }
158 
167  protected function loadOriginalClassAndSetAliases($originalClassName)
168  {
169  if ($this->classOrInterfaceExists($originalClassName) || $this->loadClass($originalClassName)) {
170  foreach ($this->aliasMap['classNameToAliasMapping'][$originalClassName] as $aliasClassName) {
171  if (!$this->classOrInterfaceExists($aliasClassName)) {
172  class_alias($originalClassName, $aliasClassName);
173  }
174  }
175 
176  return true;
177  }
178 
179  return null;
180  }
181 
186  protected function classOrInterfaceExists($className)
187  {
188  return class_exists($className, false) || interface_exists($className, false);
189  }
190 
198  public function __call($method, $arguments)
199  {
200  if (!is_callable(array($this->composerClassLoader, $method))) {
201  throw new \InvalidArgumentException(sprintf('Method "%s" does not exist!', $method), 1422631610);
202  }
203 
204  return call_user_func_array(array($this->composerClassLoader, $method), $arguments);
205  }
206 
207 }