Ajax 检索错误不起作用 Laravel

Posted

技术标签:

【中文标题】Ajax 检索错误不起作用 Laravel【英文标题】:Ajax retrieving errors not working Laravel 【发布时间】:2019-11-04 17:54:34 【问题描述】:

当用户填写使用 ajax 提交的表单时,我正在尝试检索错误。我正在关注这个tutorial。尽管我认为逻辑应该是正确的,但我没有得到预期的结果。 这是我的刀片视图代码:

@extends('layouts.layout')

@section('title','Soumettre thématique')
@section('content')
<body>

<div class="container_fluid">
<div class="row">
<div class="alert alert-danger print-error-msg" style="display: none;">
@if($errors->any())
<ol style="color: red">
@foreach($errors->all() as $error)
<li>
  $error
</li>
@endforeach
</ol>
@endif
</div>
</div>
</div>
    <form method="POST" action=" route('themes.store') ">
        @csrf
        <!-- Intitulé du thème -->
        <input type="text" name="intitule" id="intitule" placeholder="Intitulé du thème" required><br>
        <!-- Catégorie -->
        <select name="categorie" required>
            <option value="">-- Catégorie --</option>
            <option value="web">Développement web</option>
            <option value="appMobile">Programmation application mobile</option>
            <option value="secure">Sécurisation</option>
            <option value="other">Autre</option>
        </select> <br>
        <!-- Filière désirée -->
        <input type="checkbox" name="filiere[]" id="GL" value="GL" required>
        <label for="GL">Génie Logiciel</label><br>
        <input type="checkbox" name="filiere[]" id="SI" value="SI" required>
        <label for="SI">Sécurité Informatique</label><br>
        <input type="checkbox" name="filiere[]" id="IM" value="IM" required>
        <label for="IM">Internet et Multimédia</label><br>
        <input type="checkbox" name="filiere[]" id="SIRI" value="SIRI" required>
        <label for="SIRI">Systèmes d'Information et Réseaux Informatiques</label><br>
        <!-- Descriptif -->
        <textarea name="description" id="description" placeholder="Description de la thématique" required>old('description') </textarea><br>

        <input type="submit" name="submit" id="submit" value="Ajouter">
        <span id="error-message" class="text-danger"></span>
        <span id="success-message" class="text-success"></span>
    </form>

<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
    <script type="text/javascript">
        $(function ()
            var itsChecked = null;
            $('input[type=checkbox]').on('click', function()
                if($('input[type=checkbox]:checked').length > 0) //S'il y a au moins 1 ([...].length > 0) ckecked
                // alert('At least one is checked');
                    $('#GL').removeAttr("required");
                    $('#SI').removeAttr("required");
                    $('#IM').removeAttr("required");
                    $('#SIRI').removeAttr("required");
                
                else if(!$('input[type=checkbox]:checked').length > 0) //S'il n'y a aucun checked (!(at least 1)>0)
                // alert('None is checked');
                    $('#GL').attr('required','');
                    $('#SI').attr('required','');
                    $('#IM').attr('required','');
                    $('#SIRI').attr('required','');

            
            );

            $('#submit').on('click',function(e)
                e.preventDefault();

                var _token = $("input[name='_token']").val();
                var intitule = $("input[name='intitule']").val();
                var categorie = $("select[name='categorie']").val();
                var filiereChecked = [];
                $.each($("input[type='checkbox']:checked"), function()            
                filiereChecked.push($(this).val());
                );
                var filiere = filiereChecked.join(", ");
                var filiere = filiere.toString();

                $.ajax(
                    url: "route('themes.store')",
                    type: 'POST',
                    data: 
                        _token:_token,
                        intitule:intitule,
                        categorie:categorie,
                        filiere:filiere
                    ,
                    success: function(data)
                        if($.isEmptyObject(data.error))
                            alert(data.success);
                        
                        else
                            // console.log(data.error);
                            printErrorMsg(data.error);
                        
                    
                );
            );


        function printErrorMsg (msg) 

            $(".print-error-msg").find("ul").html('');

            $(".print-error-msg").css('display','block');

            $.each( msg, function( key, value ) 

                $(".print-error-msg").find("ul").append('<li>'+value+'</li>');

            );

        

        );
    </script>
</body>
@endsection

控制器存储功能:

 /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    
        $validator = Validator::make($request->all(),[
            'intitule' => 'unique:themes,intitule'
        ]);
        $theme = new Theme;
        $theme->intitule = $request->input('intitule');
        $theme->description = $request->input('description');
        $theme->categorie = $request->input('categorie');
        $request->merge([
            'filiere' => implode(',', (array) $request->get('filiere'))
        ]);
        $theme->filiereDesiree = $request->input('filiere');
        $theme->save();

        if ($validator->passes()) 


            return response()->json(['success'=>'Added new records.']);

        


        return response()->json(['error'=>$validator->errors()->all()]);

   

