70

この質問が何度も聞かれたことは知っていますが、どの回答も役に立ちませんでした。

Laravel 5で例外が発生しています

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

私が成功せずにやったこと:

  • プロバイダーに登録App\Providers\AppRepositoryProviderするapp.php
  • php artisan clear-compiled
  • MyService のリポジトリのインターフェイスを置き換えればすべてうまくいきますが、それは間違っていると感じています (IoC コンテナーで処理する必要がありますか?)。

構造:

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();
}

アプリ\リポジトリ\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/"
        }
    },
4

12 に答える 12

5

この問題は、以下の例のように app/providers/AppServiceProvider にリポジトリを追加することで解決されます。

public function register()
{
    $this->app->singleton(UserRepository::class, EloquentUser::class);
 }

名前空間を忘れないでください

use Test\Repositories\EloquentUser;
use Test\Repositories\UserRepository;

それは私のために働いた

于 2020-01-09T13:56:56.970 に答える
1

これは、クラスの _constructor がプライベートと宣言されているか、ブロックされていることによっても発生する可能性があることに注意してください...コンストラクターを呼び出すことができない場合、バインディングは失敗します

于 2017-03-30T23:08:46.620 に答える
1

次のコマンドを実行します。

composer dump-autoload

このコマンドは、以前に同じ問題を抱えていた他のすべてのベンダーと一緒にlaravel autoloadクラスを再マップします。これにより、最適化のために「-o」パラメーターと一緒に使用できるトリックが実行されました。

于 2020-04-23T14:48:35.140 に答える