Laravel Livewire错误当我添加一个构造函数调用一个服务类

yhuiod9q  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(150)

我有一段代码想重用。我已经阅读了这篇Laravel cleaner code文章和另一篇Laravel Services Pattern文章,在这篇文章中,我意识到可以通过使用服务类在应用程序的多个地方重用代码。
在本例中,我在新文件夹app/Services/MyService中创建了一个新的MyService类。

namespace App\Services;

class MyService
{
    public function reuse_code($param){
       return void;
    }
}

当我想通过Livewire类组件中的构造函数调用类时,问题就出现了,如下所示:

<?php

namespace App\Http\Livewire;

use App\Services\MyService;
use Livewire\Component;
use Livewire\WithPagination;

class LivewireTable extends Component
{
    use WithPagination;

    private $myClassService;

    public function __construct(MyService $myService)
    {
        $this->myClassService = $myService;
    }

    public function render()
    {
       $foo = $this->myClassService->reuse_code($param);
       return view('my.view',compact('foo'));
    }
}

显示的错误如下:
传递给App\Http\Livewire\LivewireTable::__construct()的参数1必须是App\Services\MyService的示例,给定字符串
(但是,如果我使用一个trait,就没有问题了。但我担心我的特质会像以前的经历一样发生冲突)
我该怎么解决?我错过了什么?

oipij1gg

oipij1gg1#

Livewire的 Boot 方法在每次请求时运行,在组件示例化之后立即运行,但在调用任何其他生命周期方法之前运行
这是我的解决方案。

public bool $checkAllRecords = false;

public array $checkedRecords = [];

private MailService $service;

public function boot(MailInterface $service)
{
    $this->service = $service;
}

public function updatingCheckAllRecords($value)
{
    $this->checkRecords = $value ? (array) $this->service->getListData($this->perPage, $this->search)->pluck('id') : []
}
zour9fqk

zour9fqk2#

解决就像@IGP说的,在livewire文档中阅读到它说:

在Livewire组件中,您使用mount()而不是像您习惯的那样使用类构造函数__construct()。
所以,我的工作代码如下:

<?php
    
    namespace App\Http\Livewire;
    
    use App\Services\MyService;
    use Livewire\Component;
    use Livewire\WithPagination;
    
    class LivewireTable extends Component
    {
        use WithPagination;
    
        private $myClassService;
    
        public function mount(MyService $myService)
        {
            $this->myClassService = $myService;
        }
    
        public function render()
        {
           $foo = $this->myClassService->reuse_code($param);
           return view('my.view',compact('foo'));
        }
    }

相关问题