Mostrando entradas con la etiqueta Request. Mostrar todas las entradas
Mostrando entradas con la etiqueta Request. Mostrar todas las entradas

Crear un request para Validaciones complejas

En los métodos del controller las validaciones siempre se hacen:
$request->validate([
     'name' => 'required',
     'slug' => "required|unique:categories,slug,$category->id"
]);

Pero si hay que hacer validaciones más complejas lo ideal es crear un request:
php artisan make:request StorePostRequest

En app\Http\Requests\StorePostRequest.php:
authorize() a true
...
function rules() { $rules = [
'name' => 'required',
'slug' => 'required|unique:posts',
'status' => 'required|in:1,2'
];

if ($this->status == 2) {
$rules = array_merge($rules, [
'category_id' => 'required',
'tags' => 'required',
'extract' => 'required',
'body' => 'required'
]);
}

return $rules;
}

Y luego en el Controller solo hay que:
use App\Http\Requests\StorePostRequest;
...
// solo poniendo esto ya hace automáticamente todas las vacidaciones a lo q se mande por $request
public function store(StorePostRequest $request) {
...
}

Crear un request

Un request en interesante hacerlo por ejemplo cuando una validación está sujeta a condiciones dependiendo de algún campo.

php artisan make:request StorePostRequest
En app\Http\Requests\StorePostRequest.php poner la función authorize:
if ($this->user_id == auth()->user()->id) {
return true;
}
else {
return false;
}
En la función rules:
$rules = [
'name' => 'required',
'slug' => 'required|unique:posts',
'status' => 'required|in:1,2'
];

if ($this->status == 2) { // añadir nuevas reglas a las q ya hay en ese array
$rules = array_merge($rules, [
'category_id' => 'required',
'tags' => 'required
'extract' => 'required',
'body' => 'required'
]);
}

return $rules;

En el PostController:
use App\Http\Requests\StorePostRequest; Cambiar la función store a:
public function store(StorePostRequest $request) { // al ser ya de tipo StorePostRequest ya hace antes la validación
$post = Post::create($request->all());

if ($request->tags) {
$post->tags()->attach($request->tags);
}

return redirect()->route('admin.posts.edit', $post
}