【问题标题】:laravel and validation with requestlaravel 和验证请求
【发布时间】:2020-11-06 06:08:39
【问题描述】:

我无法在 Laravel 中正确设置验证。 在其他功能中,我在控制器中有这个

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Exports\RimborsiExport;

use DB;
use App\Customers;
use App\Claims;
use App\Refunds;
use App\Services;
use App\Http\Requests\RefundsPost;

use Excel;
use DataTables;
use Redirect;
use Response;

class RefundsController extends Controller
{
    public function storeRefundsData(RefundsPost $request){
        dd($request);
        
        //$validated = $request->validated();
        $customers = Customers::create($request->all());
        return back()->with('status', 'Dati Cliente inseriti correttamente');
    }

}

我还定义了一个自定义请求类型

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RefundsPost extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'contr_nom' => 'required|max:255',
            'contr_cog' => 'required',
            'polizza' => 'required',
            'email' => 'required',
            'targa' => 'required',
            'iban' => 'required|iban',
            'int_iban' => 'required',
        ];
        return $rules;
    }
    
    public function messages()
    {
    return [
        'contr_nom.required' => "Il Nome Contraente e' obbligatorio",
        'contr_cog.required'  => "Il Cognome Contraente e' obbligatorio",
        'polizza.required'  => "Il numero di polizza e' obbligatorio",
        'email.required'  => "Una mail e' obbligatoria per le comunicazioni",
        'targa.required'  => "La targa e' obbligatoria",
        'data_sin.required'  => "La data sinistro e' obbligatoria",
        'iban.required'  => "Il numero IBAN e' obbligatorio",
        'int_iban.required'  => "L'intestatario dell' IBAN e' obbligatorio",
        'dossier.required'  => "Il numero di dossier e' obbligatorio",
        'cliente.required'  => "Il cliente e' obbligatorio",
        'stato.required'  => "Lo stato del rimborso e' obbligatorio",
        'date_ref.required'  => "La data della richiesta e' obbligatoria",
        ];
    }
}

我有这把刀片,里面有表格

    <div class="container-fluid">
  <form method="POST" action="{{ route('storeRefundsData') }}" novalidate>
      
    {{ csrf_field() }}

    <h5 class="mb-3">Anagrafica</h5>      
    <div class="row">
      <div class="col-md-6 mb-3">
        <label for="contr_nom">Nome Contraente</label>
        <input type="text" class="form-control @error('contr_nom') is-invalid @enderror" id="contr_nom" name="contr_nom" value="{{old('contr_nom')}}">
        @error('contr_nom')
          <div class="invalid-feedback">{{ $message }}</div>
        @enderror
      </div>
      <div class="col-md-6 mb-3">
        <label for="contr_cog">Cognome Contraente</label>
        <input type="text" class="form-control @error('contr_cog') is-invalid @enderror" id="contr_cog"  name="contr_cog" value="{{old('contr_cog')}}">
        @error('contr_cog')
          <div class="invalid-feedback">{{ $message }}</div>
        @enderror
      </div>
    </div>

    <div class="row">
      <div class="col-md-6 mb-3">
        <label for="polizza">Numero Polizza <span class="text-muted"></span></label>
        <input type="text" class="form-control @error('polizza') is-invalid @enderror" id="polizza" name="polizza" value="{{old('polizza')}}">
        @error('polizza')
          <div class="invalid-feedback">{{ $message }}</div>
        @enderror
      </div>

      <div class="col-md-6 mb-3">
        <label for="email">Email <span class="text-muted"></span></label>
        <input type="email" class="form-control @error('email') is-invalid @enderror" id="email" name="email" placeholder="tu@esempio.it" value="{{old('email')}}">
        @error('email')
          <div class="invalid-feedback">{{ $message }}</div>
        @enderror
      </div>
    </div>

    <div class="row">
      <div class="col-md-6 mb-3">
        <label for="targa">Targa veicolo</label>
        <input type="text" class="form-control @error('targa') is-invalid @enderror" id="targa" name="targa" placeholder="Inserisci la targa" value="{{old('targa')}}">
        @error('targa')
          <div class="invalid-feedback">{{ $message }}</div>
        @enderror
      </div>          
    </div>
    
    <h5 class="mb-3">Dati bancari</h5>
    <div class="row">
      <div class="col-md-6 mb-3">
        <label for="iban">IBAN <span class="text-muted"></span></label>
        <input type="text" class="form-control @error('iban') is-invalid @enderror" id="iban" name="iban" placeholder="Inserisci il tuo IBAN" value="{{old('iban')}}">
        @error('iban')
          <div class="invalid-feedback">{{ $message }}</div>
        @enderror
      </div>

      <div class="col-md-6 mb-3">
        <label for="int_iban">Intestatario IBAN <span class="text-muted"></span></label>
          <input type="text" class="form-control @error('int_iban') is-invalid @enderror" id="int_iban" name="int_iban" placeholder="Inserisci l'intestatario dell'IBAN" value="{{old('int_iban')}}">
          @error('int_iban')
            <div class="invalid-feedback">{{ $message }}</div>
          @enderror
        </div>
      </div>

    <hr class="mb-4">
    <!-- <button class="btn btn-primary btn-lg btn-block" type="submit">Continue to checkout</button>-->
    <input type="submit" class="btn btn-primary btn-lg btn-block" value="Salva">
    
    @if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
    @endif
  </form>
