Laravel - форма обратной связи

воскресенье, 13 января 2019 09:10:41, написал Admin

Как создать страницу контактов (форму обратной связи) для отправки писем с сайта на Laravel.
После прочтения этого поста вы сможете легко создавать свои собственные страницы форм с минимальным количеством кода, который вам потребуется написать.

Генерируем контроллер

php artisan make:controller ContactController

Генерируем форму 

php artisan make:request ContactFormRequest

Генерируем класс для уведомлений

php artisan make:notification InboxMessage

Генерируем модель для контактов админа

php artisan make:model Admin

Заполняем поля в .env

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=YOURGMAILACCOUNT@gmail.com
MAIL_PASSWORD=yourpassword
MAIL_ENCRYPTION=ssl

В routes/web.php добавляем

Route::get('/contact', 'ContactController@show');
Route::post('/contact',  'ContactController@mailToAdmin'); 

Листинг ContactController

<?php

namespace App\Http\Controllers;

use App\Notifications\InboxMessage;
use App\Http\Controllers\Controller;
use App\Http\Requests\ContactFormRequest;
use App\Admin;

class ContactController extends Controller
{
    public function show()
    {
        return view('contact');
    }

    public function mailToAdmin(ContactFormRequest $message, Admin $admin)
    {
        //send the admin an notification
        $admin->notify(new InboxMessage($message));
        // redirect the user back
        return redirect()->back()->with('message', 'Спасибо за обращение! Ваше сообщение успешно отправлено администратору сайта!');
    }
}

Листинг App/Http/Requests/ContactFormRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ContactFormRequest extends FormRequest
{

    public function authorize()
    {
        return true;
    }


    public function rules()
    {
        return [
            'name' => 'required|max: 255',
            'email' => 'required|email|max: 255',
            'message' => 'required',
        ];
    }
}

Листинг config/admin.php

return [
   
    'email' => 'example@gmail.com',
    'name' => 'your_name',
     
];

Листинг App\Admin

namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
    use Notifiable;

    protected $admin;
    protected $email;
	
    public function __construct() {
        $this->admin = config('admin.name');
        $this->email = config('admin.email');
    }
}

Листинг App/Notifications/InboxMessage.php

 <?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use App\Http\Requests\ContactFormRequest;

class InboxMessage extends Notification
{
    use Queueable;

    protected $message;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct(ContactFormRequest $message)
    {
        $this->message = $message;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject(config('admin.name') . ", новое сообщение с сайта dmitxe.ru!")
            ->greeting(" ")
            ->salutation(" ")
            ->from(config('mail.username'), 'no-reply')
            ->line('Имя: ' . $this->message->name)
            ->line('E-mail: ' . $this->message->email)
            ->line('Сообщение: ')
            ->line($this->message->message);
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

В лайоуте проверяем csrf token

<!DOCTYPE html>
<html lang="{{ config('app.locale') }}">
<head> 
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
	<meta name="viewport" content="width=device-width, initial-scale=1">

	<!-- CSRF Token -->
	<meta name="csrf-token" content="{{ csrf_token() }}">

	<title>{{ config('app.name') }}</title>
	<!-- Styles -->
	<link href="/css/app.css" rel="stylesheet">
	
	<!-- Scripts -->
	<script>
		window.Laravel = {!! json_encode([
		'csrfToken' => csrf_token(),
		]) !!};
	</script>
	<script src="/js/app.js"></script>
</head>
	
<body>
@yield('content')
</body>

Листинг /resource/views/contact.blade.php

 @extends('layout')

@section('title', 'Контакты')

@section('breadcrumbs', Breadcrumbs::render('contact'))

@section('content')
    <div class="container">
        <h1 class="mb-2 text-left">Форма обратной связи</h1>

        @if(session('message'))
            <div class='alert alert-success'>
                {{ session('message') }}
            </div>
        @endif

        <div class="col-12 col-md-6">
            <form class="form-horizontal" method="POST" action="/contact">
                {{ csrf_field() }}
                <div class="form-group">
                    <label for="Name">Имя: </label>
                    <input type="text" class="form-control" id="name" placeholder="Ваше имя" name="name" required>
                </div>

                <div class="form-group">
                    <label for="email">Email: </label>
                    <input type="text" class="form-control" id="email" placeholder="john@example.com" name="email" required>
                </div>

                <div class="form-group">
                    <label for="message">Сообщение: </label>
                    <textarea type="text" class="form-control luna-message" id="message" placeholder="Текст письма" name="message" required></textarea>
                </div>

                <div class="form-group">
                    <button type="submit" class="btn btn-primary" value="Send">Отправить</button>
                </div>
            </form>
        </div>
    </div> <!-- /container -->
@endsection

По материалам статьи How to Make a Contact Page in Laravel 5.4 in Three Simple Steps

Laravel contacs Laravel
  

Поделиться статьей с друзьями:

  

Комментарии к статье