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];
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
$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
|
||||
// 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.
|
||||
|
@ -91,23 +93,6 @@ class_alias(static::$aliases[$class], $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.
|
||||
*
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -203,11 +208,26 @@ public static function psr($directory)
|
|||
*/
|
||||
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