• Время чтения ~8 мин
  • 20.01.2023

Это гостевой пост от Bacancy

Tired of creating boring and tiring Interfaces using traditional methods? Bring in all your attention here as we come up with a tech tutorial on executing the CRUD-операции с использованием Laravel Livewire. It is the simple things that matter; these steps to create, update, and delete records with the Livewire package make it a piece of cake to create Interfaces.

Введение в Laravel Livewire

Прежде чем мы начнем с учебника Laravel Livewire CRUD, давайте разберемся с Livewire, а также с тем, что и как он используется.

Что такое LiveWire?

Laravel Livewire позволяет создавать интерфейсы с удобством Laravel. Livewire — это фреймворк с полным стеком, который упрощает сложность, связанную с Vue или React. Первая версия livewire была выпущена в феврале 2020 года.

В этом блоге мы представим CRUD operations using Laravel Livewire включая все необходимые шаги, необходимые для реализации livewire в Laravel 9. Перед этим вы можете захотеть обновиться с Laravel 8 до 9.

Предварительные условия и настройка для операций Laravel Livewire CRUD

Composer установлен в вашей системе (просто нажмите команду «composer» в терминале, чтобы проверить, правильно ли установлен композитор). Вы можете получить Composer здесь (https://getcomposer.org/), если у вас его еще нет.

Как выполнять операции CRUD с помощью Laravel Livewire?

Здесь мы показали, как вы можете реализовать пакет Livewire с последней версией Laravel (v 9.19) и последовательно выполнять функции создания, обновления и удаления с помощью пакета.

1. Создайте приложение laravel

Поскольку вы знакомы с созданием приложения laravel с помощью терминала, откройте терминал и выполните приведенную ниже команду, а затем создайте новое приложение laravel в своем каталоге.

composer create-project --prefer-dist laravel/laravel application_name_here

2. Настройте детали базы данных

Открыть .env file which is located in the root folder, if .env is not existed then run the below command to make a copy from the .env-example

cp .env .env-example

Вам нужно создать новую базу данных, то же имя базы данных, которое вы должны указать в DB_DATABASE, а также заменить остальную часть переменной .env в зависимости от вашей системы.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>

3. Теперь перейдите к установке пакета Livewire.

Перейдите в корневой каталог приложения и выполните приведенную ниже команду, чтобы установить пакет livewire.

composer require livewire/livewire

Нам нужно включить стиль и сценарий livewire (на каждую страницу, которая будет использовать Livewire).

<head>
        # other styles here
        @livewireStyles
    </head>
    <body>
        # other body parts here
        @livewire(‘<component name here>’)/You can include component anywhere in your app
       @livewireScripts
    <script src="https://www.bacancytechnology.com/blog/wp-content/cache/min/1/b810c1e775732c06a03141e7fcdf81a0.js" data-minify="1" defer></script></body>

4. Создайте миграцию и модель

We need to create migration for the «сообщения» table and also we will create a model for posts table.

Пожалуйста, выполните приведенную ниже команду, чтобы создать файл миграции. После выполнения приведенной ниже команды новый файл будет создан в папке базы данных/миграции.

php artisan make:migration create_posts_table

Замените приведенный ниже код в create_posts_table файл миграции:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable();
            $table->text('description')->nullable();
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
};

Запустите приведенную ниже команду, чтобы создать таблицу в базе данных с указанными столбцами в миграции, после выполнения приведенной ниже команды вы сможете увидеть новые “posts” таблица в базе данных.

php artisan migrate

Теперь мы создадим модель поста, используя приведенную ниже команду. Выполнив приведенное ниже, вы сможете просмотреть новый файл модели в разделе приложение/Модели папка:

php artisan make:model Post

Открыть приложение/Модели/Post.php и замените приведенным ниже кодом

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
    protected $fillable = [
        'title', 'description'
    ];
      public $timestamps = true;
}

5. Создайте компонент Post

Теперь мы собираемся создать компонент записи, используя приведенную ниже команду.

php artisan make:livewire post

После выполнения вышеуказанной команды вы сможете увидеть новую папку Livewire в папке app/Http и resources/views.

Вывод вышеуказанной команды:

COMPONENT CREATED
CLASS: app/Http/Livewire/Post.php
VIEW:  resources/views/livewire/post.blade.php

Теперь откройте приложение\Http\Livewire\Post.php и обновите следующий код в этом файле:

