我需要访问Laravel在正常运行并且启动所有ServiceProviders时拥有的RouteCollection。我需要RouteCollection,因为遗留应用程序需要知道Laravel是否具有特定路由,因此如果没有,遗留代码可以处理该路由。
我想如果我能以某种方式在工匠命令中获得Illuminate\Routing\Router
,我可以简单地调用getRoutes()
函数并输出包含所有路径数组的JSON文件。然后,当遗留代码需要确定Laravel是否支持Route时,它可以读取该文件。
为了做到这一点,我需要访问Router类。不知道如何实现这一点......我查看了Illuminate\Foundation\Console\RoutesCommand
源代码,我无法弄清楚它是如何工作的。真正奇怪的是它看起来正在注入Router类,但是当我执行Artisan::resolve('MyCommand')
时,我得到一个空的RouteCollection。
修改
我从来没有弄清楚如何完成这个问题,但对于处于类似情况的人,我发现这在大多数情况下都有效,尽管我不确定开销是多么糟糕Laravel每个请求只是为了检查路线。现在看起来并不那么多。
// Start laravel, so we can see if it should handle the request
require_once(__DIR__.'/laravel/bootstrap/autoload.php');
$app = require_once(__DIR__.'/laravel/bootstrap/start.php');
$app->boot();
// Create the fake request for laravel router
$request = Request::createFromGlobals();
$request->server->set('PHP_SELF', '/laravel/public/index.php/'.$_REQUEST['modname']);
$request->server->set('SCRIPT_NAME', '/laravel/public/index.php');
$request->server->set('SCRIPT_FILENAME', __DIR__.'/laravel/public/index.php');
$request->server->set('REQUEST_URI', '/laravel/public/'.$_REQUEST['modname']);
$routes = Route::getRoutes();
foreach($routes as $route) {
if ($route->matches($request)) {
$app->run($request);
exit;
}
}
答案 0 :(得分:1)
这是一个简化的实现
JsonRoutes.php
<?php
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Illuminate\Routing\Route;
use Illuminate\Routing\Router;
class JsonRoutes extends Command {
protected $name = 'routes:json';
protected $description = 'Spits route information in JSON format.';
protected $router;
protected $routes;
public function __construct(Router $router) {
parent::__construct();
$this->router = $router;
$this->routes = $router->getRoutes();
}
public function fire() {
$result = [];
foreach ($this->routes as $route) {
$result[] = [
'methods' => implode(',', $route->methods()),
'host' => $route->domain(),
'uri' => $route->uri(),
'name' => $route->getName(),
'action' => $route->getActionName(),
];
}
$file = $this->option('file');
if ($file) {
File::put($file, json_encode($result));
return;
}
$this->info(json_encode($result));
}
protected function getArguments() { return []; }
protected function getOptions() {
return [
['file', 'f', InputOption::VALUE_OPTIONAL, 'File name.'],
];
}
}
您在artisan.php
注册:
Artisan::resolve('JsonRoutes');
样本用法:
吐出来到stdout
$ artisan routes:json [{"methods":"GET,HEAD","host":null,"uri":"\/","name":null,"action":"Closure"}]
将其写入文件
$ artisan routes:json -f /tmp/routes.json