如何通过artisan命令访问路由器?

时间:2014-07-19 01:38:29

标签: php laravel

我需要访问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;
    }
}

1 个答案:

答案 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