【问题标题】:Laravel 5 target is not instantiableLaravel 5 目标不可实例化
【发布时间】:2026-01-02 01:15:02
【问题描述】:

关于这个主题已经问了多个问题,但我仍然有这个问题,我不知道问题是什么。

我想实现我可以实例化一个接口而不是一个实现。

我使用的是 Laravel 5,这是代码/结构:

在应用程序中,我创建了一个 Contracts 文件夹。在这个文件夹中,我有 Messenger.php:

Messenger.php

<?php namespace App\Contracts;

interface Messenger {

    public function goodmorning($name);

}

在我拥有的应用程序/服务中 DailyMessenger.php

<?php namespace App\Services;

use App\Contracts\Messenger;

class DailyMessenger implements Messenger {

    public function goodmorning($name)
    {
        return 'Goodmorning '. $name;
    }

}

现在我想在我的控制器中实例化接口:

public function __construct(Messenger $messenger)
    {
        $this->messenger = $messenger;
    }

现在,如果我按照 Laravel 网站上的文档进行操作,我应该只需要在服务容器中注册它,我在现有的 AppServiceProvider.php

中执行此操作
public function register()
    {
        $this->app->bind(
            'Illuminate\Contracts\Auth\Registrar',
            'App\Services\Registrar'
        );

        $this->app->bind('App\Contacts\Messenger', 'App\Services\DailyMessenger');
    }

如果我访问映射到控制器的适当路由,我会收到错误:

BindingResolutionException in Container.php line 785:
Target [App\Contracts\Messenger] is not instantiable.

我想我已经准确地遵循了 Laravel 文档,但我错过了什么?在此先感谢:-)

【问题讨论】:

    标签: php laravel dependency-injection ioc-container laravel-5


    【解决方案1】:

    您在绑定时似乎拼错了命名空间,使用了 App\Contacts 而不是 App\Contracts。应该是:

    $this->app->bind('App\Contracts\Messenger', 'App\Services\DailyMessenger');
    

    【讨论】: