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