1

所以昨天我完成了大部分工作,现在我正处于能够通过中间件修改语言环境(用于 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')}},

现在我没有收到“您处于离线状态”错误,但仍然没有修改语言环境..

4

0 回答 0