Laravel request validation

1

I am having problems with validations in laravel , in real it is validating correctly however I need to inform the user which field X is required or not.

Today the system simply sends to the same screen cleaning all my form this would not be the ideal one for me.

I need my program to report the fields that are failing so to remain in the same place with the data already filled in.

I have a sharing where I show these massages:

<div id="alert-box" class="alert alert-danger"{!! $errors->any() ? '' : "style='display: none'" !!}>

<b>Ops...</b>
 <ul>
    @if($errors->any())
        @foreach($erros->any() as $erro)
            <li>{{$erro}}</li>
        @endforeach
    @endif
 </ul>
</div>
@if(Session::has('flash_message'))
    <div class="alert alert-success">
        <i class="icon fa fa-check"></i>
        {{Session::get('flash_message')}}
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
    </div>
@endif

On the pages where I want this validation to appear I simply do:

@include('shared.alert')

In my model I have the store function that would save my data to it, I programmed it like this:

public function store(ProdutoRequest $resquest){
    $produto = Produto::create($resquest->all());
    session()->flash('flash_message', 'Produto criado com sucesso');
    $produtos = Produto::all();

    if(Request::wantsJson()){
        return $produto;
    }else{
        return view('Produto.listProduto', compact('produtos'));
    }
}

The legal inside of it I use the session-flash and it works perfectly however for the errors not.

Already my ProdutoRequest I programmed it like this:

class ProdutoRequest extends Request
{
   public function authorize()
   {
       return true;
   }

   public function rules()
   {
     return [
        'CdSubCategoria' => 'required',
        'NmProduto' => 'required|min:1',
        'VlUnit' => 'required|min:1',
        'FlgDescontinuado' => 'required',
        'FlgProdutoVisivel' => 'required',
        'FlgPontua' => 'required',
     ];
   }
}

My view form:

