在尝试给路由添加新的设置区域设置前缀时遇到了一个问题。 当我从控制器或路由闭包中返回app()-> getLocale()时,它会正确返回新的设置语言环境,但是当我将其放在Route前缀中时,会得到默认的'en'。在我的情况下,新的语言环境为“ ar”。
这是我在web.php中的代码
<?php
//Request to put the choosen locale into the session
Route::get('locale/{locale}', function($locale) {
session()->put('userLocale', $locale);
return redirect(app()->getLocale());
});
//Group of routes that are supposed to be prefixed with new set locale 'ar'
Route::group(['prefix' => app()->getLocale(), 'middleware' => 'locale'], function() {
Route::get('/', function() {
return app()->getLocale();
});
});
这是中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
class Locale
{
protected $app;
public function __construct(Application $app)
{
$this->app = $app;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$this->app->setLocale(session('userLocale'));
return $next($request);
}
}
请注意Route前缀内的语句“ app()-> getLocale()”,该语句的值始终为“ en”。但是,当我从闭包内部返回它时,它会打印新的设置语言环境“ ar”。
我要说的是,在前缀内部,app()-> getLocale()的值始终为“ en”,但在Closure中,其值为“ ar”。
因此,当我在浏览器中运行“ localehost:8000 / locale / ar”时,输出为“ ar”,这是正确的,但URL变为“ localehost:8000 / en”,并且应为“ localehost:8000 / ar” “是吗?当我在浏览器中运行“ localehost:8000 / ar”时,我得到一个404页面。
我尝试从 RouteServiceProvider的mapWebRoutes方法中设置前缀,但是它不起作用,因为我认为服务提供商在中间件软件之前执行,因此无法识别新的语言环境由中间件设置。
我希望获得帮助或使用新的语言环境为路由添加前缀的另一种方法,因为也许我做错了。
答案 0 :(得分:0)
在中间件运行之前,不会从会话设置您的语言环境。您的路由必须在中间件运行之前定义,否则,系统将不知道哪个中间件应该在哪些路由上运行。
由于app()-> locale()在中间件运行之前将返回“ en”,因此您所做的所有代码都定义了“ en”的前缀。
似乎您想为语言环境定义一个变量,在这种情况下,您将执行以下操作:
Route::group(['prefix' => '{locale}', 'middleware' => 'locale'], function() {
...
});
这样的程序包为您处理本地化的url。
答案 1 :(得分:0)
制作一个名为 SetLocale 的中间件,如下所示,并在 kernel.php 文件中注册:
public function handle($request, Closure $next)
{
$desiredLocale=$request->segment(1);
in_array($desiredLocale, ["en", "ar"]) ? app()->setLocale($desiredLocale) : app()->setLocale('en');
return $next($request);
}
在 kernel.php 中添加 $routeMiddleware 数组,如下所示:
'local.set'=>\App\Http\Middleware\SetLocale::class,
现在,您可以像这样将其应用于所有路线:
Route::group(['prefix' => '{locale}','middleware' => 'local.set'], function () {
......
});