我知道这个问题被问了很多次,但没有一个答案对我有帮助.

我在拉维尔5号遇到了例外

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

我做过但没有成功的事:

  • app.php个提供者中注册App\Providers\AppRepositoryProvider
  • php artisan clear-compiled
  • 如果我在MyService中替换存储库上的接口,一切都会正常工作,但我觉得这是错误的(应该由IoC容器处理吗?).

struct :

app
  - Contracts
    - CustomModelInterface.php
  - Models
    - CustomModel.php
  - Repositories
    - CustomModelRepository.php
  - Providers
    - AppRepositoryProvider.php
  - Services
    - MyService.php

App\Contracts\CustomModelInterface.php

<?php namespace App\Contracts;

interface CustomModelInterface {
    public function get();
}

App\Repositories\CustomModelRepository.php

<?php namespace App\Repositories;

use App\Contracts\CustomModelInterface;
use App\Models\CustomModel;

class CustomModelRepository implements CustomModelInterface {

    private $Model;

    public function __construct(CustomModel $model) {
        $this->Model = $model;
    }

    public function get() {
        return 'result';
    }
}

App\Services\MyService.php(在控制器和存储库之间保持业务逻辑/层)

<?php namespace App\Services;

use App\Contracts\CustomModelInterface;

class MyService {

    private $Model;

    public function __construct(CustomModelInterface $customModel) {
        $this->Model= $customModel;
    }

    public function getAll() {
        return $this->Model->get();
    }
}

App\Providers\AppRepositoryProvider.php

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppRepositoryProvider extends ServiceProvider {

    public function boot() {}

    public function register() {
        $models = array(
            'CustomModel'
        );

        foreach ($models as $idx => $model) {
            $this->app->bind("App\Contracts\{$model}Interface", "App\Repositories\{$model}Repository");
        }
    }
}

我的控制器看起来像:

<?php namespace App\Http\Controllers;

use App\Services\MyService;

class SuperController extends Controller {

    private $My;

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

    public function getDetails() {
        return $this->My->getAll();
    }
}

composer.json

"autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "App\\Models\\": "app/Models/",
            "App\\Contracts\\": "app/Contracts/",
            "App\\Repositories\\": "app/Repositories/"
        }
    },

推荐答案

谢谢大家,但问题出在我的AppRepositoryProvider中.由于它是绑定异常,那么很明显问题出在绑定上:)

正确的文件是:

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppRepositoryProvider extends ServiceProvider {

    public function boot() {}

    public function register() {
        $models = array(
            'CustomModel',
            'CustomModel2',
            'CustomModel3'
        );

        foreach ($models as $model) {
            $this->app->bind("App\Contracts\\{$model}Interface", "App\Repositories\\{$model}Repository");
        }
    }
}

注意,我使用的是"App\Contracts\\{$model}Interface"(不是转义"{"符号),它生成的是正确的字符串App\Contracts\CustomModelInterface,而不是App\Contracts\{$model}Interface(意外转义).

Php相关问答推荐

获得客户S在WooCommerce为期1年的总支出

在php中有没有办法比较两个包含相同枚举类型的枚举数组

使用PHP阅读XML提要

Laravel:让所有用户在一年中的特定月份休息几天

WooCommerce基于元数据的自定义范围目录排序

如何在函数中定位WooCommerce产品循环

创建一个Woocommerce我的帐户订单页面,仅显示已完成的订单

用ajax获取文件 - CORS问题&;设置缓存?

防止在WordPress短代码中显示重复产品并请求代码更正

如何解决 Laravel 外键错误?

PHP 支持 APNG 文件吗?

服务器升级到新的mysql版本8.0.34后查询错误

为什么从一个页面到另一个页面都找不到 JQuery,因为它们使用相同的 twig 模板?

PHP向API发送curl请求

无法使用 slim 的父级容器

根据所选付款方式启用/禁用 WooCommerce 所需的 checkout 字段

WooCommerce 订单和邮箱通知的自定义产品描述

WooCommerce checkout 流程中基于所选选项添加自定义费用

自定义主键值未正确显示

为什么 AJAX 请求没有通过 is_ajax_request() codeigniter 的条件?