为啥我的验证器没有在 Laravel 中验证?

Posted

技术标签:

【中文标题】为啥我的验证器没有在 Laravel 中验证?【英文标题】:Why is my validator is not validating in Laravel?为什么我的验证器没有在 Laravel 中验证? 【发布时间】:2020-05-05 10:43:05 【问题描述】:

为什么我的验证器没有验证 input-email 字段,它接受任何东西!

这是我更新数据库的控制器。表格中的名称是正确的 编辑:这是我的全部代码,我在这里只用电子邮件发布了我的代码,但一个人说这是有效的,那么为什么这不适用于我的更新数据库的整个代码?

public function atualizar(Request $req)

    $erros = [
        'input-nome.max' => 'Introduziu carateres acima do máximo no campo do nome!',
        'input-facebook.max' => 'Introduziu carateres acima do máximo no campo do facebook!',
        'input-instagram.max' => 'Introduziu carateres acima do máximo no campo do instagram!',
        'input-descricao.max' => 'Introduziu carateres acima do máximo no campo da descrição!',
        'input-profissao.max' => 'Introduziu carateres acima do máximo no campo da profissão!',
        'input-imagem.max' => 'O tamanho máximo do ficheiro é de 10mb!',
        'image' => 'O ficheiro que inseriu não é imagem!',
        'mimes' => 'A extensão da imagem não é permitida, apenas JPEG, JPG e PNG!',
        'email' => 'Introduza um e-mail válido!'
    ];
    $validator = Validator::make($req->all(), [
        'input-nome' => 'max:25',
        'input-email' => 'nullable|required_with:input-email|email:rfc,dns,filter',
        'input-facebook' => 'max:40',
        'input-instagram' => 'max:40',
        'input-profissao' => 'max:25',
        'input-descricao' => 'max:120',
        'input-imagem' => 'image|mimes:jpeg,png,jpg|max:10240'
    ], $erros);

    $id = $req->input('input-id');

    $membrosEquipa = DB::table('equipa')
        ->where('id', $id)
        ->get();

    $inputEmail = $req->input('input-email');
    if (!isset($inputEmail)) 
        $inputEmail = null;
    
    if ($req->filled('input-email')) 
        $inputEmail = $req->input('input-email');
    
    $inputNome = $req->input('input-nome');
    $inputFacebook = $req->input('input-facebook');
    $inputInstagram = $req->input('input-instagram');
    $inputProfissao = $req->input('input-profissao');
    $inputDescricao = $req->input('input-descricao');
    $inputImagem = $req->file('input-imagem');

    foreach ($membrosEquipa as $membro) 
        if (!isset($inputNome)) 
            $inputNome = $membro->nome;
        
        if (!isset($inputFacebook)) 
            $inputFacebook = $membro->facebook;
        
        if (!isset($inputInstagram)) 
            $inputInstagram = $membro->instagram;
        
        if (!isset($inputProfissao)) 
            $inputProfissao = $membro->profissao;
        
        if (!isset($inputDescricao)) 
            $inputDescricao = $membro->descricao;
        
        if (isset($inputImagem)) 
            Storage::delete($membro->imagem);
            $inputImagem = $req->file('input-imagem')->store('storage/equipa');
         else 
            $inputImagem = $membro->imagem;
        
    

    $timestamp = date('Y-m-d H:i:s');

    DB::table('equipa')
        ->where('id', $id)
        ->update([
            'nome' => $inputNome,
            'email' => $inputEmail,
            'facebook' => $inputFacebook,
            'instagram' => $inputInstagram,
            'profissao' => $inputProfissao,
            'descricao' => $inputDescricao,
            'imagem' => $inputImagem,
            'updated_at' => $timestamp
        ]);

    return redirect('/editar/equipa/')->with('status', 'Membro da equipa atualizado com sucesso');

【问题讨论】:

【参考方案1】:

你必须在定义 $validator 之后使用下面的代码

$validator = Validator::make($req->all(), [
    'input-email' => 'email:rfc,dns|required'
], $erros);


if ($validator->fails())

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

【讨论】:

电子邮件仍然保存在数据库中,无需验证 但确实如此,即 required_with:input-email,如果我填写电子邮件字段,则必须像插入数据库时​​一样对其进行验证。 即使我删除了 nullable,即使我没有插入任何内容,邮件也会通过我输入的任何内容进行验证。 为什么不使用像 'input-email' => 'email|required' 这样的干净验证? 因为我希望它能够发送电子邮件 null 但如果发生这种情况我会使用数据库中的值发送它,问题是如果我在电子邮件中放置例如测试字段它将进入数据库而无需验证

以上是关于为啥我的验证器没有在 Laravel 中验证?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个验证总是需要我?

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

为啥 laravel 验证不显示错误

Laravel Passport 没有身份验证

如何在laravel验证器中验证时间“ 10:30 AM”

为啥我的验证事件没有在 C# 中触发?