-
Notifications
You must be signed in to change notification settings - Fork 11.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #16647 from JosephSilber/route-registrar
[5.4] Allow routes to be registered fluently
- Loading branch information
Showing
9 changed files
with
460 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
<?php | ||
|
||
namespace Illuminate\Routing; | ||
|
||
use Closure; | ||
use BadMethodCallException; | ||
|
||
class RouteRegistrar | ||
{ | ||
/** | ||
* The router instance. | ||
* | ||
* @var \Illuminate\Routing\Router | ||
*/ | ||
protected $router; | ||
|
||
/** | ||
* The attributes to pass on to the router. | ||
* | ||
* @var array | ||
*/ | ||
protected $attributes = []; | ||
|
||
/** | ||
* The methods to dynamically pass through to the router. | ||
* | ||
* @var array | ||
*/ | ||
protected $passthru = [ | ||
'get', 'post', 'put', 'patch', 'delete', 'options', 'any', | ||
]; | ||
|
||
/** | ||
* The attributes that can be set through this class. | ||
* | ||
* @var array | ||
*/ | ||
protected $allowedAttributes = [ | ||
'as', 'domain', 'middleware', 'name', 'namespace', 'prefix', | ||
]; | ||
|
||
/** | ||
* The attributes that are aliased. | ||
* | ||
* @var array | ||
*/ | ||
protected $aliases = [ | ||
'name' => 'as', | ||
]; | ||
|
||
/** | ||
* Create a new route registrar instance. | ||
* | ||
* @param \Illuminate\Routing\Router $router | ||
* @return void | ||
*/ | ||
public function __construct(Router $router) | ||
{ | ||
$this->router = $router; | ||
} | ||
|
||
/** | ||
* Set the value for a given attribute. | ||
* | ||
* @param string $key | ||
* @param mixed $value | ||
* @return $this | ||
*/ | ||
public function attribute($key, $value) | ||
{ | ||
$this->attributes[array_get($this->aliases, $key, $key)] = $value; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Route a resource to a controller. | ||
* | ||
* @param string $name | ||
* @param string $controller | ||
* @param array $options | ||
* @return void | ||
*/ | ||
public function resource($name, $controller, array $options = []) | ||
{ | ||
$this->router->resource($name, $controller, $this->attributes + $options); | ||
} | ||
|
||
/** | ||
* Create a route group with shared attributes. | ||
* | ||
* @param \Closure $callback | ||
* @return void | ||
*/ | ||
public function group($callback) | ||
{ | ||
$this->router->group($this->attributes, $callback); | ||
} | ||
|
||
/** | ||
* Register a new route with the given verbs. | ||
* | ||
* @param array|string $methods | ||
* @param string $uri | ||
* @param \Closure|array|string|null $action | ||
* @return \Illuminate\Routing\Route | ||
*/ | ||
public function match($methods, $uri, $action = null) | ||
{ | ||
return $this->router->match($methods, $uri, $this->compileAction($action)); | ||
} | ||
|
||
/** | ||
* Register a new route with the router. | ||
* | ||
* @param string $method | ||
* @param string $uri | ||
* @param \Closure|array|string|null $action | ||
* @return \Illuminate\Routing\Route | ||
*/ | ||
protected function registerRoute($method, $uri, $action = null) | ||
{ | ||
if (! is_array($action)) { | ||
$action = array_merge($this->attributes, $action ? ['uses' => $action] : []); | ||
} | ||
|
||
return $this->router->{$method}($uri, $this->compileAction($action)); | ||
} | ||
|
||
/** | ||
* Compile the action into an array including the attributes. | ||
* | ||
* @param \Closure|array|string|null $action | ||
* @return array | ||
*/ | ||
protected function compileAction($action) | ||
{ | ||
if (is_null($action)) { | ||
return $this->attributes; | ||
} | ||
|
||
if (is_string($action) || $action instanceof Closure) { | ||
$action = ['uses' => $action]; | ||
} | ||
|
||
return array_merge($this->attributes, $action); | ||
} | ||
|
||
/** | ||
* Dynamically handle calls into the route registrar. | ||
* | ||
* @param string $method | ||
* @param array $parameters | ||
* @return \Illuminate\Routing\Route|$this | ||
*/ | ||
public function __call($method, $parameters) | ||
{ | ||
if (in_array($method, $this->passthru)) { | ||
return $this->registerRoute($method, ...$parameters); | ||
} | ||
|
||
if (in_array($method, $this->allowedAttributes)) { | ||
return $this->attribute($method, $parameters[0]); | ||
} | ||
|
||
throw new BadMethodCallException("Method [{$method}] does not exist."); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.