4

I cannot set correctly validation in Laravel. Among other functions I have this in the Controller

<?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');
    }

}

I have also defined a custom Request type

<?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",
        ];
    }
}

and i have this blade with the form inside

    <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="[email protected]" 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>

I cannot understand why when i click on form submit button to create a new row in the db, it seems that even it doesn't enter Controller function. If I use Request instead of custom type RefundsPost it works and store data in the db but obviously without validation. How can i fix? Thx a lot

2
  • try {{ var_dump($errors) }} in your form and have a look if there are any validation errors. Commented Jul 16, 2020 at 14:37
  • if validation fails it will never even make it into the method ... Form Requests are validated when they are resolved from the container, which means when the framework is building the dependencies for this method it creates the request class before it calls the method Commented Jul 16, 2020 at 16:04

2 Answers 2

1

Not sure if this solves your problem, but I have rewritten your functions the way I would do it. You can specify what http method the rules are for, in this case I specified the rules for POST requests.

RefundsPost -> rules:

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;
}

and in the storeRefundsData function, you should use $request->validated() and use the attributes it return after validation when you proceed the insertion.

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];
}
Sign up to request clarification or add additional context in comments.

1 Comment

i modify as u suggested but nothing is changed...effectively i can dd for example rules and it shows me the array of rules...mmm so something wrong happens during validation RefundsPost Class? But no errors is shown...i cannot understand
0

Unfortunately, I cannot comment.

However, out of curiosity the rule iban is custom I believe right?

If so, can you try the following:

    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'],
        ];
    }

Of course, don't forget to import the rule class at the top:

use App\Rules\Iban;

Try it and let us know, cheers!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.