问题是我根本没有收到消息,可能是成功也可能是错误。我不知道我在哪里做错了。

附注: 我已经使用 Ajax 提交了这个表单。我使用 XMLHttpRequest 对象做到了。问题是我不知道如何使用 422 状态来使用这个 XHR 对象返回错误。我一直在寻找它,但没有发现任何真正有用的东西。所以我改变了这个方法,在这里使用了似乎更常用的 ajax() jquery 函数。仍然没有收到消息。这是我第一次尝试使用 Ajax 管理验证错误。非常欢迎您的帮助

【问题讨论】:

【参考方案1】:

您可以使用 Laravel Request 进行验证。

php artisan make:request ThemeCreateRequest

控制器

use App\Http\Request\ThemeCreateRequest

 public function store(ThemeCreateRequest $request)
    
        $theme = new Theme;
        $theme->intitule = $request->input('intitule');
        $theme->description = $request->input('description');
        $theme->categorie = $request->input('categorie');
        $request->merge([
            'filiere' => implode(',', (array) $request->get('filiere'))
        ]);
        $theme->filiereDesiree = $request->input('filiere');
        $theme->save();

        if ($validator->passes()) 


            return response()->json(['success'=>'Added new records.']);

        


        return response()->json(['error'=>$validator->errors()->all()]);

   

App\Http\Request\ThemeCreateRequest.php

public function authorize()

    return true;


public function rules()

    return [
        'intitule' => 'required|unique',
    ];

【讨论】:

感谢您的回答。不应该是public function store(ThemeCreateRequest $request)吗?..我刚试了,还是没有回消息【参考方案2】:

您可以在控制器上使用它。

return response()->json(array('errors'=>$validator->getMessageBag()->toArray(),));

在javascript中尝试使用这个

                    success: function(data)
                        if(data.error)
                            printErrorMsg(data.error);
                        
                        else
                            alert(data.success);
                        
                    

ajax 代码

                   $.ajax(
                    url: "route('themes.store')",
                    type: 'POST',
                    data: 
                        _token:_token,
                        intitule:intitule,
                        categorie:categorie,
                        filiere:filiere
                    ,
                    success: function(data)
                        if(data.error)
                            printErrorMsg(data.error);
                        
                        else
                            alert(data.success);
                        
                    
                );

控制器

 public function store(Request $request)
    
        $validator = \Validator::make($request->all(),[
            'intitule' => 'unique:themes,intitule'
        ]);


        if ($validator->fails()) 
           return response()->json(array('error'=>$validator->getMessageBag()->toArray(),));
        
        $theme = new Theme;
        $theme->intitule = $request->input('intitule');
        $theme->description = $request->input('description');
        $theme->categorie = $request->input('categorie');
        $request->merge([
            'filiere' => implode(',', (array) $request->get('filiere'))
        ]);
        $theme->filiereDesiree = $request->input('filiere');
        $theme->save();

        return response()->json(array('success'=>'Added new records.',));
       

【讨论】:

尝试了您的解决方案,但我仍然没有收到任何消息。我应该告诉服务器应该返回的内容类型吗?我说的是这行代码header("Content-Type: text/json");。我写了它,但不知道这是否是问题,因为我仍然不明白为什么它不起作用.. 您确定您的点击事件有效吗?我放的返回已经是一个对象,而 ajax 数据需要是一个 json/对象。也许您遇到其他错误?抱歉,我不知道header("Content-Type: text/json"); 有什么用,但我没有使用它,我收到一条错误消息和成功消息。 是的,你是对的,没有它,它仍然有效。我已经解决了我的问题,在我看来这是一个错误。谢谢【参考方案3】:

哎呀,这是我的错...我刚刚弄清楚为什么它不起作用。我把它放在我的刀片视图中

@if($errors->any())
<ol style="color: red">
@foreach($errors->all() as $error)
<li>
  $error
</li>
@endforeach
</ol>
@endif

而不是 JavaScript 代码正在寻找输出错误的 &lt;ul&gt; &lt;/ul&gt; 标记。谢谢大家

【讨论】:

以上是关于Ajax 检索错误不起作用 Laravel的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 多对多关系不起作用(没有抛出错误)

如何修复 Laravel AJAX 请求不起作用

使用ajax调用的角度保存变量到laravel会话不起作用

Laravel ajax url 在生产服务器上不起作用

当我更改路线时,Laravel ajax 搜索不起作用

在 Laravel 8 的 js 文件中分离 Javascript Ajax 代码不起作用