我正在寻找一种方法,让所有应用路由都有多个语言环境而不使用路由组。这是因为我使用外部扩展包,这意味着路由在很多地方注册。
基本上我想要/ 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"] );
}
答案 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/");
}