【问题标题】:Laravel LiveWire 2 : Do we have to make a new class or we can do like traditional ControllerLaravel LiveWire 2:我们是否必须创建一个新类或者我们可以像传统的控制器一样做
【发布时间】:2021-07-22 23:31:23
【问题描述】:

所以,这是我的第一个LiveWire 学习项目。

直截了当,我正在使用php artisan make:livewire user

制作一个名为UserLivewire 组件

然后这就是我得到的

第一个用户.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 使用了 turbolinks,当我像传统的 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');
    }
}

没有给我父模板(它没有运行到 layouts.app 并转到内容,它只是显示空白页),我试图用布局扩展它.app 和部分

layouts/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 的新组件?谢谢!

【问题讨论】:

    标签: php laravel controller components laravel-livewire


    【解决方案1】:

    您可以将 livewire 用作整页组件或使用 &lt;livewire:component-name /&gt; 加载到视图中的组件

    您只能使用 Livewire 生成的“控制器”User.php,或者您可以使用经典的 Laravel 控制器,从中返回刀片视图,然后在刀片视图中使用 &lt;livewire:component-name /&gt; 加载 livewire 组件。

    在您的情况下,我认为在渲染方法中您必须返回 livewire.user 并在您的刀片视图中加载它,如上所述。

    【讨论】:

    • 在这种情况下,我想制作单页应用程序,所以是的,我选择了 livewire 生成的组件/控制器。所以我有静态导航栏、侧边栏和动态内容,可以更改(我们可以为内容选择用户管理/项目管理/其他内容)。你认为对于这种情况它的用户,我想创建一个页面,我应该创建像 UserCreate.php 这样的新组件,还是我可以通过在 userp.php 中创建公共函数并调用视图来使其像经典的 laravel 控制器?
    • “像经典的 laravel 控制器”。您在 Livewire 控制器中定义方法,并在视图中将它们与wire:click 绑定。
    • 哦,好吧,所以我创建公共函数并返回创建用户视图,并在视图(用户视图)上绑定一个带有wire的按钮:单击(这是 像经典链接到其他页面或不同的方法?
    • 这是 Livewire 中数据绑定的示例:laravel-livewire.com/docs/2.x/properties#data-binding
    • 感谢您的示例和努力回答我的问题。我想我得到了答案,我会因为你付出的努力给你打分:)
    【解决方案2】:

    你可以通过不同的方式来处理这个问题,这取决于你。 可以有一个 UserForm 组件来处理创建/编辑表单,并在用户的 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');
    

    和用户窗体组件

    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。正如我告诉你的,这可以通过不同的方式来做到这一点

    【讨论】:

    • 问题是,我不喜欢使用模态。我想转到不同的页面,所以如果它的页面不同,我们必须制作新组件吗?就像你说的,我必须像你说的那样制作用户表单组件来创建/编辑
    • 好的,就像我告诉你的那样,这取决于你。在这种情况下,您将创建/编辑组件呈现为整页组件。另一个是嵌套组件(模式、下拉切换等)。但是是的,在我的示例中,您需要一个不同的组件...这允许您重用组件和其他句柄
    • 在 livewire 进行研究后,我认为 modal 是其中的一员,并且像你说的那样有很大一部分可重用组件,所以我认为这就是我要寻找的答案。谢谢:)
    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2021-08-31
    • 2015-12-27
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多