首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5-接口不可实例化

问Laravel 5-接口不可实例化
EN

Stack Overflow用户
提问于 2015-04-17 12:04:03
回答 12查看 99.1K关注 0票数 69

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

我在Laravel 5中遇到异常

代码语言:javascript
复制
BindingResolutionException in Container.php line 785:
Target [App\Contracts\CustomModelInterface] is not instantiable.

我做过但没有成功的事情:

如果我替换了providers

  • php artisan clear-compiled

  • Everything中存储库上的接口,则 container?).中的app.php

  • 注册App\Providers\AppRepositoryProvider可以正常工作,但我觉得这是错误的(是否应由MyService IoC处理

结构:

代码语言:javascript
复制
app
  - Contracts
    - CustomModelInterface.php
  - Models
    - CustomModel.php
  - Repositories
    - CustomModelRepository.php
  - Providers
    - AppRepositoryProvider.php
  - Services
    - MyService.php

App\Contracts\CustomModelInterface.php

代码语言:javascript
复制
<?php namespace App\Contracts;

interface CustomModelInterface {
    public function get();
}

App\Repositories\CustomModelRepository.php

代码语言:javascript
复制
<?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 (在控制器和存储库之间保留业务逻辑/层)

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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");
        }
    }
}

我的控制器看起来像:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
"autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "App\\Models\\": "app/Models/",
            "App\\Contracts\\": "app/Contracts/",
            "App\\Repositories\\": "app/Repositories/"
        }
    },
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2015-04-17 13:19:51

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

正确的文件是:

代码语言:javascript
复制
<?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 (具有意外的转义)。

票数 49
EN

Stack Overflow用户

发布于 2016-07-28 22:12:36

每次创建新的存储库/契约对时,我都要确保执行以下操作:

优化服务提供程序中使用的类(在config/app.php

  • php artisan

中复制/粘贴绑定一个新绑定

经过几个小时的无用调试,我列出了这个简短的清单。

票数 45
EN

Stack Overflow用户

发布于 2017-08-31 01:50:22

对我来说,我忘记了在app->providers->RepositoryServiceProvider方法中像这样绑定存储库

代码语言:javascript
复制
public function register()
{
    $this->app->bind(
        \App\Play\Contracts\PatientRepository::class,
        \App\Play\Modules\PatientModule::class
    );
}

确保您的RepositoryServiceProvider已在AppServiceProvider中注册。

代码语言:javascript
复制
public function register()
{   
    $this->app->register(RepositoryServiceProvider::class);
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29690056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档