Inertia.js — это еще один способ создания SPA (одностраничного приложения). Это не фреймворк и не замена существующих способов. Вся прелесть Inertia.js заключается в том, что нам не нужно поддерживать отдельные API-маршруты, она автоматически передает данные с сервера на клиент как входные параметры для Vue. Вам будет более понятно, когда мы начнём создавать наше CRUD-приложение. CRUD (Create — Создание, Read — Чтение, Update — Обновление и Delete — Удаление). Inertia.js официально поддерживает React, VueJs, Svelte с бэкэндом Laravel, Rails. Мы же будем работать с Laravel и VueJs.
Шаг 01: Установка Laravel
Установите свежую версию фреймворка. Я устанавливаю Laravel 7, но вы также можете работать с Laravel 6.
composer create-project laravel/laravel laravel-inertia-crud
Шаг 02: Установите Laravel UI
Из Laravel 6 был удален UI-каркас и преобразован в отдельный пакет под названием laravel/ui
. Нам нужно его установить.
composer require laravel/ui
запустите эту команду для получения каркаса с аутентификацией и vue.
php artisan ui vue --auth
Устанавливаем npm-зависимости и компилим ресурсы
npm install && npm run dev
Шаг 03: Установка Laravel Inertia
Запустите эту команду для установки пакета Laravel Inertia.
composer require inertiajs/inertia-laravel
Создайте файл app.blade.php
в каталоге resources/views
.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/> <link href="" rel="stylesheet"/> <script src="" defer></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-12"> <h2 class="app-title">Laravel Inertia Js CRUD</h2> </div> </div> </div> <hr> <div class="container"> <div class="row"> @inertia </div> </div> </body> </html>
Примечание: Мы просто добавили inertia-директиву @inertia
, ничего больше не меняя.
устаналиваем inertia & inertia vue
npm install @inertiajs/inertia @inertiajs/inertia-vue
Cкопируйте этот код и вставьте его в файл resources/js/app.js
require('./bootstrap'); import { InertiaApp } from '@inertiajs/inertia-vue' import Vue from 'vue' Vue.use(InertiaApp) const app = document.getElementById('app') new Vue({ render: h => h(InertiaApp, { props: { initialPage: JSON.parse(app.dataset.page), resolveComponent: name => require(`./Pages/${name}`).default, }, }), }).$mount(app)
Примечание. Настройка Laravel Inertia.js завершена. Откройте командную строку и выполните эту команду для слежения за изменением ваших ресурсов и их автоматической компиляции.
npm run watch
Шаг 04: Ресурсный маршрут
Route::resource('admin/contacts', 'ContactController');
Шаг 05: Модель
Сделайте Модель Contact
для CRUD-приложения. В этой модели мы объявили public $timestamps = false
, потому что в нашей таблице отсутствуют поля created_at
и updated_at
.
namespace App; use Illuminate\Database\Eloquent\Model; class Contact extends Model { public $timestamps = false; protected $guarded = []; }
Шаг 06: CRUD-Контроллер
Создайте контроллер для CRUD-операций модели Contact
. Самое интересное, что нам не нужно создавать отдельный маршрут и контроллер для AJAX-операций. В этом контроллере мы всё будем делать как в обычной ванильной Laravel. Об остальном позаботиться магия.
namespace App\Http\Controllers; use App\Contact; use Illuminate\Http\Request; use Inertia\Inertia; class ContactController extends Controller { public function index() { $data = Contact::all(); return Inertia::render('contacts/index', ['data' => $data]); } public function store(Request $request) { Contact::create($request->all()); return redirect()->back(); } public function update(Request $request) { if ($request->has('id')) { Contact::find($request->input('id'))->update($request->all()); return redirect()->back(); } } public function destroy(Request $request) { if ($request->has('id')) { Contact::find($request->input('id'))->delete(); return redirect()->back(); } } }
Примечание: Все как обычно, за исключением того, что в методе index
мы используем рендер Inertia. Он отрендерит шаблон resources/js/Pages/contacts/index
. Теперь мы должны создать этот файл как обычный vue-компонент.
Шаг 07: CRUD-Шаблон
Создайте файл index.vue
в каталоге resources/js/Pages/contacts
:
<template> <div class="col-md-6"> <button class="btn btn-sm btn-primary" @click="openModal()">Add New</button> <table class="table table-bordered table-condensed"> <thead> <tr> <td>Name</td> <td>Phone</td> <td>Action</td> </tr> </thead> <tr v-for="row in data"> <td></td> <td></td> <td width="130"> <button @click="edit(row)" class="btn btn-sm btn-primary">Edit</button> <button @click="deleteRow(row)" class="btn btn-sm btn-danger">Del</button> </td> </tr> </table> <div class="modal fade" id="modal"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title">New Contact</h4> </div> <div class="modal-body"> <div class="form-group"> <label for="name">Name</label> <input class="form-control" required id="name" v-model="form.name"/> </div> <div class="form-group"> <label for="phone">Phone</label> <input class="form-control" required id="phone" v-model="form.phone"/> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" @click="closeModal()">Close</button> <button type="submit" class="btn btn-primary" v-show="!editMode" @click="save(form)">Save </button> <button type="submit" class="btn btn-primary" v-show="editMode" @click="update(form)">Update </button> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div><!-- /.modal --> </div> </template> <script> export default { props: ['data'], data() { return { editMode: false, form: { name: null, phone: null, }, } }, methods: { openModal: function () { $('#modal').modal('show') }, closeModal: function () { $('#modal').modal('hide') this.reset(); this.editMode=false; }, reset: function () { this.form = { name: null, phone: null, } }, save: function (data) { this.$inertia.post('/admin/contacts', data) this.reset(); this.closeModal(); this.editMode = false; }, edit: function (data) { this.form = Object.assign({}, data); this.editMode = true; this.openModal(); }, update: function (data) { if (!confirm('Sure')) return; data._method = 'PUT'; this.$inertia.post('/admin/contacts/' + data.id, data) this.reset(); this.closeModal(); }, deleteRow: function (data) { if (!confirm('Sure')) return; data._method = 'DELETE'; this.$inertia.post('/admin/contacts/' + data.id, data) this.reset(); this.closeModal(); } } } </script>
Наше приложение готово. Откройте другую командную строку и запустите сервер командой
php artisan serve
Страница доступна по адресу: http://localhost:8000/admin/contacts
Автор: Harun
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.