php - 拦截 Laravel 路由

标签 php laravel laravel-5 laravel-routing laravel-middleware

我正忙于在 Laravel 5.1 中构建一个 Restful API,其中 API 版本通过 header 传递。这样我就可以对功能进行版本控制,而不是复制和粘贴整个路由组并增加版本号。

我遇到的问题是我想要版本控制方法,IE:

public function store_v1 (){  }

我在我的路由上添加了一个中间件,用于从 header 捕获版本,但现在需要修改请求以从 Controller 中选择正确的方法。

应用程序/Http/routes.php

Route::group(['middleware' => ['apiversion']], function()
{
    Route::post('demo', 'DemoController@store');
}

应用/Http/Middleware/ApiVersionMiddleware.php

public function handle($request, Closure $next)
{
    $action = app()->router->getCurrentRoute()->getActionName();

    //  dd($action)
    //  returns "App\Http\Controllers\DemoController@store"
}

从这里开始,我会将 header 版本附加到 $action,然后通过 $request 传递它,以便它到达正确的方法。

好吧,这就是理论。

关于如何将 Action 注入(inject)路线有什么想法吗?

最佳答案

我认为中间件可能不是最好的选择。您有权访问路由,但它不提供修改将调用的 Controller 方法的途径。

更简单的选择是注册一个自定义路由调度程序,它根据请求和路由处理调用 Controller 方法的逻辑。它可能看起来像这样:

<?php

class VersionedRouteDispatcher extends Illuminate\Routing\ControllerDispatcher {
  public function dispatch(Route $route, Request $request, $controller, $method)
  {
    $version = $request->headers->get('version', 'v1'); // take version from the header
    $method = sprintf('%s_%s', $method, $version); // create target method name
    return parent::dispatch($route, $request, $controller, $method); // run parent logic with altered method name
  }
}

一旦您有了这个自定义调度程序,就在您的 AppServiceProvider 中注册它:

public function register() {
  $this->app->singleton('illuminate.route.dispatcher', VersionedRouteDispatcher::class);
}

这样您将用您自己的路由调度程序覆盖默认路由调度程序,该路由调度程序将使用从请求 header 获取的版本作为后缀 Controller 方法名称。

关于php - 拦截 Laravel 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31543301/

相关文章:

php - 使用邮件时找不到类 'PhpParser\Parser\Php7' Laravel

php - 添加 WHERE YEAR 中断计算

php html 下拉到 mysql

php - 从传入的 PHP 请求中获取自定义授权 header

php - Laravel Eloquent 连接不相关的表?

php - 字段 'user_id' 没有默认值

php - 在 laravel 5.5 中,此集合实例上不存在属性 [id]

php - Laravel 5 eloquent 的 CONCAT 列

mysql - Laravel 5 - 将 MySQL 数据从开发传输到暂存/生产

javascript - 将搜索输入和结果合并为一个输入和一个结果