由于客户的需要,我无法使用本地化前缀。我正在尝试将语言环境数据存储到会话中,并根据该“语言环境”对我的路线进行分组。但我无法访问 web.php 中的会话数据。
$locale = Session::get('locale');
if($locale == 'tr') {
Route::get('/kurumsal/{slug}', 'App\Http\Controllers\CorporateController@index')->name('corporate');
} elseif ($locale == 'eng){
Route::get('/corporate/{slug}', 'App\Http\Controllers\CorporateController@index')->name('corporate');
}
语言控制器中间件
class LanguageController extends Controller
{
public function index($locale = ''){
if ($locale == '') {
Session::put('locale', 'eng');
} else {
Session::put('locale', $locale);
}
return redirect()->back();
}
}
答案 0 :(得分:1)
对于从会话中获取数据,您可以使用
$value = $request->session()->get('your-key-name');
但我不确定它是否适用于 Web.php ..!!但是你可以在 Controller、Middelware 等更多地方使用这个。
有关详细信息,请参阅 Laravel Official Documentation
答案 1 :(得分:1)
如果没有冲突,您不需要有条件地设置路由。
以下工作正常:
Route::get('/kurumsal/{slug}', 'App\Http\Controllers\CorporateController@index')->name('corporate');
Route::get('/corporate/{slug}', 'App\Http\Controllers\CorporateController@index')->name('corporate');
如果您想限制访问非本地化路由,那么您确实需要会话访问权限,但您可以通过 middleware 获得,例如:
class LocaleRestricted {
public function handle($request, $next, ...$localesAllowed) {
if (!in_array(Session::get('locale'), $localesAllowed)) {
abort(404, 'This route is not available for this locale');
}
return $next($request);
}
}
然后您需要在您的 app/Http/Kernel.php
中注册此语言环境:
// ...
protected $routeMiddleware = [
// ...
'locale_restricted' => LocaleRestricted::class
];
然后您可以将其用作:
$locale = Session::get('locale');
Route::middleware('locale_restricted:tr')->group(function () {
Route::get('/kurumsal/{slug}', 'App\Http\Controllers\CorporateController@index')->name('corporate');
});
Route::middleware('locale_restricted:eng')->group(function () {
Route::get('/corporate/{slug}', 'App\Http\Controllers\CorporateController@index')->name('corporate');
});