En esta entrada vamos a tratar de insertar datos desde un formulario a través del método POST y después validaremos estos datos sean correctos.
Insertar datos desde un formulario
Primero de todo definimos los campos que serán editables en el modelo, para ello añadimos la siguiente línea al modelo:
1 2 3 |
... protected $fillable = ['title', 'body', 'user_id']; ... |
Añadimos la nueva ruta que será de tipo POST, que es un tipo de método HTTP que pasa los parámetros de una manera que no son visibles, no como por GET que los pasa por URL.
Entonces, abrimos el archivo de las rutas y añadimos al final esto:
1 |
Route::post('/posts', 'PostsController@store'); |
Ahora vamos al controlador y añadimos el siguiente método:
1 2 3 4 |
public function store(Request $request) { Post::create($request->all()); return redirect('posts'); } |
Lo que hace es coger los datos pasados por POST a través de la variable $request e insertarlo a través del método create del modelo Post que hace referencia a la tabla posts de la base de datos. Después, simplemente redirige a la lista de posts.
En este enlace puedes encontrar más información sobre Eloquent ORM y sus otros métodos (update para editar, delete para eliminar, etc.). En otra entrada trataremos esto.
Ahora solamente falta añadir el formulario donde introducir los datos, yo lo he añadido al principio del archivo de la lista de posts:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<h4>Create post</h4> <form id="save_post" method="post" action="{{URL::to('/')}}/posts"> {{ csrf_field() }} <div> <p>Title</p> <input type="text" id="title" name="title" value="{{ old('title') }}"> </div> <div> <p>Body</p> <textarea id="body" name="body">{{ old('body') }}</textarea> </div> <div> <input type="submit" value="Save"> </div> </form> |
Con esto, obtenemos:
Validar los datos
Siguiendo la documentación de Laravel sobre las validaciones, vamos a añadir este código en el controlador:
1 2 3 4 |
$this->validate($request, [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]); |
Esto nos validará la variable POST title y body. Title es requerido, único y máximo 255. Body simplemente será requerido.
Pero solamente con esto no se nos mostrarán los errores en la vista. para que se muestren tenemos que añadir este código antes del formulario:
1 2 3 4 5 6 7 8 9 |
@if ($errors->any()) <div> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif |
Los errores saldrán en inglés, para que salgan en cualquier otro idioma, tendremos que descargar la traducción de Laravel o hacerlo nosotros mismos y poner los archivos en resources/lang .
Validar los datos con Form Requests
Vamos a validar los datos de otra manera, un poco más compleja, pero al final hace lo mismo. Este tipo de validaciones son para casos más complejos.
Creamos el archivo con artisan:
1 |
php artisan make:request PostRequest |
Se nos habrá creado un archivo en app/Http/Requests/PostRequest.php , lo abrimos y modificamos el método rules y authorize:
1 2 3 4 5 6 7 8 9 10 11 12 |
public function authorize() { return true; } public function rules() { return [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } |
En el método authorize podremos poner si puede enviar datos según su rol, permisos, si es propietario, etc.
Para aplicar esta nueva forma, vamos al controlador y modificamos el método donde está la validación anterior:
1 2 3 4 5 6 7 |
//esta línea va al principio del archivo use App\Http\Requests\PostRequest; public function store(PostRequest $request) { Post::create($request->all()); return redirect('posts'); } |
Y con esto el resultado será el mismo que con la otra manera.
En la siguiente entrada profundizaremos sobre Blade, el motor de plantillas de Laravel.
-
Validaciones: https://laravel.com/docs/5.4/eloquent
Ante todo, muchas gracias por este fantástico tutorial, imprescindible para los novatos como yo.
Una duda: al enviar los datos del formulario, me aparece una pantalla de error con el siguiente mensaje:
(1/1) MassAssignmentException
_token
Por lo que he visto, parece que hay que definir de alguna manera los campos de la base de datos sobre los que se quiere editar. Es así?
Gracias de nuevo!
Hola Lluís muchas gracias por tu comentario. ?
Sí, correcto. Para definir los campos debes hacerlo en el atributo
$fillable
del modelo. Lo he añadido a la entrada.Te dejo el link de la documentación de Laravel sobre ésto y otro link al código de mi repositorio.
Espero haberte ayudado y muchas gracias.
Perfecto, muchas gracias!
Observando tu Código te hago una pregunta fuera del Tema.
public function store(PostRequest $request) {
Post::create($request->all());
return redirect(‘posts’);
}
Observo que no guardas los datos en el controlador, sino los pasas a un objeto Post. Yo guardo directamente en el Controlador, que me dices de eso, lo estaré haciendo bien.
Me Parece más elegante tu código. muestrame ese objeto Post a ver aprendo de las buenas prácticas.
Hola Edser!
Muchas gracias por tu comentario.
No acabo de entender a qué te refieres con guardarlo directamente en el controlador.
Te refieres a guardar en una variable la request y después pasar esta variable como parámetro al método create?
Si me lo puedes aclarar para poder echarte una mano.
Un saludo!