Reputation: 133
Sorry if this has similar Q&A on SO, but i cant ge´t any help from there.
I have a latest version fresh Laravel store practising project. Everithing seems to work ok, but in updating products. ---UPDATE---
My product controller update() code:
$rules=[
'nombre'=>'required|max:50|unique:articulos,nombre,'.$articulo->id.',id',
'color'=>'required|max:60',
'descripcion'=>'required',
'precio_compra'=>'required|lt:precio_venta',
'precio_venta'=>'required',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return redirect()
->route('articulos.edit',['articulo'=>$articulo])
->withErrors($validator)
->withInput();
}
$change=Articulo::find($articulo->id);
$change->nombre=$request->nombre;
$change->descripcion=$request->descripcion;
$change->color=$request->color;
$change->precio_compra=$request->precio_compra;
$change->precio_venta=$request->precio_venta;
$change->envio_domicilio=$request->envio_domicilio;
$change->stock=$request->stock;
$change->observaciones=$request->observaciones;
$change->save();
return view('articulos.actualizado')->with(
['nombre'=>$change->nombre]
);
Actually, tried the comments offered, but Dynamic class error jumps. Tried restarting IDE and that error dissapeared, but $errors matrix still returning nothing on alert.
^^UPDATE^^ The problem is, when I get to the validator, it seems to fail. Tryed surrounding it with dd but nothing happens (and so if I leave it as code sample, it redirects me to the product edit view, showing a blank $errors alert tag, iserted via blade ifs, that make me think not an empty array of $errors is being passed to view). Any way codre from dd seems not to work.
This my blade $errors snippet:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors as $e)
<li><strong>{{ $e }}</strong></li>
@endforeach
</ul>
</div>
@endif
---UPDATE--- Bunch of codes Model:
protected $table='articulos';
protected $fillable=[
'nombre',
'descripcion',
'color',
'precio_compra',
'precio_venta',
'envio_domicilio',
'stock',
'observaciones'
];
protected $hidden=[];
Blade:
@extends('layouts.main-layout')
@section('title','Editar '.$articulo->nombre)
@section('content')
<h1>Editar articulo</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors as $e)
<li><strong>{{ $e }}</strong></li>
@endforeach
</ul>
</div>
@endif
<div class="container">
<form action="{{ route('articulos.update',['articulo'=>$articulo]) }}" method="POST">
@method('PUT')
@csrf
<legend>Editar artículo</legend>
<div class="row">
<div class="input-field col-sm-6">
<div class="col-sm-12 special">
<label for="nombre">Nombre del artículo </label>
</div>
<input type="text" name="nombre" id="nombre" value="{{ old('nombre')?:$articulo->nombre }}" class="form-control">
</div>
<div class="input-field col-sm-6">
<div class="col-sm-12 special">
<label for="color">Color del artículo </label>
</div>
<input type="text" name="color" id="color" value="{{ old('color')?:$articulo->color }}" class="form-control">
</div>
</div>
<div class="row">
<div class="input-field col-sm-6">
<div class="col-sm-12 special">
<label for="pcompra">Precio de compra del artículo </label>
</div>
<input type="number" name="pcompra" id="pcompra" min="0.01" step="0.01" value="{{ old('pcompra')?:$articulo->precio_compra }}" class="form-control">
</div>
<div class="input-field col-sm-6">
<div class="col-sm-12 special">
<label for="pventa">Precio de venta del artículo </label>
</div>
<input type="number" name="pventa" id="pventa" min="0.01" step="0.01" value="{{ old('pventa')?:$articulo->precio_venta }}" class="form-control">
</div>
</div>
<div class="row">
<div class="input-field col-sm-6">
<div class="col-sm-12 special">
<label for="stock">Disponible del artículo </label>
</div>
<input type="number" name="stock" id="stock" value="{{ old('stock')?:$articulo->stock }}" class="form-control">
</div>
<div class="input-field col-sm-6">
<div class="row">
Envío a domicilio
</div>
<span>
<label>
<input type="radio" name="envio_domicilio" value="N" checked>
<span>NO</span>
</label>
</span>
<span>
<label>
<input type="radio" name="envio_domicilio" value="S" {{ old('envio_domicilio')=='S'?'checked': (($articulo->envio_domicilio=='S')?'checked':'') }}>
<span>SÍ</span>
</label>
</span>
</div>
</div>
<div class="row">
<div class="input-field col-sm-12">
<div class="col-sm-12 special">
<label for="descripcion">Descripción</label><br>
</div>
<textarea name="descripcion" id="descripcion" class="form-control">{{ old('descripcion')?:$articulo->descripcion }}</textarea>
</div>
</div>
<div class="row">
<div class="input-field col-sm-12">
<div class="col-sm-12 special">
<label for="observaciones">Observaciones</label>
</div>
<textarea name="observaciones" id="observaciones" class="form-control">{{ old('observaciones')?:$articulo->observaciones }}</textarea>
</div>
</div>
<div class="row">
<div class="input-field col-sm-3">
<input type="submit" class="btn btn-primary btn-small" value="Enviar">
</div>
<div class="input-field col-sm-3">
<input type="reset" class="btn btn-secondary btn-small" value="Borrar">
</div>
</div>
</form>
</div>
@endsection
Controller methods:
public function store(Request $request)
{
$reglas=[
'nombre'=>'required|max:50|unique:articulos,nombre',
'color'=>'required|max:60',
'descripcion'=>'required',
'pcompra'=>'required|lt:pventa',
'pventa'=>'required'
];
$request->validate($reglas);
$nuevoArticulo=new Articulo;
$nuevoArticulo->nombre=$request['nombre'];
$nuevoArticulo->descripcion=$request['descripcion'];
$nuevoArticulo->color=$request['color'];
$nuevoArticulo->precio_compra=$request['pcompra'];
$nuevoArticulo->precio_venta=$request['pventa'];
$nuevoArticulo->envio_domicilio=$request['envio'];
$nuevoArticulo->stock=$request['stock'];
$nuevoArticulo->observaciones=$request['observaciones'];
$nuevoArticulo->save();
return view('articulos.grabado')->with(['articulo'=>$request['nombre']]);
}
public function update(Request $request, Articulo $articulo)
{
$rules=[
'nombre'=>'required|max:50|unique:articulos,nombre,'.$articulo->id.',id',
'color'=>'required|max:60',
'descripcion'=>'required',
'precio_compra'=>'required|lt:precio_venta',
'precio_venta'=>'required',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return redirect()
->route('articulos.edit',['articulo'=>$articulo])
->withErrors($validator)
->withInput();
}
dd($validator->errors());
$change=Articulo::find($articulo->id);
$change->nombre=$request->nombre;
$change->descripcion=$request->descripcion;
$change->color=$request->color;
$change->precio_compra=$request->precio_compra;
$change->precio_venta=$request->precio_venta;
$change->envio_domicilio=$request->envio_domicilio;
$change->stock=$request->stock;
$change->observaciones=$request->observaciones;
$change->save();
return view('articulos.actualizado')->with(
['nombre'=>$change->nombre]
);
}
...from which store is working (validating and loading view correctly) and update is failing. Also migrations shouldn´t be the problem, as they are working properly on store method, and also Irechecked DB types and so, just in case...
Thanks in advance
Upvotes: 0
Views: 3159
Reputation: 10220
You want to call the all()
method on the $errors
object:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $e)
<li><strong>{{ $e }}</strong></li>
@endforeach
</ul>
</div>
@endif
The reason you're not seeing anything from the dd($v)
is because calling validate()
on the $request
object automatically redirects back to the requesting page if validation fails.
If you want more control over the validation flow, you can use the Validation
facade.
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
// your rules
]);
if ($validator->fails()) {
return redirect('go-somewhere')
->withErrors($validator)
->withInput();
}
Update
So your blade view is still not using $errors->all()
as I have mentioned previously.
If you want to dd
errors in your controller, you need to use:
dd($validator->errors());
Further update
So the dd($validator->errors())
is after if ($validator->fails())
so it is never going to die and dump
any errors because your code is redirecting back to the form with the validation errors and input. To die and dump
the errors, you want to put that inside your conditional, but only for testing.
if ($validator->fails()) {
// dd($validator->errors()); <---- uncommet to see errors
return redirect()
->route('articulos.edit',['articulo'=>$articulo])
->withErrors($validator)
->withInput();
}
Again and as mentioned previously, you've not updated your blade code to use the all()
method on the $errors
object so none of your errors are being displayed even though they exist. Change your blade errors conditional to the following:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $e) {{-- <----- $errors->all() --}}
<li><strong>{{ $e }}</strong></li>
@endforeach
</ul>
</div>
@endif
Upvotes: 2