在laravel 5.1路由拦截它之前更改get url

时间:2015-12-16 01:49:27

标签: url-rewriting routing laravel-5.1 pretty-print

在最终掌握了Laravel的关键部分后,我准备重构我的所有程序代码。

我有一个问题,其他一些程序使用以下网址:

  

http://my.domain.com/somecode.php?something=a&somethingelse=b

现在我了解到,laravel路线看起来像:

  

http://my.domain.com/somecode/something/a/somethingelse/b

如何在laravel中或在调用laravel路径之前拦截旧式url并将其翻译以便路由可以处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

只要您只使用GET执行此操作,就可以使用中间件来解决您的问题。

创建中间件

php artisan make:middleware RedirectIfOldUrl

......或者你想称之为的任何东西。

将定义添加到app/Http/Kernel.php

\App\Http\Middleware\RedirectIfOldUrl::class,添加到$middleware数组(而不是$routeMiddleware)数组。

这将导致在每次请求时调用中间件。

处理请求

public function handle($request, Closure $next)
{

    if (str_contains($request->getRequestUri(), '.php?')) {

        //Remove .php from the request url
        $url = str_replace('.php', '', $request->url());

        foreach ($request->input() as $key => $value) {

            $url .= "/{$key}/{$value}";
        }

        return redirect($url);
    }

    return $next($request);
}

以上是一个非常基本的实现或您在问题中提到的内容。您可能需要调整逻辑以使其完全适合您的应用程序,但它应该指向正确的方向。

希望这有帮助!

答案 1 :(得分:0)

我设法在Laravel 6.2中使用此中间件重写了路径,并将其添加到<?php namespace App\Http\Middleware; use Closure; class Localize { public function handle($request, Closure $next) { if(substr($_SERVER['REQUEST_URI'], 0, 4 ) === "/es/" || $_SERVER['REQUEST_URI'] === "/es") { $request->server->set('REQUEST_URI', substr($_SERVER['REQUEST_URI'], 4)); app()->setLocale('es'); } return $next($request); } }

$request->server->get('REQUEST_URI')

如果您尝试使用:{{1}}的set命令无法正常工作,我猜想对get()的调用会导致某种形式的缓存。