Cómo crear formularios en Laravel 5

Una de las funcionalidades más implementada para cualquier aplicación es la recolección de datos mediante una interfaz de usuario llamada formulario. Los formularios en Laravel 5 se pueden crear con simple HTML5  en nuestras plantillas.

Como en el ejemplo que se está realizando este manual, se van a requerir dos formularios, uno para insertar los contactos y otro para insertar teléfonos. Además de cómo crear formularios en Laravel 5, se explicará los campos que podemos agregar a un formulario y a protegerlos de ataques por inyección.

Se suponen ciertas premisas que se han tenido que configurar para hacer funcionar los formularios como son:

  • Se han creado los controladores para manejar los recursos:
    php artisan make:controller ContactosController --resource
    php artisan make:controller TelefonosController --resource
  • Se han añadido las rutas a los recursos:
    Route::resource('contactos', 'ContactosController');
    Route::resource('telefonos', 'TelefonosController');
  • Se han creado dos vistas para cada formulario de inserción de datos. Estas vistas extenderían de alguna plantilla si ya la tenemos configurada y tendrán un formulario distinto cada una.

Si ya se tiene todo ello, se procede a crear formularios en Laravel 5 para que el usuario sea capaz de rellenar los campos que serán los datos que vamos a almacenar en la base de datos.

El primer ejemplo de formulario para crear un nuevo contacto sería un formulario con estas características:

<form action="" method="POST">
  <label for="nombre">Introduce el nombre</label>
  <input type="text" name="nombre">
  <label for="apellidos">Introduce los apellidos</label>
  <input type="text" name="apellidos">
  <input type="submit" value="Insertar">
</form>

Este formulario es un simple formulario construido en lenguaje HTML5 que cuenta con dos campos de texto para recoger el nombre y los apellidos nuevos, más el botón inserción. Y por defecto, se ha dejado POST como método de envío, pero hay que recordar que se pueden realizar otros tipos de peticiones como son PUT, DELETE o PATCH que no son soportados por HTML y que podemos espeficarlo tras la etiqueta de apertura del formulario:

{{ method_field('PATCH , PUT, DELETE ....') }}

Hasta aquí es bastante fácil, pero este tipo de formulario tiene vulnerabilidades. Si no protegemos debidamente los formularios, pueden ser carnaza para los ataques de tipo spoofing que lanzan comandos no autorizados desde sitios ajenos sin consentimiento del servidor.

Para ello, Laravel incorpora un campo oculto con un token de seguridad que hace las funcionalidades de cortafuegos ante los posibles ataques. Este método se conoce como protección contra CSRF.

Cómo proteger un formulario

Mediante el uso del método csrf_field, Laravel nos habilita un campo con el token de seguridad para protegernos de ataques CSRF. Entonces, el formulario cambiaría y el aspecto que tendría ahora es:

<form action="" method="POST">
  {{ csrf_field() }}
  <label for="nombre">Introduce el nombre</label>
  <input type="text" name="nombre">
  <label for="apellidos">Introduce los apellidos</label>
  <input type="text" name="apellidos">
  <input type="submit" value="Insertar">
</form>

Acción del formulario

Aunque podríamos estar acostumbrados al uso de rutas relativas, o como en este caso añadir la ruta que especificamos en nuestro recurso de rutas /contactos, para la recogida de información y el procesamiento en Laravel podemos hacer uso del método action como ya [aprendimos en los controladores].

<form action="{{ action('ContactosController@store') }}" method="POST">

Tipos de campos

Los tipos de campos que se aceptan en un formulario de Laravel son los mismos que se podrían implementar como formulario HTML. En esta entrada no se va ahondar más en los tipos de campos, si quieres más información, echa un vistazo a [esta documentación] para aprender más sobre los formularios en HTML5.

Lo que sí es destacable en esta sección es que si vamos a manejar campos de tipo fichero, estamos obligados a incluir el atributo enctype dentro de la etiqueta formulario y usar los métodos POST o PUT.

<form method="post" action="/contactos" enctype="multipart/form-data">
  <input type="file" name="image">
</form>

Para finalizar, pongo el código que tendría el formulario que recoge los datos de los teléfonos. Hay que tener especial interés en como muestro el desplegable de los contactos ya introducidos, porque los he recogido desde el método de llamada al fomulario:

<form action="{{ action('TelefonosController@store') }}" method="post">
    {{ csrf_field() }}

    <label for="">Número de teléfono</label>
    <input type="number" maxlength="9" name="telefono">

    <label for="">Tipo</label>
    <input type="radio" name="tipo" value="fijo">Fijo
    <input type="radio" name="tipo" value="movil">Móvil


    <label for="">Asignar al contacto</label>
    <select name="id_contacto">
      @foreach($contactos as $contacto)
        <option value="{{ $contacto->id }}">{{ $contacto->nombre }} {{ $contacto->apellidos }}</option>
      @endforeach
    </select>

    <input type="submit" value="Insertar">
  </form>

 

Deja un comentario