所以昨天我完成了大部分工作,现在我处于能够通过中间件修改Locale(在Laravel 5中使用语言)的最后阶段。
该过程如下:
用户从下拉菜单中选择一种语言,这个点击的值通过Ajax传递给Controller,控制器修改其语言环境。但它并没有在这里结束。在它通过过滤器之前。现在它是中间件。我已经做了很多关于中间件的发现,我将在这里包括。最后一个阶段还没有做出预期的改变:
完整代码
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>
JQUERY
<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 .");
}
});
});
});
CONTROLLER
public function languagechooser()
{
\Session::set('locale', \Input::get('locale'));
}
MIDDLEWARE(可能是错误的地方)
<?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得到Error的消息,当它无法在控制器上完成它的工作时,它返回我&#34;错误&#34;
我不知道错误现在是在Ajax中还是在中间件上有待处理的事情。
MIDDLEWARE KERNEL.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',
更新II
为了查明Ajax错误,我用这个替换了错误函数,它提供了更多细节。错误说(我离线),我不是,因此控制器和中间件之间的某些连接似乎误导了Ajax,或者Controller必须返回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'
));
更新III
我修改了Ajax中的URL并改为编写:
url: {{URL::route('languagechooser')}},
现在我没有得到#34;你离线&#34;错误,但仍未修改语言环境..