📜  laravel 无法创建类 viewmodel 的实例 - PHP (1)

📅  最后修改于: 2023-12-03 15:17:15.175000             🧑  作者: Mango

Laravel 无法创建类 ViewModel 的实例 - PHP

当在 Laravel 应用程序中使用 ViewModel 模式时,可能会遇到“无法创建类 ViewModel 的实例”的错误。这是一个常见的问题,通常是由以下几个因素引起的:

命名空间不正确

在ViewModel类的构造函数中,它需要以完全限定的名称引用Eloquent模型。 例如,假设我们有一个Post Eloquent模型,它在App \ Models命名空间中,那么构造函数看起来应该像这样:

public function __construct()
{
    $this->posts = Post::all();
}

请注意,我们引用了全局的Post类:Post::all(),而不是只使用Post::all()。 如果您使用了错误的命名空间,则会出现“类未定义”错误。

依赖项注入可能不正确

另一个常见的问题是依赖项注入。 如果您在ViewModel类的构造函数中需要注入其他类,则需要首先在您的类之外绑定它们。 例如,假设我们需要注入一个UserService:

public function __construct(UserService $service)
{
    $this->service = $service;
}

我们需要在我们的应用程序ServiceProvider类的boot()方法中绑定它:

public function boot()
{
    $this->app->bind(UserService::class, function ($app) {
        return new UserService();
    });
}

如果您的绑定不正确,则会出现类似“类未定义”的错误消息。

使用__construct()方法可能会受到限制

Laravel的依赖注入的重要特性是它允许您在构造函数中声明依赖关系并在创建实例时自动解析它们。 但是,某些情况下,你可能会发现这是不可能的。

例如,当使用控制器依赖注入时,您不能使用构造函数注入ViewModel。 Laravel控制器不允许你创建自己的构造函数。 相反,您可以使用resolve()方法或实现__invoke()方法来解析并创建ViewModel。

public function index(ViewModel $viewModel)
{
    return view('index', $viewModel());

    // 或者

    public function __invoke()
    {
        return response()->json([
            'foo' => 'bar'
        ]);
    }
}
结论

在使用ViewModel模式时,如果您遇到错误“无法创建类ViewModel的实例”,则有几个可能的原因。 第一种是您的命名空间不正确。 第二种是依赖项注入不正确。 第三种是使用__construct()方法可能会受到限制。通过检查可能引起错误的原因,您可以迅速解决和避免这种情况。