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

时间:2016-01-18 23:08:05

标签: laravel routes middleware

我正在寻找一种方法,让所有应用路由都有多个语言环境而不使用路由组。这是因为我使用外部扩展包,这意味着路由在很多地方注册。

基本上我想要/ foo / bar以及/ en / foo / bar,/ de / foor / bar,/ es / foo / bar等都可以通过/ foot / bar route识别和处理< / p>

 Route::get('foo/bar', function () {
     return App::getLocale() . ' result';
 });

所以上面会给我结果&#39;或者结果&#39;或者&#39;结果&#39;。

我已经有中间件根据路径段设置区域设置。我试过以下没有运气。

   ...
   $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"] );

}

3 个答案:

答案 0 :(得分:2)

以下是在调用路由之前编辑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/");
    }
}

要注意,从Request实例获取路径而不首先复制它将由于某种原因导致REQUEST_URI不可编辑。我假设代码库中的某个地方laravel在调用path()方法时初始化请求。

答案 1 :(得分:1)

您可以通过更早地连接到应用程序来轻松实现此目的。创建一个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
        // ...
        // ...

    }
}

答案 2 :(得分:0)

5.5这对我来说实际上没有任何效果。方法很好,但对我来说,请求参数没有注入register方法,同样instance()不是静态方法,不应该这样调用。

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

public function register()
{
  $this->app->make('Illuminate\Http\Request')->instance()->server->set('REQUEST_URI',"/what/ever/");
}

我希望这有助于某人!

干杯

编辑:牧师的回答在技术上更正确,因为他使用Facade而不是实际的Class。但是,注入既不适用于register,也可以使用:

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