improvements to autoloader namespace handling.

This commit is contained in:
Taylor Otwell 2012-02-06 11:59:24 -06:00
parent bc1a7d0771
commit 618980c678
1 changed files with 49 additions and 29 deletions

View File

@ -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));
}
}
/**