File: /home/mmickelson/w2p.spidev.xyz/vendor/laravel/lumen-framework/src/Routing/Router.php
<?php
namespace Laravel\Lumen\Routing;
use Illuminate\Support\Arr;
class Router
{
/**
* The application instance.
*
* @var \Laravel\Lumen\Application
*/
public $app;
/**
* The route group attribute stack.
*
* @var array
*/
protected $groupStack = [];
/**
* All of the routes waiting to be registered.
*
* @var array
*/
protected $routes = [];
/**
* All of the named routes and URI pairs.
*
* @var array
*/
public $namedRoutes = [];
/**
* Router constructor.
*
* @param \Laravel\Lumen\Application $app
*/
public function __construct($app)
{
$this->app = $app;
}
/**
* Register a set of routes with a set of shared attributes.
*
* @param array $attributes
* @param \Closure $callback
* @return void
*/
public function group(array $attributes, \Closure $callback)
{
if (isset($attributes['middleware']) && is_string($attributes['middleware'])) {
$attributes['middleware'] = explode('|', $attributes['middleware']);
}
$this->updateGroupStack($attributes);
call_user_func($callback, $this);
array_pop($this->groupStack);
}
/**
* Update the group stack with the given attributes.
*
* @param array $attributes
* @return void
*/
protected function updateGroupStack(array $attributes)
{
if (! empty($this->groupStack)) {
$attributes = $this->mergeWithLastGroup($attributes);
}
$this->groupStack[] = $attributes;
}
/**
* Merge the given group attributes.
*
* @param array $new
* @param array $old
* @return array
*/
public function mergeGroup($new, $old)
{
$new['namespace'] = static::formatUsesPrefix($new, $old);
$new['prefix'] = static::formatGroupPrefix($new, $old);
if (isset($new['domain'])) {
unset($old['domain']);
}
if (isset($old['as'])) {
$new['as'] = $old['as'].(isset($new['as']) ? '.'.$new['as'] : '');
}
if (isset($old['suffix']) && ! isset($new['suffix'])) {
$new['suffix'] = $old['suffix'];
}
return array_merge_recursive(Arr::except($old, ['namespace', 'prefix', 'as', 'suffix']), $new);
}
/**
* Merge the given group attributes with the last added group.
*
* @param array $new
* @return array
*/
protected function mergeWithLastGroup($new)
{
return $this->mergeGroup($new, end($this->groupStack));
}
/**
* Format the uses prefix for the new group attributes.
*
* @param array $new
* @param array $old
* @return string|null
*/
protected static function formatUsesPrefix($new, $old)
{
if (isset($new['namespace'])) {
return isset($old['namespace']) && strpos($new['namespace'], '\\') !== 0
? trim($old['namespace'], '\\').'\\'.trim($new['namespace'], '\\')
: trim($new['namespace'], '\\');
}
return $old['namespace'] ?? null;
}
/**
* Format the prefix for the new group attributes.
*
* @param array $new
* @param array $old
* @return string|null
*/
protected static function formatGroupPrefix($new, $old)
{
$oldPrefix = $old['prefix'] ?? null;
if (isset($new['prefix'])) {
return trim($oldPrefix, '/').'/'.trim($new['prefix'], '/');
}
return $oldPrefix;
}
/**
* Add a route to the collection.
*
* @param array|string $method
* @param string $uri
* @param mixed $action
* @return void
*/
public function addRoute($method, $uri, $action)
{
$action = $this->parseAction($action);
$attributes = null;
if ($this->hasGroupStack()) {
$attributes = $this->mergeWithLastGroup([]);
}
if (isset($attributes) && is_array($attributes)) {
if (isset($attributes['prefix'])) {
$uri = trim($attributes['prefix'], '/').'/'.trim($uri, '/');
}
if (isset($attributes['suffix'])) {
$uri = trim($uri, '/').rtrim($attributes['suffix'], '/');
}
$action = $this->mergeGroupAttributes($action, $attributes);
}
$uri = '/'.trim($uri, '/');
if (isset($action['as'])) {
$this->namedRoutes[$action['as']] = $uri;
}
if (is_array($method)) {
foreach ($method as $verb) {
$this->routes[$verb.$uri] = ['method' => $verb, 'uri' => $uri, 'action' => $action];
}
} else {
$this->routes[$method.$uri] = ['method' => $method, 'uri' => $uri, 'action' => $action];
}
}
/**
* Parse the action into an array format.
*
* @param mixed $action
* @return array
*/
protected function parseAction($action)
{
if (is_string($action)) {
return ['uses' => $action];
} elseif (! is_array($action)) {
return [$action];
}
if (isset($action['middleware']) && is_string($action['middleware'])) {
$action['middleware'] = explode('|', $action['middleware']);
}
return $action;
}
/**
* Determine if the router currently has a group stack.
*
* @return bool
*/
public function hasGroupStack()
{
return ! empty($this->groupStack);
}
/**
* Merge the group attributes into the action.
*
* @param array $action
* @param array $attributes The group attributes
* @return array
*/
protected function mergeGroupAttributes(array $action, array $attributes)
{
$namespace = $attributes['namespace'] ?? null;
$middleware = $attributes['middleware'] ?? null;
$as = $attributes['as'] ?? null;
return $this->mergeNamespaceGroup(
$this->mergeMiddlewareGroup(
$this->mergeAsGroup($action, $as),
$middleware),
$namespace
);
}
/**
* Merge the namespace group into the action.
*
* @param array $action
* @param string $namespace
* @return array
*/
protected function mergeNamespaceGroup(array $action, $namespace = null)
{
if (isset($namespace) && isset($action['uses'])) {
$action['uses'] = $namespace.'\\'.$action['uses'];
}
return $action;
}
/**
* Merge the middleware group into the action.
*
* @param array $action
* @param array $middleware
* @return array
*/
protected function mergeMiddlewareGroup(array $action, $middleware = null)
{
if (isset($middleware)) {
if (isset($action['middleware'])) {
$action['middleware'] = array_merge($middleware, $action['middleware']);
} else {
$action['middleware'] = $middleware;
}
}
return $action;
}
/**
* Merge the as group into the action.
*
* @param array $action
* @param string $as
* @return array
*/
protected function mergeAsGroup(array $action, $as = null)
{
if (isset($as) && ! empty($as)) {
if (isset($action['as'])) {
$action['as'] = $as.'.'.$action['as'];
} else {
$action['as'] = $as;
}
}
return $action;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function head($uri, $action)
{
$this->addRoute('HEAD', $uri, $action);
return $this;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function get($uri, $action)
{
$this->addRoute('GET', $uri, $action);
return $this;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function post($uri, $action)
{
$this->addRoute('POST', $uri, $action);
return $this;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function put($uri, $action)
{
$this->addRoute('PUT', $uri, $action);
return $this;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function patch($uri, $action)
{
$this->addRoute('PATCH', $uri, $action);
return $this;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function delete($uri, $action)
{
$this->addRoute('DELETE', $uri, $action);
return $this;
}
/**
* Register a route with the application.
*
* @param string $uri
* @param mixed $action
* @return $this
*/
public function options($uri, $action)
{
$this->addRoute('OPTIONS', $uri, $action);
return $this;
}
/**
* Get the raw routes for the application.
*
* @return array
*/
public function getRoutes()
{
return $this->routes;
}
}