</div>

我不明白为什么当我单击表单提交按钮在数据库中创建一个新行时,似乎即使它没有进入控制器功能。 如果我使用 Request 而不是自定义类型 RefundsPost 它可以工作并将数据存储在数据库中,但显然没有验证。 我该如何解决? 非常感谢

【问题讨论】:

  • 在您的表单中尝试{{ var_dump($errors) }},看看是否有任何验证错误。
  • 如果验证失败,它甚至永远不会进入方法......表单请求在从容器中解析时得到验证,这意味着当框架构建此方法的依赖项时,它会创建在调用方法之前请求类

标签: laravel validation


【解决方案1】:

不确定这是否能解决您的问题,但我已经按照我的方式重写了您的函数。您可以指定规则所针对的 http 方法,在本例中我指定了 POST 请求的规则。

RefundsPost -> 规则

public function rules() {
    $rules = [];

    switch($this->method()) {
        case 'POST': 
        {
            $rules = [
                'contr_nom' => 'required|max:255',
                'contr_cog' => 'required',
                'polizza' => 'required',
                'email' => 'required',
                'targa' => 'required',
                'iban' => 'required|iban',
                'int_iban' => 'required',
            ];
        }

        default:
            break;
    }

    return $rules;
}

在 storeRefundsData 函数中,您应该使用 $request->validated() 并在继续插入时使用它在验证后返回的属性。

RefundsController -> storeRefundsData:

public function storeRefundsData(RefundsPost $request) {

    $attributes = $request->validated();

    $customers = Customers::create($attributes);

    if (!($customers instanceof Customers)) {
        // could not create customer
        return ['result' => false];
    }

    $customers = $customers->fresh(); // if you need to retrieve the objects id

    return ['result' => true];
}

【讨论】:

  • 我按照您的建议进行了修改,但没有任何改变...实际上我可以 dd 例如规则,它向我显示规则数组...嗯,所以在验证 RefundsPost 类期间发生了错误?但是没有显示错误...我无法理解
【解决方案2】:

很遗憾,我无法发表评论。

但是,出于好奇,我认为 iban 规则是习惯性的,对吗?

如果是这样,您可以尝试以下方法:

    public function rules()
    {
        return [
            'contr_nom' => ['required', 'max:255'],
            'contr_cog' => ['required'],
            'polizza'   => ['required'],
            'email'     => ['required'],
            'targa'     => ['required'],
            'iban'      => ['required', new Iban],
            'int_iban'  => ['required'],
        ];
    }

当然,不要忘记在顶部导入规则类:

use App\Rules\Iban;

试试吧,让我们知道,干杯!

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 2020-01-13
    • 2016-09-20
    • 2015-06-09
    • 2017-10-01
    • 2019-12-31
    • 2020-08-20
    • 2018-09-15
    • 2018-03-23
    相关资源
    最近更新 更多