@include('shared.alert')
{{dump($errors)}}
<div class="box-body">
    <div class="form-group{{ $errors->has('CdSubCategoria') ? ' has-error' : '' }}">
        {!! Form::label('nmSubCategoria', 'Sub Categoria') !!}
        {!! Form::select('CdSubCategoria', $subcategorias , $produto->CdSubCategoria, ['class' => 'form-control select2']) !!}
    </div>
    <div class="form-group{{ $errors->has('NmProduto') ? ' has-error' : '' }}">
        {!! Form::label('nmProduto', 'Nome do produto') !!}
        {!! Form::text('NmProduto', null, ['class' => 'form-control nomeProduto']) !!}
    </div>
    <div class="form-group{{ $errors->has('DscProduto') ? ' has-error' : '' }}">
        {!! Form::label('dscProduto', 'Descrição do produto') !!}
        {!! Form::textarea('DscProduto', null, ['class' => 'form-control', 'id' => 'editor1']) !!}
    </div>
    {!! Form::label('vlProduto', 'Valor') !!}
    <div class="form-group{{ $errors->has('VlUnit') ? ' has-error' : '' }}">
        <div class="input-group">
            <span class="input-group-addon">R$</span>
            {!! Form::text('VlUnit', null, ['class' => 'form-control','data-inputmask' => '"mask": "999.99"', 'data-mask']) !!}
            <?php echo $errors->first('VlUnit'); ?>
        </div>
    </div>
    <div class="form-group">
        {!! Form::label('flgAdicionarEstoque', 'Adicionar estoque?') !!}
        {!! Form::radio('FlgAdicionarEstoque', '1', false, ['class' => 'form-control estoqueVisivel minimal']) !!}
        {!! Form::label('flgAdicionarEstoque', 'Sim') !!}
        {!! Form::radio('FlgAdicionarEstoque', '0', true, ['class' => 'form-control estoqueVisivel Inativo minimal']) !!}
        {!! Form::label('flgAdicionarEstoque', 'Não') !!}
    </div>
    <div class="camposEstoque">
        <div class="form-group">
            {!! Form::label('qtdEmEstoque', 'Estoque') !!}
            {!! Form::number('UnitEmEstoque', null, ['class' => 'form-control']) !!}
        </div>
    </div>
    <div class="form-group">
        {!! Form::label('flgDescontinuado', 'Produto descontinuado ?') !!}
        {!! Form::radio('FlgDescontinuado', '1', false, ['class' => 'form-control minimal']) !!}
        {!! Form::label('flgDescontinuado', 'Sim') !!}
        {!! Form::radio('FlgDescontinuado', '0', true, ['class' => 'form-control Inativo minimal']) !!}
        {!! Form::label('flgDescontinuado', 'Não') !!}
    </div>
    <div class="form-group">
        {!! Form::label('flgProdutoVisivel', 'Produto visivel ?') !!}
        {!! Form::radio('FlgProdutoVisivel', '1', false, ['class' => 'form-control produtoVisivel minimal']) !!}
        {!! Form::label('flgProdutoVisivel', 'Sim') !!}
        {!! Form::radio('FlgProdutoVisivel', '0', true, ['class' => 'form-control produtoVisivel Inativo minimal']) !!}
        {!! Form::label('flgProdutoVisivel', 'Não') !!}
    </div>
    <div class="camposVisivel">
        <div class="form-group">
            {!! Form::label('visivel_Ini', 'Inicio da visualização') !!}
            {!! Form::datetime('Visivel_Ini', \Carbon\Carbon::create()->format('d/m/Y H:i:s'), ['class' => 'form-control datepicker', 'id' => 'datInic']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('visivel_Fim', 'Fim da visualização') !!}
            {!! Form::datetime('Visivel_Fim', null, ['class' => 'form-control datepicker']) !!}
        </div>
    </div>

    <div class="form-group">
        {!! Form::label('flgPontua', 'Produto pontua ?') !!}
        {!! Form::radio('FlgPontua', '1', false, ['class' => 'form-control FlgPontua minimal']) !!}
        {!! Form::label('flgPontua', 'Sim') !!}
        {!! Form::radio('FlgPontua', '0', true, ['class' => 'form-control FlgPontua Inativo minimal']) !!}
        {!! Form::label('flgPontua', 'Não') !!}
    </div>
    <div class="camposExtras">
        <div class="form-group">
            {!! Form::label('qtdPontos', 'Quantos pontos ?') !!}
            {!! Form::number('QtdPontos', null, ['class' => 'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('maxPontosPorSubCategoria', 'máximo de pontos ?') !!}
            {!! Form::number('MaxPontosPorSubCategoria', null, ['class' => 'form-control']) !!}
        </div>
    </div>
    <div class="form-group">
        {!! Form::submit($submitButton, ['class' => 'btn btn-success']) !!}
        {!! link_to_route('produtos.index', 'Voltar', '', ['class' =>  'btn btn-warning' ]) !!}
    </div>
</div>
<!-- /.box-body -->

And here's my main view:

@section('conteudo')
<div class="box box-primary">
    <div class="box-header with-border">
        <h3 class="box-title">Cadastro de <a  class="nameCadastro">produtos</a></h3>
        </div>
        <!-- /.box-header -->
        <!-- form start -->
        {!! Form::open(['route' => 'produtos.store', 'id' => 'produtos-form']) !!}
            @include('Produto.form', array('submitButton' => 'Enviar'))
        {!! Form::close()  !!}
    </div>
@stop

What's missing for me? How do I get to the point I need, specified in bold?

    
asked by anonymous 15.09.2016 / 05:33

1 answer

0

I'm not sure how your Laravel Framework was configured, but I'll try to clarify with an example:

ChamadoRequest

In class ChamadoRequest has validation for nome which is mandatory and email which is mandatory and must be a valid email .

<?php

namespace App\Http\Requests;

use App\Models\Pedido;
use Illuminate\Foundation\Http\FormRequest;

class ChamadoRequest extends FormRequest
{   
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [            
            'nome' => 'required',
            'email' => 'required|email'
        ];
    }
    public function messages()
    {
        return [            
            'nome.required' => 'O nome do cliente é requerido',
            'email.required' => 'O e-mail do cliente é requerido',
            'email.email' => 'O e-mail é inválido'
        ];
    }
}

controller ChamadoRequest

In% with controller in method ChamadoController , make injection of class save , which will have a fundamental role of testing the data before executing this method, if it is not satisfactory it returns to ChamadoRequest with the errors

public function save(ChamadoRequest $request)
{
    //operações
    return redirect()->route('chamados.index');
}

View View

@extends('layout._layout')
@section('content')
    <h3>Cadastro de Chamados</h3>    
    @include('errors',['errors'=>$errors])
    <hr />
    {{ Form::open(array('route' => 'chamados.save', 'role'=>'form', 'id' =>'form1','name' =>'form1' )) }}    
    <hr />
    <div class="form-group has-feedback">
        {{ Form::label('email', 'E-mail do cliente:', array('class' => 'awesome')) }}
        {{ Form::text('email', old('email'), array('class'=>'form-control','placeholder'=>'E-mail do cliente', 'maxlength' => '70')) }}
        <?php echo $errors->first('email'); ?>
    </div>
    <div class="form-group has-feedback">
        {{ Form::label('nome', 'Nome do cliente:', array('class' => 'awesome')) }}
        {{ Form::text('nome', old('nome'), array('class'=>'form-control','placeholder'=>'Nome do cliente','maxlength'=>'50')) }}
        <?php echo $errors->first('nome'); ?>
    </div>
    <hr />
    <button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-save"></span> Salvar</button>
    {{ Form::close() }}
@stop

and index.blade.php View that is called with include in errors.blade.php View .

@if (isset($errors) && count($errors) > 0)
 <div class="alert alert-danger">
  <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
  <strong>Erros encontrados!</strong>
  <ul>
  @foreach($errors->all() as $error)
    <li>{{$error}}</li>
  @endforeach
 </ul>
</div>
@endif

In the main form ( index.blade.php ) there is a

<?php echo $errors->first('nome'); ?>

If there is a validation error in the name field it returns and shows you the error.

    
15.09.2016 / 15:58