为啥 laravel 验证不显示错误

Posted

技术标签:

【中文标题】为啥 laravel 验证不显示错误【英文标题】:Why laravel validation don't displaying errors为什么 laravel 验证不显示错误 【发布时间】:2019-12-31 19:02:39 【问题描述】:

我正在尝试验证来自表单的请求并出现问题,但未在视图上显示错误消息。 验证成功,刷新视图但不显示错误。显然 $errors 总是空的 我在全新安装时对其进行了测试。

Laravel 版本:5.8.33 php版本:7.3.8 数据库驱动和版本:mysql 5.7.22

表格是这个

@section('content')    
    @if ($errors->any())
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $message)
                    <li> $message </li>
                @endforeach
            </ul>
        </div>
    @endif

    <form class="form-group" method="POST" action="/trainers" enctype="multipart/form-data">
        @csrf   

        <div class="form-group">
            <label for="">Nombre</label>
            <input type="text" name="name" value="@isset($trainer->name)$trainer->name@endisset" class="form-control">
        </div>

        <div class="form-group">
            <label for="">Slug</label>
            <input type="text" name="slug" value="@isset($trainer->slug)$trainer->slug@endisset" class="form-control">
        </div>

        <div class="form-group">
            <label for="">Descripción</label>
            <input type="text" name="description" value="@isset($trainer->description)$trainer->description@endisset" class="form-control">
        </div>

        <div class="form-group">
            <label for="">Avatar</label>
            <input type="file" name="avatar">
        </div>

        <button type="submit" class="btn btn-primary">Guardar</button>
        </form>
@endsection

带有验证的store函数是这样的

public function store(Request $request)
    
        $validatedData = $request->validate([
            'name' => 'required|max: 10',
            'avatar' => 'required|image',
            'slug' => 'required',
            'description' => 'required',
        ]);

        $trainer = new Trainer();
        $file = $request->file('avatar');

        if ($file != "") 
            $name = time().$file->getClientOriginalName();
            $file->move(public_path().'/images/', $name);
            
            else
                $name = "Sin Imagen.jpg";
                
        // return $name; //Ver nombre archivo
        $trainer->name = $request->input('name');
        $trainer->avatar = $name;
        $trainer->description = $request->input('description');
        $trainer->slug = $request->input('slug');
        $trainer->save();

        return 'Saved';
    

更新 在blade中添加 $errors 并返回[],$errors为空

【问题讨论】:

您没有向客户端发送验证数据。 你的提交途径是什么? Route::resource('trainers', 'TrainerController'); 为了补充@Jerodev 所说的内容,您创建了验证对象$validatedData,但您没有对它做任何事情。您只需保存传入的值并始终返回“已保存” 我正在学习一个与我的代码完全相同的教程,它适用于早期版本的 Laravel 【参考方案1】:

而不是使用$request-&gt;validate 编辑您的代码并改用$this-&gt;validate或此代码:

$messages = [
              'description.required' => 'description is required',
       ];
        $validator = Validator::make($request->all(), [
            'name' => 'required|max: 10',
            'avatar' => 'required|image',
            'slug' => 'required',
            'description' => 'required',
        ],$messages);

【讨论】:

相同的 $this->validate 如果您得到Class ... not found,请尝试修复命名空间,例如\Validator,或者在文件顶部添加use Validator; 行。 使用验证器;或使用 Illuminate\Support\Facades\Validator; Integrity constraint violation: 1048 Column 'name' cannot be null (SQL: insert into trainers` (name, avatar, description, slug, updated_at, created_at) 值 (?, Sin Imagen.jpg, ?, ? , 2019-08-28 22:49:48, 2019-08-28 22:49:48))`【参考方案2】:

如果页面刷新意味着错误对象不为空...并且您在控制器中的验证代码正常工作,因此请在浏览器中使用检查元素检查 html 代码。可能错误框已隐藏或进行测试,您可以在刀片中使用此代码

  @if ($errors->any())
    @dd($errors)-- for check error bag --
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $message)
                <li> $message </li>
            @endforeach
        </ul>
    </div>
@endif

【讨论】:

没有区别,用 chrome 检查,我没有看到错误框。在刀片中使用此代码并添加 $errors ,显示 [],为空?【参考方案3】:

试试这个

@if(session('success_message'))
            <div class="alert alert-success alert-dismissible" role="alert">
              <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span> </button>
              <strong>Successful!</strong>  session('success_message') </div>
            @endif
            @if(session('error_message'))
            <div class="alert alert-danger alert-dismissible" role="alert">
              <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span> </button>
              <strong>Error!</strong>  session('error_message') </div>
            @endif

        @if (count($errors) > 0)
                        <div class="alert alert-danger alert-dismissible" role="alert">
                            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span>
                            </button>
                            <strong>Error!</strong> 
                            @foreach ($errors->all() as $error)
                                <p> $error </p>
                            @endforeach
                        </div>
            @endif

【讨论】:

【参考方案4】:

应该添加到方法 withError() 如上

if ($validator->fails())

   return redirect()
    ->back()
    ->withErrors($validator)
    ->withInput();

【讨论】:

【参考方案5】:
I hope this will help you 

$validator = Validator::make($request->all(), [
    'amount' => 'required|amount|numeric|min:25'
])->validate();

if (isset($validator) && $validator->fails()) 
    return redirect()->route('investment')
        ->withErrors($validator)
        ->withInput();


in your blade file add below code
@if (count($errors) > 0)
<div class = "alert alert-danger">
  <ul>
     @foreach ($errors->all() as $error)
        <li> $error </li>
     @endforeach
  </ul>
 </div>
@endif 

【讨论】:

【参考方案6】:

这很奇怪,但通过更改本地服务器解决了问题。我使用了 XAMPP,现在我使用了 MAMP,一切都很完美。如果你在本地使用 Laravel,我建议不要使用 XAMPP。

【讨论】:

MAMP 仅适用于 Mac,不是吗? 也适用于 Windows

以上是关于为啥 laravel 验证不显示错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Laravel 中的验证不能正常工作?

为啥 Api Route 在 laravel 应用程序中不起作用,显示错误(未找到 404 错误)?

如何使用 vuejs 在 laravel 刀片中显示验证错误

Laravel 5.2 未显示表单验证错误 [重复]

为啥输入验证码时明明输入正确 却显示错误

为啥 laravel 中的刀片文件不显示?