<?php
namespace App\Http\Livewire;

use Livewire\Component;
use App\Models\Post as Posts;

class Post extends Component
{
    public $posts, $title, $description, $postId, $updatePost = false, $addPost = false;

    /**
     * delete action listener
     */
    protected $listeners = [
        'deletePostListner'=>'deletePost'
    ];
    /**
     * List of add/edit form rules
     */
    protected $rules = [
        'title' => 'required',
        'description' => 'required'
    ];
    /**
     * Reseting all inputted fields
     * @return void
     */
    public function resetFields(){
        $this->title = '';
        $this->description = '';
    }
    /**
     * render the post data
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
     */
    public function render()
    {
        $this->posts = Posts::select('id', 'title', 'description')->get();
        return view('livewire.post');
    }
    /**
     * Open Add Post form
     * @return void
     */
    public function addPost()
    {
        $this->resetFields();
        $this->addPost = true;
        $this->updatePost = false;
    }
     /**
      * store the user inputted post data in the posts table
      * @return void
      */
    public function storePost()
    {
        $this->validate();
        try {
            Posts::create([
                'title' => $this->title,
                'description' => $this->description
            ]);
            session()->flash('success','Post Created Successfully!!');
            $this->resetFields();
            $this->addPost = false;
        } catch (\Exception $ex) {
            session()->flash('error','Something goes wrong!!');
        }
    }
    /**
     * show existing post data in edit post form
     * @param mixed $id
     * @return void
     */
    public function editPost($id){
        try {
            $post = Posts::findOrFail($id);
            if( !$post) {
                session()->flash('error','Post not found');
            } else {
                $this->title = $post->title;
                $this->description = $post->description;
                $this->postId = $post->id;
                $this->updatePost = true;
                $this->addPost = false;
            }
        } catch (\Exception $ex) {
            session()->flash('error','Something goes wrong!!');
        }
    }
    /**
     * update the post data
     * @return void
     */
    public function updatePost()
    {
        $this->validate();
        try {
            Posts::whereId($this->postId)->update([
                'title' => $this->title,
                'description' => $this->description
            ]);
            session()->flash('success','Post Updated Successfully!!');
            $this->resetFields();
            $this->updatePost = false;
        } catch (\Exception $ex) {
            session()->flash('success','Something goes wrong!!');
        }
    }
    /**
     * Cancel Add/Edit form and redirect to post listing page
     * @return void
     */
    public function cancelPost()
    {
        $this->addPost = false;
        $this->updatePost = false;
        $this->resetFields();
    }
    /**
     * delete specific post data from the posts table
     * @param mixed $id
     * @return void
     */
    public function deletePost($id)
    {
        try{
            Posts::find($id)->delete();
            session()->flash('success',"Post Deleted Successfully!!");
        }catch(\Exception $e){
            session()->flash('error',"Something goes wrong!!");
        }
    }
}

Теперь создайте ресурсы/представления/home.blade.php и обновите следующий код в этом файле:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Livewire Crud</title>
    <link data-minify="1" href="https://www.bacancytechnology.com/blog/wp-content/cache/min/1/npm/[email protected]/dist/css/bootstrap.min.css?ver=1672663261" rel="stylesheet" crossorigin="anonymous">
    @livewireStyles
</head>
<body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <div class="container-fluid">
            <a class="navbar-brand" href="/">Livewire CRUD Blog</a>
        </div>
    </nav>
    <div class="container">
        <div class="row justify-content-center mt-3">
            @livewire('post')
        </div>
    </div>

    @livewireScripts
  </body>
</html>

Теперь откройте ресурсы/просмотры/livewire/post.blade.php и обновите следующий код в этом файле:

