27. Como crear un formulario de contacto

En este capítulo de Laravel, aprenderás cómo crear un formulario de contacto para tu sitio web utilizando Laravel y enviar mensajes a través de correo electrónico. Cubriremos los pasos necesarios para crear un formulario de contacto que sea seguro y fácil de usar, incluyendo la validación de formularios y la prevención de ataques de spam. Aprenderás cómo enviar los datos del formulario a través de correo electrónico utilizando el servicio de correo electrónico de Laravel. Al final de este capítulo, tendrás todos los conocimientos necesarios para crear un formulario de contacto eficaz y personalizado para tu sitio web Laravel.


7 comentarios

Inicia sesión para comentar

Comentarios:

  • Adrian Linares

    Adrian Linares hace 1 semana

    Victor gracias por compartir el contenido y excelente tus explicaciones. Ahora tengo una duda, como validas en un form si los datos son correctos? Ej. Evitar que el usuario agregue como mail example@example.com o en name agregue XDSESS? Será con expresiones regulares o Laravel tiene alguna manera de implementar esto. Gracias por tu respuesta. Saludos, desde Arg.

  • Jonathan Jv

    Jonathan Jv hace 5 meses

    Una pregunta, veo que usas session() he trabajado antes con PHP puro y es mi primera vez en laravel, este método “session()” es lo mismo que declarar $_SESSION? quiero decir, ese método lo puedo usar para manejar el inicio de sesión de un usuario por ejemplo?

  • Jesus Parra

    Jesus Parra hace 1 año

    excelente.

  • Walter

    Walter hace 2 años

    ? Cuarta Parte

     

    ? Validamos la información que se está enviando desde el formulario

          Nos centramos en el método store del controlador:

          $request->validate([
                'name' => 'required',
                'correo' => 'required|email',
                'mensaje' => 'required'
          ]);

          Nos vamos a la vista index.blade.php para mostrar los mensajes de error:

          @error('name')
                <p><strong>{{ $message }}</strong></p>
          @enderror

          Hacemos lo mismo para correo y mensaje.

          Por último retornar a la vista con un mensaje de correo enviado, entonces desde el controlador cambiamos el return y enviamos un mensaje de sesión:

    return redirect()->route('contactanos.index')->with('info', 'Mensaje enviado');

          with crea el mensaje de sesión.

          En la vista mostramos un alerta cuando haya un mensaje de sesión:

          @if (session('info'))
                <script>
                      alert("{{ session('info') }}")
                </script>
          @endif

     

  • Walter

    Walter hace 2 años

    ? Tercera Parte

     

     ? Rescatamos el contenido del formulario para mostrarla en el correo que se envía.

          Si agregamos una propiedad en ContactanosMailable

          public $contacto = "Esta es la información de contacto";

          Cualquier propiedad que incluyamos en esta clase va a poder ser accedida desde el correo electrónico.

          Entonces si vamos a la vista contactanos.blade.php podemos imprimir esa propiedad:

          <p>{{ $contacto }}</p>

     

          La forma que tenemos de pasar información a nuestro correo es la siguiente: Nos centramos en el controlador ContactanosController y en el método store recuperamos la información que se está mandando desde el formulario a través del objeto Request $request, cuando instanciamos la clase ContactosMailable le pasamos esa información al constructor $request->all().

          Ahora recibimos esa información en el constructor de ContactanosMailable a través de $contacto:

          public function __construct($contacto) {
                $this->contacto = $contacto;
          }

          En la vista entonces ahora escribimos:

          <p><strong>Nombre: </strong> {{ $contacto['nombre'] }}</p>
          <p><strong>Correo: </strong> {{ $contacto['correo'] }}</p>
          <p><strong>Mensaje: </strong> {{ $contacto['mensaje'] }}</p>

          

  • Walter

    Walter hace 2 años

    ? Segunda Parte

     

    ? Creamos la vista index.blade.php en resources\views\contactanos\

    @extends('layouts.plantilla')
    @section('title', 'Contáctanos')
    @section('content')
    <h1>Déjanos un mensaje</h1>
    <form action="{{ route('contactanos.store') }}" method="POST">
    	@csrf
    	<label>
    		Nombre:
    		<br>
    		<input type="text" name="name">
    	</label>
    	<br>
    	<label>
    		Correo:
    		<br>
    		<input type="mail" name="correo">
    	</label>
    	<br>
    	<label>
    		Mensaje:
    		<br>
    		<textarea name="mensaje" rows="4" ></textarea>
    	</label>
    	<br>
    	<button type="submit">Enviar mensaje</button>
    </form>
    @endsection

     

    ? Creamos la ruta encargada de procesar lo que le enviamos desde el formulario:

    Route::post('contactanos', [ContactanosController::class, 'store'])
    	->name('contactanos.store');

     

  • Walter

    Walter hace 2 años

    ? Primera Parte

     

    ? Agregamos un enlace al menú de navegación en layouts/partials/header.blade.php

    <li>
    	<a 
    		href="{{ route('contactanos.index') }}" 
    		class="{{ request()->routeIs('contactanos.index') ? 'active' : '' }}"
    	>Contáctanos</a>
    </li>

     

    ? Creamos un controlador para administrar la ruta:

    php artisan make:controller ContactanosController

          Le agregamos los métodos index() para mostrar un formulario y store() para procesar el formulario y enviar el correo electrónico:

          use App\Mail\ContactanosMailable;
          use Illuminate\Support\Facades\Mail;
    
          public function index() {
                return view('contactanos.index');
          }
    
          public function store(Request $request) {
                $correo = new ContactanosMailable($request->all());
                Mail::to('victor.aranaf92@gmail.com')->send($correo);
                return "Mensaje enviado.";
          }

     

    ? Configuramos la ruta en web.php:

          use App\Http\Controllers\ContactanosController;
          Route::get('contactanos', [ContactanosController::class, 'index'])
                ->name('contactanos.index');