Laravel LiveWire 2: нужно ли нам создавать новый класс или мы можем сделать как традиционный контроллер

Итак, это мой первый LiveWire обучающий проект.

Кстати, я создаю Компонент Livewire под названием Пользователь, используя php artisan make:livewire user

а потом вот что я получил

Первый User.php

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class User extends Component
{
    public function render()
    {
        return view('livewire.user.index'); //i've updated this
    }
}

Итак, я хочу создать пользователя на разных страницах. ПРИМЕЧАНИЯ. Я уже использую турболинки для SPA, и когда я создаю как традиционный контроллер Laravel, например

Web.php

Route::get('/user', User::class)->name('user.index');
Route::get('/user/create',[User::class, 'create'])->name('user.create');

User.php (компонент livewire)

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class User extends Component
{
    public function render()
    {
        return view('livewire.user.index');
    }

    // This is what i create
    public function create()
    {
        return view('livewire.user.create')
        ->extends('layouts.app')
        ->section('contents');
    }
}

Он не предоставляет мне родительские шаблоны (он не запускается в layout.app и не переходит к содержимому, он просто показывает пустые страницы), я попытался расширить его с помощью layouts.app и секция

layout / app.blade.php

    <div class="flex h-screen bg-gray-50 dark:bg-gray-900" :class="{ 'overflow-hidden': isSideMenuOpen }">
        @include('layouts.include._sidebar')
        <div class="flex flex-col flex-1 w-full">
            @include('layouts.include._navbar')
            <main class="h-full overflow-y-auto">
                <div class="container px-6 mx-auto grid">
                    {{-- {{ $slot }} --}}
                    @yield('contents')
                </div>
            </main>
        </div>
    </div>

Мой вопрос:

можем ли мы сделать как стандартный контроллер laravel с общедоступной функцией создания внутри пользовательского компонента ИЛИ нам нужно создать новый компонент под названием UserCreate? Спасибо!


person Wailan Tirajoh    schedule 29.04.2021    source источник


Ответы (2)


Вы можете справиться с этим по-разному, в зависимости от вас. Можно иметь компонент UserForm для обработки форм создания / редактирования, а также в вызове компонента User Create для рендеринга компонента UserForm для создания нового.

public function create()
{
   return redirect()->route('user.create');
}

в web.php

Route::get('/user/create', [UserForm::class])->name('user.create');
Route::get('/user/edit/{user?}', [UserForm::class])->name('user.edit');

и компонент UserForm

public $email, $name;
public $user;

public $option = '';
public function mount($user = null)
{
  if(is_null($user)) {
    // some initialization
    $this->option = 'create';
  }
  else {
    $this->user = User::find($user);
    $this->option = 'edit';
  }  
}

public function render()
{
   return view('user-form');
}

public funcion store()
{
   if($this->option == 'create') {
       //create handler
   }
   else {
       //edit handler
   } 
}

вместо этого используйте перенаправление, вы можете использовать модальные окна и отображать UserForm внутри модального окна, которое есть в компоненте User. Как я уже говорил, это можно сделать разными способами

person Prospero    schedule 29.04.2021
comment
проблема в том, что я не фанат использования модального окна. Я хочу перейти на другую страницу, поэтому, если это другая страница, мы должны создать новый компонент? как вы сказали, я должен сделать компонент пользовательской формы для создания / редактирования, как вы сказали - person Wailan Tirajoh; 30.04.2021
comment
Хорошо, как я уже сказал, это зависит от вас. В этом случае вы визуализируете компонент создания / редактирования как компонент полной страницы. Другой - вложенным компонентом (модальные окна, выпадающие переключатели и т. Д.). Но да, в моем примере вам нужен другой компонент ... это позволяет повторно использовать компонент и другие дескрипторы. - person Prospero; 30.04.2021
comment
после исследования в livewire, я думаю, что модальный режим важен и имеет большое значение для повторного использования компонента, как вы сказали, так что я думаю, что это ответ, который я ищу. Благодарность :) - person Wailan Tirajoh; 30.04.2021
comment
это хорошо, счастливая треска - person Prospero; 30.04.2021

Вы можете использовать livewire как полностраничные компоненты или компоненты, загруженные в ваше представление с <livewire:component-name />

У вас может быть только сгенерированный Livewire контроллер User.php или у вас может быть классический контроллер Laravel, из которого вы возвращаете представление лезвия, и в своем представлении лезвия вы можете загрузить компонент livewire с помощью <livewire:component-name />.

В вашем случае я думаю, что в методе рендеринга вы должны вернуть livewire.user, а в вашем представлении клинка загрузить его, как указано выше.

person Marian Pop    schedule 29.04.2021
comment
В этом случае я хочу создать одностраничное приложение, поэтому да, я выбираю компонент / контроллер, сгенерированный livewire. поэтому у меня есть статическая навигационная панель, боковая панель и динамический контент, который можно изменить (мы можем выбрать управление пользователями / управление элементами / что-то еще для контента). Как вы думаете, в этом случае его пользователь, я хочу создать страницу, должен ли я создать новый компонент, такой как UserCreate.php, или я могу сделать его как классический контроллер laravel, создав общедоступную функцию внутри userp.php и вызовите представление? - person Wailan Tirajoh; 30.04.2021
comment
Как классический контроллер laravel. Вы определяете методы в своем контроллере Livewire и связываете их с wire:click в вашем представлении. - person Marian Pop; 30.04.2021
comment
о, хорошо, поэтому я делаю общедоступную функцию create с возвратом представления создания пользователя, а в представлении (представление пользователя) я привязываю кнопку с проводом: щелкните (это ‹a href› как классическая ссылка на другую страницу или другой подход? - person Wailan Tirajoh; 30.04.2021
comment
Вот пример привязки данных в Livewire: laravel-livewire.com/docs /2.x/properties#data-binding - person Marian Pop; 30.04.2021
comment
Спасибо за пример и попытку ответить на мой вопрос. Я думаю, что получил свой ответ, я заплачу вам за усилия, которые вы приложили :) - person Wailan Tirajoh; 30.04.2021