improvements to autoloader namespace handling.
This commit is contained in:
parent
bc1a7d0771
commit
618980c678
|
@ -56,19 +56,21 @@ class_alias(static::$aliases[$class], $class);
|
||||||
require static::$mappings[$class];
|
require static::$mappings[$class];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the class namespace is mapped to a directory, we will load the
|
||||||
|
// class using the PSR-0 standards from that directory; however, we
|
||||||
|
// will trim off the beginning of the namespace to account for
|
||||||
|
// the root of the mapped directory.
|
||||||
|
if ( ! is_null($info = static::namespaced($class)))
|
||||||
|
{
|
||||||
|
$class = substr($class, strlen($info['namespace']));
|
||||||
|
|
||||||
|
return static::load_psr($class, $info['directory']);
|
||||||
|
}
|
||||||
|
|
||||||
elseif (($slash = strpos($class, '\\')) !== false)
|
elseif (($slash = strpos($class, '\\')) !== false)
|
||||||
{
|
{
|
||||||
$namespace = substr($class, 0, $slash);
|
$namespace = substr($class, 0, $slash);
|
||||||
|
|
||||||
// If the class namespace is mapped to a directory, we will load the class
|
|
||||||
// using the PSR-0 standards from that directory; however, we will trim
|
|
||||||
// off the beginning of the namespace to account for files in the root
|
|
||||||
// of the mapped directory.
|
|
||||||
if ( ! is_null($directory = static::directory($class)))
|
|
||||||
{
|
|
||||||
return static::load_psr(substr($class, $slash + 1), $directory);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the class is namespaced to an existing bundle and the bundle has
|
// If the class is namespaced to an existing bundle and the bundle has
|
||||||
// not been started, we will start the bundle and attempt to load the
|
// not been started, we will start the bundle and attempt to load the
|
||||||
// class file again. If that fails, an error will be thrown by PHP.
|
// class file again. If that fails, an error will be thrown by PHP.
|
||||||
|
@ -91,23 +93,6 @@ class_alias(static::$aliases[$class], $class);
|
||||||
static::load_psr($class);
|
static::load_psr($class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the directory associated with a given namespaced class.
|
|
||||||
*
|
|
||||||
* @param string $class
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected static function directory($class)
|
|
||||||
{
|
|
||||||
foreach (static::$namespaces as $namespace => $directory)
|
|
||||||
{
|
|
||||||
if (starts_with($class, $namespace))
|
|
||||||
{
|
|
||||||
return $directory;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt to resolve a class using the PSR-0 standard.
|
* Attempt to resolve a class using the PSR-0 standard.
|
||||||
*
|
*
|
||||||
|
@ -154,6 +139,26 @@ protected static function load_psr($class, $directory = null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the directory for a given namespaced class.
|
||||||
|
*
|
||||||
|
* @param string $class
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function namespaced($class)
|
||||||
|
{
|
||||||
|
foreach (static::$namespaces as $namespace => $directory)
|
||||||
|
{
|
||||||
|
// If the class begins with one of the registered namespaces,
|
||||||
|
// we'll return both the namespace and the directory, which
|
||||||
|
// will allow us to use PSR-0 to load the class.
|
||||||
|
if (starts_with($class, $namespace))
|
||||||
|
{
|
||||||
|
return compact('namespace', 'directory');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an array of class to path mappings.
|
* Register an array of class to path mappings.
|
||||||
*
|
*
|
||||||
|
@ -203,11 +208,26 @@ public static function psr($directory)
|
||||||
*/
|
*/
|
||||||
public static function namespaces($mappings)
|
public static function namespaces($mappings)
|
||||||
{
|
{
|
||||||
$directories = static::format(array_values($mappings));
|
foreach ($mappings as $namespace => $directory)
|
||||||
|
{
|
||||||
|
$namespace = trim($namespace, '\\').'\\';
|
||||||
|
|
||||||
$mappings = array_combine(array_keys($mappings), $directories);
|
static::$namespaces[$namespace] = head(static::format($directory));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static::$namespaces = array_merge(static::$namespaces, $mappings);
|
/**
|
||||||
|
* Register underscored "namespaces" to directory mappings.
|
||||||
|
*
|
||||||
|
* @param array $mappings
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function underscored($mappings)
|
||||||
|
{
|
||||||
|
foreach ($mappings as $namespace => $directory)
|
||||||
|
{
|
||||||
|
static::$namespaces[$namespace.'_'] = head(static::format($directory));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue