|
<?php namespace App\Console\Commands; |
|
|
|
use Illuminate\Http\Request; |
|
use Illuminate\Routing\Route; |
|
use Illuminate\Routing\Router; |
|
use Illuminate\Console\Command; |
|
use Symfony\Component\Console\Input\InputOption; |
|
|
|
class RouteListFilterCommand extends Command { |
|
|
|
/** |
|
* The console command name. |
|
* |
|
* @var string |
|
*/ |
|
protected $name = 'route:list-filter'; |
|
|
|
/** |
|
* The console command description. |
|
* |
|
* @var string |
|
*/ |
|
protected $description = 'List all registered filters on routes'; |
|
|
|
/** |
|
* The router instance. |
|
* |
|
* @var \Illuminate\Routing\Router |
|
*/ |
|
protected $router; |
|
|
|
/** |
|
* An array of all the registered routes. |
|
* |
|
* @var \Illuminate\Routing\RouteCollection |
|
*/ |
|
protected $routes; |
|
|
|
/** |
|
* The table headers for the command. |
|
* |
|
* @var array |
|
*/ |
|
protected $headers = array( |
|
'Domain', 'URI', 'Name', 'Action', 'Before Filters', 'After Filters' |
|
); |
|
|
|
|
|
/** |
|
* Create a new route command instance. |
|
* |
|
* @param \Illuminate\Routing\Router $router |
|
* @return void |
|
*/ |
|
public function __construct(Router $router) |
|
{ |
|
parent::__construct(); |
|
|
|
$this->router = $router; |
|
$this->routes = $router->getRoutes(); |
|
} |
|
|
|
/** |
|
* Execute the console command. |
|
* |
|
* @return void |
|
*/ |
|
public function fire() |
|
{ |
|
if (count($this->routes) == 0) |
|
{ |
|
return $this->error("Your application doesn't have any routes."); |
|
} |
|
|
|
$this->displayRoutes($this->getRoutes()); |
|
} |
|
|
|
/** |
|
* Get the console command options. |
|
* |
|
* @return array |
|
*/ |
|
protected function getOptions() |
|
{ |
|
return array( |
|
array('name', null, InputOption::VALUE_OPTIONAL, 'Filter the routes by name.'), |
|
|
|
array('path', null, InputOption::VALUE_OPTIONAL, 'Filter the routes by path.'), |
|
); |
|
} |
|
|
|
/** |
|
* Compile the routes into a displayable format. |
|
* |
|
* @return array |
|
*/ |
|
protected function getRoutes() |
|
{ |
|
$results = array(); |
|
|
|
foreach ($this->routes as $route) |
|
{ |
|
$results[] = $this->getRouteInformation($route); |
|
} |
|
|
|
return array_filter($results); |
|
} |
|
|
|
/** |
|
* Get the route information for a given route. |
|
* |
|
* @param string $name |
|
* @param \Illuminate\Routing\Route $route |
|
* @return array |
|
*/ |
|
protected function getRouteInformation(Route $route) |
|
{ |
|
$uri = implode('|', $route->methods()).' '.$route->uri(); |
|
|
|
return $this->filterRoute(array( |
|
'host' => $route->domain(), |
|
'uri' => $uri, |
|
'name' => $route->getName(), |
|
'action' => $route->getActionName(), |
|
'before' => $this->getBeforeFilters($route), |
|
'after' => $this->getAfterFilters($route) |
|
)); |
|
} |
|
|
|
/** |
|
* Display the route information on the console. |
|
* |
|
* @param array $routes |
|
* @return void |
|
*/ |
|
protected function displayRoutes(array $routes) |
|
{ |
|
$this->table($this->headers, $routes); |
|
} |
|
|
|
/** |
|
* Get before filters |
|
* |
|
* @param \Illuminate\Routing\Route $route |
|
* @return string |
|
*/ |
|
protected function getBeforeFilters($route) |
|
{ |
|
$before = array_keys($route->beforeFilters()); |
|
|
|
$before = array_unique(array_merge($before, $this->getPatternFilters($route))); |
|
|
|
return implode(', ', $before); |
|
} |
|
|
|
/** |
|
* Get all of the pattern filters matching the route. |
|
* |
|
* @param \Illuminate\Routing\Route $route |
|
* @return array |
|
*/ |
|
protected function getPatternFilters($route) |
|
{ |
|
$patterns = array(); |
|
|
|
foreach ($route->methods() as $method) |
|
{ |
|
// For each method supported by the route we will need to gather up the patterned |
|
// filters for that method. We will then merge these in with the other filters |
|
// we have already gathered up then return them back out to these consumers. |
|
$inner = $this->getMethodPatterns($route->uri(), $method); |
|
|
|
$patterns = array_merge($patterns, array_keys($inner)); |
|
} |
|
|
|
return $patterns; |
|
} |
|
|
|
/** |
|
* Get the pattern filters for a given URI and method. |
|
* |
|
* @param string $uri |
|
* @param string $method |
|
* @return array |
|
*/ |
|
protected function getMethodPatterns($uri, $method) |
|
{ |
|
return $this->router->findPatternFilters(Request::create($uri, $method)); |
|
} |
|
|
|
/** |
|
* Get after filters |
|
* |
|
* @param \Illuminate\Routing\Route $route |
|
* @return string |
|
*/ |
|
protected function getAfterFilters($route) |
|
{ |
|
return implode(', ', array_keys($route->afterFilters())); |
|
} |
|
|
|
/** |
|
* Filter the route by URI and / or name. |
|
* |
|
* @param array $route |
|
* @return array|null |
|
*/ |
|
protected function filterRoute(array $route) |
|
{ |
|
if (($this->option('name') && ! str_contains($route['name'], $this->option('name'))) || |
|
$this->option('path') && ! str_contains($route['uri'], $this->option('path'))) |
|
{ |
|
return null; |
|
} |
|
|
|
return $route; |
|
} |
|
|
|
} |
Yet in core for Laravel > 5 https://github.com/laravel/framework/blob/5.0/src/Illuminate/Foundation/Console/RouteListCommand.php https://stillat.com/blog/2016/12/07/laravel-artisan-route-command-the-routelist-command