122 lines
2.9 KiB
PHP
122 lines
2.9 KiB
PHP
<?php namespace Laravel\Routing;
|
|
|
|
use Laravel\Arr;
|
|
use RecursiveIteratorIterator as Iterator;
|
|
use RecursiveDirectoryIterator as DirectoryIterator;
|
|
|
|
class Loader {
|
|
|
|
/**
|
|
* The location of the base routes file.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $base;
|
|
|
|
/**
|
|
* The directory containing nested route files.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $nest;
|
|
|
|
/**
|
|
* A cache for all of the routes defined for the entire application.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $everything;
|
|
|
|
/**
|
|
* Create a new route loader instance.
|
|
*
|
|
* @param string $base
|
|
* @param string $nest
|
|
* @return void
|
|
*/
|
|
public function __construct($base, $nest)
|
|
{
|
|
$this->base = $base;
|
|
$this->nest = $nest;
|
|
}
|
|
|
|
/**
|
|
* Load the applicable routes for a given URI.
|
|
*
|
|
* @param string $uri
|
|
* @return array
|
|
*/
|
|
public function load($uri)
|
|
{
|
|
$routes = (file_exists($path = $this->base.'routes'.EXT)) ? require $path : array();
|
|
|
|
$segments = Arr::without(explode('/', $uri), '');
|
|
|
|
return array_merge($this->nested($segments), $routes);
|
|
}
|
|
|
|
/**
|
|
* Get the appropriate routes from the routes directory for a given URI.
|
|
*
|
|
* This method works backwards through the URI segments until we find the
|
|
* deepest possible matching route directory. Once the deepest directory
|
|
* is found, all of the applicable routes will be returend.
|
|
*
|
|
* @param array $segments
|
|
* @return array
|
|
*/
|
|
protected function nested($segments)
|
|
{
|
|
foreach (array_reverse($segments, true) as $key => $value)
|
|
{
|
|
$path = $this->nest.implode('/', array_slice($segments, 0, $key + 1)).EXT;
|
|
|
|
if (file_exists($path)) return require $path;
|
|
}
|
|
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Get every route defined for the application.
|
|
*
|
|
* The entire routes directory will be searched recursively to gather
|
|
* every route for the application. Of course, the routes in the root
|
|
* routes file will be returned as well.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function everything()
|
|
{
|
|
if ( ! is_null($this->everything)) return $this->everything;
|
|
|
|
$routes = array();
|
|
|
|
// First, we'll grab the base routes from the application directory.
|
|
// Once we have these, we'll merge all of the nested routes in the
|
|
// routes directory into this array of routes.
|
|
if (file_exists($path = $this->base.'routes'.EXT))
|
|
{
|
|
$routes = array_merge($routes, require $path);
|
|
}
|
|
|
|
if ( ! is_dir($this->nest)) return $routes;
|
|
|
|
$iterator = new Iterator(new DirectoryIterator($this->nest), Iterator::SELF_FIRST);
|
|
|
|
foreach ($iterator as $file)
|
|
{
|
|
// Since some Laravel developers may place HTML files in the route
|
|
// directories, we will check for the PHP extension before merging
|
|
// the file. Typically, the HTML files are present in installations
|
|
// that are not using mod_rewrite and the public directory.
|
|
if (filetype($file) === 'file' and strpos($file, EXT) !== false)
|
|
{
|
|
$routes = array_merge(require $file, $routes);
|
|
}
|
|
}
|
|
|
|
return $this->everything = $routes;
|
|
}
|
|
|
|
} |