当我添加构造函数来调用服务类时,Laravel Livewire 错误

Posted

技术标签:

【中文标题】当我添加构造函数来调用服务类时,Laravel Livewire 错误【英文标题】:Laravel Livewire error when I add a constructor to call a service class 【发布时间】:2021-04-30 15:06:48 【问题描述】:

我有一段代码想要重用。我已经阅读了这篇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'));
    

显示的错误如下:

参数 1 传递给 App\Http\Livewire\LivewireTable::__construct() 必须是 App\Services\MyService 的实例,给定字符串

(但是,如果我使用一个特质,没有问题。但我担心我的特质会像以前的经验一样碰撞)

我该如何解决?我错过了什么?

【问题讨论】:

你如何称呼 Livewire 类?您是否尝试过使用mount() 而不是__construct() 确实,in the docs 是这么说的!那成功了。非常感谢! 【参考方案1】:

已解决 就像@IGP 说的那样,读到livewire docs 它说:

在 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'));
    

.

【讨论】:

是的,当您在 livewire 组件中时,您可以使用 mount() 方法注入服务类。【参考方案2】:

Livewire 的启动方法在每个请求上运行,在组件被实例化后立即运行,但在任何其他生命周期方法被调用之前

这是对我有用的解决方案。

【讨论】:

以上是关于当我添加构造函数来调用服务类时,Laravel Livewire 错误的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 为什么持久化类时必须提供一个不带参数的默认构造函数

调用类时所有函数都在运行(tkinter)[重复]

当 ArrayList 和构造函数/获取器存储 2 个其他类时,如何从一个类添加到 ArrayList

Laravel PhpUnit 依赖注入

类中嵌套另一个类时,调用构造,析构,拷贝,赋值运算符等函数的次序

如何使用 Laravel IoC 将数据库注入构造函数