Простой пример отправки формы в Laravel через AJAX jQuery
Отправка формы через AJAX в Laravel – это простой способ отправить данные без перезагрузки страницы, улучшив пользовательский опыт. В статье вы найдете понятный пример, как это сделать с использованием jQuery, чтобы форма отправлялась быстро и без лишних действий.
Вы узнаете, как правильно настроить AJAX-запросы в Laravel и интегрировать их с формами, что позволяет избежать перезагрузки страницы и сделать взаимодействие с пользователем более динамичным.
Шаг 1: добавляем маршруты
Прежде всего, добавим два маршрута в файл routes/web.php:
Route::get('contact-form', 'ContactController@create');
Route::post('contact-form', 'ContactController@store');Шаг 2: создаем модель и файл миграции
После выполнения приведенной ниже команды автоматически будут созданы файлы модели и миграции:
php artisan make:model Contact -mМодель формы «Контакты» находится в директории app (app/Contact.php), а файл миграции в нашем примере располагается в каталоге database/migrations/2019_09_02_161223_create_contacts_table.php.
Добавьте в файл миграции приведенный ниже код:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateContactsTable extends Migration
{
/**
* Запуск миграций
*
* @return void
*/
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->nullable();
$table->string('email')->nullable();
$table->string('mobile_number')->nullable();
$table->string('subject')->nullable();
$table->text('message')->nullable();
$table->timestamps();
});
}
/**
* Отмена миграций
*
* @return void
*/
public function down()
{
Schema::dropIfExists('contacts');
}
}Шаг 3: создаем контроллер
Перейдем к созданию контроллера для обработки запроса на стороне сервера. В контроллер мы вставим два метода – один отвечает за отображение формы «Контакты», а второй – за сохранение введенных в нее данных в БД.
Выполните в командной строке следующую команду:
php artisan make:controller ContactControllerСозданный контроллер находится в app/Http/Controllers/ContactController.php. Вставьте в него следующий код:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Contact;
class ContactController extends Controller {
public function create() {
return view('contact_form');
}
public function store(Request $request) {
$contact = new Contact;
$contact->name = $request->name;
$contact->email = $request->email;
$contact->subject = $request->subject;
$contact->mobile_number = $request->mobile_number;
$contact->message = $request->message;
$contact->save();
return response()->json(['success'=>'Form is successfully submitted!']);
}
}Шаг 4: создание Blade шаблона для формы запроса
На последнем этапе мы создаем шаблон Blade contact_form, он должен находиться в resources/views/contact_form.blade.php. Добавьте в него приведенный ниже код:
<html lang="en">
<head>
<title>Laravel Ajax jquery Validation Tutorial</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
</head>
<body>
<div class="container panel panel-default ">
<h2 class="panel-heading">Laravel Ajax jquery Validation</h2>
<form id="contactForm">
<div class="form-group">
<input type="text" name="name" class="form-control" placeholder="Enter Name" id="name">
</div>
<div class="form-group">
<input type="text" name="email" class="form-control" placeholder="Enter Email" id="email">
</div>
<div class="form-group">
<input type="text" name="mobile_number" class="form-control" placeholder="Enter Mobile Number" id="mobile_number">
</div>
<div class="form-group">
<input type="text" name="subject" class="form-control" placeholder="Enter subject" id="subject">
</div>
<div class="form-group">
<textarea class="form-control" name="message" placeholder="Message" id="message"></textarea>
</div>
<div class="form-group">
<button class="btn btn-success" id="submit">Submit</button>
</div>
</form>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
<script>
$('#contactForm').on('submit',function(event){
event.preventDefault();
let name = $('#name').val();
let email = $('#email').val();
let mobile_number = $('#mobile_number').val();
let subject = $('#subject').val();
let message = $('#message').val();
$.ajax({
url: "/contact-form",
type:"POST",
data:{
"_token": "{{ csrf_token() }}",
name:name,
email:email,
mobile_number:mobile_number,
subject:subject,
message:message,
},
success:function(response){
console.log(response);
},
});
});
</script>
</body>
</html>Все готово к запуску в браузере – обработка данных из формы этим методом не требует обновления и перезагрузки страницы. Обращайтесь в комментарии в случае затруднений.
Комментарии
Удивительно.
Laravel вроде такой крутой фреймворк, а код для такой простой вещи как ajax нужно писать полностью вручную, включая переборку всех полей формы.
Кстати лучше тогда не jQuery использовать, а обычный JS и метод fetch:
async function fetch_post()
{
const params = {
name: name,
email: email,
mobile_number: mobile_number,
subject: subject,
message: message
};
let elem = document.querySelector('#result');
elem.innerHTML = "loading...";
let response = await fetch('/contact-form',
{
method: 'POST',
body: new URLSearchParams(params).toString()
});
let result = await response.text();
console.log(result);
}
protected $table = 'contacts';
в app\Models не забудьте прописать
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
use HasFactory;
protected $table = 'contacts';
protected $guarded = false;
}
и провести миграции
ошибка 500