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 [email protected] 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' => '[email protected]', '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="[email protected]" 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