Laravel 5.0.*中间件,用于在处理路由之前从url中删除前缀区域设置

Laravel 5.0.*中间件,用于在处理路由之前从url中删除前缀区域设置,laravel,routes,middleware,Laravel,Routes,Middleware,我正在寻找一种方法,使所有的应用程序路由有多个地区,而不使用路由组。这是因为我使用了一个外部扩展包,这意味着路由在许多地方注册 基本上,我希望/foo/bar以及/en/foo/bar、/de/foor/bar、/es/foo/bar等都能通过/foot/bar路径识别和处理 Route::get('foo/bar', function () { return App::getLocale() . ' result'; }); 因此,上面给出的结果是“en result”或“de

我正在寻找一种方法,使所有的应用程序路由有多个地区,而不使用路由组。这是因为我使用了一个外部扩展包,这意味着路由在许多地方注册

基本上,我希望/foo/bar以及/en/foo/bar、/de/foor/bar、/es/foo/bar等都能通过/foot/bar路径识别和处理

 Route::get('foo/bar', function () {
     return App::getLocale() . ' result';
 });
因此,上面给出的结果是“en result”或“de result”或“es result”

我已经有了基于路径段设置语言环境的中间件。我尝试了以下方法,但没有成功

   ...
   $newPath =  str_replace($locale,'',$request->path());

   $request->server->set('REQUEST_URI',$new_path);

 }

 return $next($request);
希望这是可能的,或者有其他方法实现它

编辑------

根据下面的一条评论,我通过将以下代码添加到public/index.php中,很快对其进行了黑客攻击。希望这能更好地了解我试图通过编辑请求对象来实现的目标

$application_url_segments = explode( '/', trim( $_SERVER["REQUEST_URI"], '/' ) );

$application_locale = $application_url_segments[0];

$application_locales = ['en' => 'English', 'de' => 'German'];

if ( array_key_exists( $application_locale, $application_locales ) ) {

    $_SERVER["REQUEST_URI"] = str_replace( '/' . $application_locale,'',$_SERVER["REQUEST_URI"] );

}

你可以通过提前一点连接到应用程序来轻松实现这一点。创建一个ServiceProvider,创建一个
register
方法,并将您的逻辑放在其中

<?php namespace App\Providers;

use Illuminate\Support\ServiceProviders;
use Illuminate\Support\Facades\Request;

class LocaleServiceProvider extends ServiceProvider {

    // Fires during the registration of this ServiceProvider :)
    public function register(Request $request) {

        // Altar the Request object here
        // ...
        // ...

    }
}

以下是在调用路由之前编辑URL的正确代码

<?php namespace App\Providers;
use Illuminate\Foundation\Application;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Request;

class LanguageServiceProvider extends ServiceProvider {
    public function register() {
      Request::instance()->server->set('REQUEST_URI',"/uri/");
    }
}

在我使用5.5时,这些都不起作用。这种方法很好,但对我来说,请求参数没有被注入到
寄存器
方法中,同样地
实例()
也不是静态方法,不应该这样调用

但是,使用服务容器获取
请求
的实例,可以在ServiceProviders
register
方法中解析请求路径之前更改请求路径:

public function register()
{
  $this->app->make('Illuminate\Http\Request')->instance()->server->set('REQUEST_URI',"/what/ever/");
}
我希望这能帮助别人

干杯

编辑:牧师的回答在技术上更为正确,因为他使用了门面而不是实际的类。但是,这两种方法的注入都不适用于
寄存器
,但您也可以使用:

use \Illuminate\Support\Facades\Request
//...
public function register()
{
  Request::instance()->server->set('REQUEST_URI',"/what/ever/");
}

我个人找不到任何东西可以轻松地做你想要做的事。虽然我可能错过了一些东西,但我浏览了laravel和symfonys的请求类。不幸的是,我没有发现任何有价值的东西。也就是说,您可以截取公用文件夹中index.php文件中的请求,然后在创建请求对象之前设置
$\u SERVER[“request\u URI”]
,然后它就会工作。我很快在index.php文件中尝试了一些方法,这意味着我可以在服务器变量到达Laravel之前对其进行编辑。然而,我认为我需要更好的东西,因为我使用本地配置等,我面临着同样的问题,我也无法让它工作。似乎
请求
对象是不可变的。我在index.php中也设置了一个快速的hack,但我也使用了locale等的URI,所以仍在研究中。这不起作用。由于以下错误,我收到了一个错误LocaleServiceProvider::register(illumb\Http\Request$Request)必须与illumb\Support\ServiceProvider::register()兼容我已使用构造函数传入应用程序实例并使用$app->Request。然而,我仍然无法让它真正改变任何事情。路由仍在处理中,sameI已对上述原始问题/细节进行了编辑,如果这有助于在Lumen中实现这一点?Tom C,我已在Laravel 5.8.36中尝试过这一点,而当服务器变量中的请求URI发生更改时,路由器不会接收更改的路由。有什么想法吗??