<div>
    <div class="col-md-8 mb-2">
        @if(session()->has('success'))
            <div class="alert alert-success" role="alert">
                {{ session()->get('success') }}
            </div>
        @endif
        @if(session()->has('error'))
            <div class="alert alert-danger" role="alert">
                {{ session()->get('error') }}
            </div>
        @endif
        @if($addPost)
            @include('livewire.create')
        @endif
        @if($updatePost)
            @include('livewire.update')
        @endif
    </div>
    <div class="col-md-8">
        <div class="card">
            <div class="card-body">
                @if(!$addPost)
                <button wire:click="addPost()" class="btn btn-primary btn-sm float-right">Add New Post</button>
                @endif
                <div class="table-responsive">
                    <table class="table">
                        <thead>
                            <tr>
                                <th>Name</th>
                                <th>Description</th>
                                <th>Action</th>
                            </tr>
                        </thead>
                        <tbody>
                            @if (count($posts) > 0)
                                @foreach ($posts as $post)
                                    <tr>
                                        <td>
                                            {{$post->title}}
                                        </td>
                                        <td>
                                            {{$post->description}}
                                        </td>
                                        <td>
                                            <button wire:click="editPost({{$post->id}})" class="btn btn-primary btn-sm">Edit</button>
                                            <button onclick="deletePost({{$post->id}})" class="btn btn-danger btn-sm">Delete</button>
                                        </td>
                                    </tr>
                                @endforeach
                            @else
                                <tr>
                                    <td colspan="3" align="center">
                                        No Posts Found.
                                    </td>
                                </tr>
                            @endif
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>

</div>

Нам нужно создать еще два файла под resources/views/livewire/ один — create.blade.php, а второй — update.blade.php.

После создания create.blade.php вы можете заменить его содержимым ниже

<div class="card">
    <div class="card-body">
        <form>
            <div class="form-group mb-3">
                <label for="title">Title:</label>
                <input type="text" class="form-control @error('title') is-invalid @enderror" id="title" placeholder="Enter Title" wire:model="title">
                @error('title')
                    <span class="text-danger">{{ $message }}</span>
                @enderror
            </div>
            <div class="form-group mb-3">
                <label for="description">Description:</label>
                <textarea class="form-control @error('description') is-invalid @enderror" id="description" wire:model="description" placeholder="Enter Description"></textarea>
                @error('description')
                    <span class="text-danger">{{ $message }}</span>
                @enderror
            </div>
            <div class="d-grid gap-2">
                <button wire:click.prevent="storePost()" class="btn btn-success btn-block">Save</button>
                <button wire:click.prevent="cancelPost()" class="btn btn-secondary btn-block">Cancel</button>
            </div>
        </form>
    </div>
</div>

После создания update.blade.php вы можете заменить его содержимым ниже

<div class="card">
    <div class="card-body">
        <form>
            <div class="form-group mb-3">
                <label for="title">Title:</label>
                <input type="text" class="form-control @error('title') is-invalid @enderror" id="title" placeholder="Enter Title" wire:model="title">
                @error('title')
                    <span class="text-danger">{{ $message }}</span>
                @enderror
            </div>
            <div class="form-group mb-3">
                <label for="description">Description:</label>
                <textarea class="form-control @error('description') is-invalid @enderror" id="description" wire:model="description" placeholder="Enter Description"></textarea>
                @error('description')
                    <span class="text-danger">{{ $message }}</span>
                @enderror
            </div>
            <div class="d-grid gap-2">
                <button wire:click.prevent="updatePost()" class="btn btn-success btn-block">Update</button>
                <button wire:click.prevent="cancelPost()" class="btn btn-secondary btn-block">Cancel</button>
            </div>
        </form>
    </div>
</div>

6. Определите маршруты

Open маршруты/web.php и обновите следующий код в этом файле:

Route::get('/',function(){
   return view('home');
});

7. Запустить проект

Теперь пришло время проверить приведенную выше демонстрацию в браузере, поэтому откройте свой терминал и выполните приведенную ниже команду из корневого каталога проекта.

php artisan serve

Вывод вышеуказанной команды будет таким, как показано ниже:

Запуск сервера разработки Laravel: http://127.0.0.1:8000

Итак, теперь откройте браузер и нажмите на созданную выше ссылку.

(Примечание: URL-адрес может зависеть от доступного порта в вашей системе).

Вот ссылка на репозиторий github https://github.com/kishanpatelbacancy/laravel-livewire-demo

Заключение

Когда мы подойдем к концу этого блога, поделитесь своими мыслями и отзывами об этих операциях CRUD, используя учебник Laravel Livewire. Если вы рассматриваете Laravel Livewire для разработки интерфейсов для ваших бизнес-идей, нанять разработчика Laravel от нас, поскольку у нас есть 1% лучших технических специалистов в мире. Наши разработчики имеют опыт работы с последними обновлениями, функциями и реализациями Laravel, и мы следуем процессам разработки Agile для вашего удобства.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297