vendor/doctrine/common/src/Proxy/Autoloader.php line 92

Open in your IDE?
  1. <?php
  2. namespace Doctrine\Common\Proxy;
  3. use Closure;
  4. use Doctrine\Common\Proxy\Exception\InvalidArgumentException;
  5. use function call_user_func;
  6. use function file_exists;
  7. use function is_callable;
  8. use function ltrim;
  9. use function spl_autoload_register;
  10. use function str_replace;
  11. use function strlen;
  12. use function strpos;
  13. use function substr;
  14. use const DIRECTORY_SEPARATOR;
  15. /**
  16.  * Special Autoloader for Proxy classes, which are not PSR-0 compliant.
  17.  *
  18.  * @internal
  19.  */
  20. class Autoloader
  21. {
  22.     /**
  23.      * Resolves proxy class name to a filename based on the following pattern.
  24.      *
  25.      * 1. Remove Proxy namespace from class name.
  26.      * 2. Remove namespace separators from remaining class name.
  27.      * 3. Return PHP filename from proxy-dir with the result from 2.
  28.      *
  29.      * @param string $proxyDir
  30.      * @param string $proxyNamespace
  31.      * @param string $className
  32.      * @psalm-param class-string $className
  33.      *
  34.      * @return string
  35.      *
  36.      * @throws InvalidArgumentException
  37.      */
  38.     public static function resolveFile($proxyDir$proxyNamespace$className)
  39.     {
  40.         if (strpos($className$proxyNamespace) !== 0) {
  41.             throw InvalidArgumentException::notProxyClass($className$proxyNamespace);
  42.         }
  43.         // remove proxy namespace from class name
  44.         $classNameRelativeToProxyNamespace substr($classNamestrlen($proxyNamespace));
  45.         // remove namespace separators from remaining class name
  46.         $fileName str_replace('\\'''$classNameRelativeToProxyNamespace);
  47.         return $proxyDir DIRECTORY_SEPARATOR $fileName '.php';
  48.     }
  49.     /**
  50.      * Registers and returns autoloader callback for the given proxy dir and namespace.
  51.      *
  52.      * @param string        $proxyDir
  53.      * @param string        $proxyNamespace
  54.      * @param callable|null $notFoundCallback Invoked when the proxy file is not found.
  55.      *
  56.      * @return Closure
  57.      *
  58.      * @throws InvalidArgumentException
  59.      */
  60.     public static function register($proxyDir$proxyNamespace$notFoundCallback null)
  61.     {
  62.         $proxyNamespace ltrim($proxyNamespace'\\');
  63.         if ($notFoundCallback !== null && ! is_callable($notFoundCallback)) {
  64.             throw InvalidArgumentException::invalidClassNotFoundCallback($notFoundCallback);
  65.         }
  66.         $autoloader = static function ($className) use ($proxyDir$proxyNamespace$notFoundCallback) {
  67.             if ($proxyNamespace === '') {
  68.                 return;
  69.             }
  70.             if (strpos($className$proxyNamespace) !== 0) {
  71.                 return;
  72.             }
  73.             $file Autoloader::resolveFile($proxyDir$proxyNamespace$className);
  74.             if ($notFoundCallback && ! file_exists($file)) {
  75.                 call_user_func($notFoundCallback$proxyDir$proxyNamespace$className);
  76.             }
  77.             require $file;
  78.         };
  79.         spl_autoload_register($autoloader);
  80.         return $autoloader;
  81.     }
  82. }