当前位置: 首页 > 知识库问答 >
问题:

截获拉维路由

林俭
2023-03-14

我正忙于在Laravel5.1中构建一个Restful API,API版本通过头部传递。通过这种方式,我可以对功能进行版本设置,而不是复制和粘贴整个管线组并增加版本号。

我的问题是,我想有版本的方法,IE:

public function store_v1 (){  }

我已经在我的路由中添加了一个中间件,在那里我从标题中捕获版本,但是现在需要修改请求以从控制器中选择正确的方法。

app/Http/routes.php

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

app/Http/Middleware/ApiVersionMiddleware.php

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

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

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

不管怎样,这就是理论。

有什么想法,我将如何注入行动路线?

共有2个答案

易俊远
2023-03-14

另一种方法是在公用文件夹中创建指向公用文件夹的符号链接。使用中间件读取url并设置全局配置,该配置可在控制器中用于确定要显示的内容。虽然不理想,但效果很好。

胡霖
2023-03-14

我认为中间件可能不是最好的地方。您可以访问该路由,但它不提供修改将要调用的控制器方法的途径。

更简单的选择是注册一个自定义路由调度器,该调度器处理基于请求和路由调用控制器方法的逻辑。可能是这样的:

<?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);
}

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

 类似资料:
  • Laravel 4.1的路由有些问题 我在url:/AppFastFood/webapp/public/users/profile上有一个页面,负责编辑和更新当前用户。 我有一个页面管理用户,索引作品好在url: /AppFastFood/webapp/public/users 仅更改用户角色的页面为/AppFastFood/webapp/public/users/1/edit,无法显示此页面,我

  • 我有个急事。我第一次尝试使用Laravel。为此,我使用Wamp。我不知道这是否重要,但我将wamp的DocumentRoot设置在以下地址: 我在一个名为Sites的文件夹中为许多不同的网站使用wamp。当我访问其中一个站点时,我会转到:localhost/Sites/thewebsite。所以我真正想做的就是去掉Laravel网站路径中的公共文件夹。 就目前而言,我做到了: > 更改httpd

  • 所以我正在尝试为我的网站实现一个支付解决方案,经过相当多的研究,我仍然缺乏一个完整的解决方案。我正在运行Laravel 5.0,需要一般购物车付款功能。我想我会发布这篇文章,试图创建一个参考,以帮助其他可能有这个问题的人。我已经把测试事务放到了Paypal的沙箱中,这似乎是砖墙的所在,但是一个完整的概述会很有帮助。我将列出我需要克服的问题,以便解决一些问题。 完成支付解决方案实施需要解决的问题 >

  • 例如,我们可能希望一些路线只有在用户登录或接受条款和条件后才可访问。 我们可以使用路由哨兵来检查这些条件并控制对路由的访问。 路由哨兵还可以控制用户是否可以离开某个路由。 例如,假设用户已将信息键入页面上的表单,但尚未提交表单。 如果这时离开页面,他们将丢失信息。 如果用户尝试离开路由而不是提交或保存信息,我们可以提示用户。 Angular 提供了五种路由拦截哨兵: CanActive 激活拦截

  • 我的应用程序不想进入我的游戏控制器。php函数。它确实在group函数中,我用vardump对其进行了测试。它会一直走下去,直到它撞上“游戏”路线,然后它就不想走这条路线。 routes.php: GameController.php: AuthenticationController。php: 目标是当我的用户登录时转到游戏页面,这是因为Laravel会话cookie已经制作完成(我检查过),我

  • 我在Travis上构建Symfony 3.2项目时遇到了一些问题。下载所有依赖项后,它会给我以下错误消息: Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache无法打开输入文件:应用程序/控制台脚本Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::cle