所以昨天我完成了大部分工作,现在我正处于能够通过中间件修改语言环境(用于 Laravel 5 中的语言)的最后阶段。
过程如下:
用户从下拉菜单中选择一种语言,单击的值通过 Ajax 传递给控制器,控制器修改其语言环境。但这并没有结束。在通过过滤器制作之前。现在是中间件。我对中间件做了很多发现,我将在这里介绍。最后一个阶段仍然没有做出预期的改变:
完整代码
HTML
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Pick Language<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="{{URL::route('index')}}" class="choose-language" id="french" data-value="fr">Français</a></li>
<li><a href="{!!URL::route('index')!!}" class="choose-language" id="english" data-value="en">English</a></li>
<li><a href="{{URL::route('index')}}" class="choose-language" id="spanish" data-value="es">Castellano</a></li>
<li><a href="{{URL::route('index')}}" class="choose-language" id="german" data-value="de">Deutsch</a></li>
<li><a href="{{URL::route('index')}}" class="choose-language" id="russian" data-value="ru">русский</a></li>
</ul>
</li>
查询
<script>
$(document).ready(function () {
$('.choose-language').on('click', function () {
var selectedlanguage = $(this).data('value');
$.ajax({
url: 'languagechooser',
data: { 'locale' : selectedlanguage},
timeout:3000,
type: "post",
cache: false,
success: function (savingStatus) {
console.log(savingStatus);
},
error: function (xhr, ajaxOptions, thrownError) {
$('#errores').text("Error .");
}
});
});
});
控制器
public function languagechooser()
{
\Session::set('locale', \Input::get('locale'));
}
中间件(可能是错误所在)
<?php namespace App\Http\Middleware;
use Closure;
class Language {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
app()->setLocale(\Session::get('locale'));
return $next($request);
}
}
更新:
在荷兰 Luceo 的有益评论之后,我取得了积极进展。
我已经在 Kernel.php 的受保护的 $middleware 中注册了该类我已经添加了:在我的控制器类的顶部使用 App\Http\Middleware\Language。但我现在从 Jquery Ajax 收到错误消息,当它无法在控制器上完成工作时,它返回我“错误”
我不知道错误现在是否在 Ajax 中,或者中间件是否有未决的东西。
中间件内核.PHP
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
'App\Http\Middleware\VerifyCsrfToken',
-----> 'App\Http\Middleware\Language',
更新二
为了查明 Ajax 错误,我用这个提供了更多细节的错误函数替换了错误函数。错误说(我离线),但我不是,所以控制器和中间件之间的某些连接似乎误导了 Ajax,或者控制器必须返回 Ajax 期望的内容。
error:function(x,e){
if(x.status==0){
alert('You are offline!!\n Please Check Your Network.');
}else if(x.status==404){
alert('Requested URL not found.');
}else if(x.status==500){
alert('Internel Server Error.');
}else if(e=='parsererror'){
alert('Error.\nParsing JSON Request failed.');
}else if(e=='timeout'){
alert('Request Time out.');
}else {
alert('Unknow Error.\n'+x.responseText);
}
}
路线文件
Route::post('home', array(
'as' =>'languagechooser',
'uses' =>'LanguageController@languagechooser'
));
更新三
我在 Ajax 中修改了 URL 并改为这样写:
url: {{URL::route('languagechooser')}},
现在我没有收到“您处于离线状态”错误,但仍然没有修改语言环境..