2015-02-18 2 views
14

Я получаю эту ошибку:Цель не является реальной. Laravel 5 - App привязки поставщика услуг

BindingResolutionException in compiled.php line 1029: 

Target [App\Models\Contracts\Repositories\IUserRepository] is not instantiable. 

Мой код выглядит следующим образом:

Интерфейс:

namespace App\Models\Contracts\Repositories; 

use App\Models\Objects\DTO\User; 

interface IUserRepository 
{ 
    function Create(User $user); 
} 

Бетон:

namespace App\Models\Concrete\Eloquent; 

use App\Models\Contracts\Repositories\IUserRepository; 
use App\Models\Objects\DTO\User; 

class EqUserRepository implements IUserRepository 
{ 
    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    public function Create(User $user) 
    { 
     return User::create([ 
        'first_name' => $user->first_name, 
        'last_name' => $user->last_name, 
        'username' => $user->username, 
        'email' => $user->email, 
        'password' => bcrypt($user->password), 
       ]); 
    } 

} 

Поставщик услуг:

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider { 

    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register any application services. 
    * 
    * This service provider is a great spot to register your various container 
    * bindings with the application. As you can see, we are registering our 
    * "Registrar" implementation here. You can add your own bindings too! 
    * 
    * @return void 
    */ 
    public function register() 
    { 

      $this->app->bind(
        'App\Models\Contracts\Repositories\IUserRepository', 
        'App\Models\Concrete\Eloquent\EqUserRepository' 
      ); 
    } 

} 

Контроллер:

namespace App\Http\Controllers\Auth; 

use App\Http\Controllers\Controller; 
use Illuminate\Contracts\Auth\Guard; 
use Illuminate\Contracts\Auth\Registrar; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

use App\Models\Contracts\Repositories\IUserRepository; 
use App\Models\Objects\DTO\User; 

class AuthController extends Controller 
{ 
    protected $auth; 
    private $userRepository; 

    public function __Construct( 
      Guard $auth, 
      IUserRepository $userRepo) 
    { 
    ... 

структура папок

enter image description here

Я также видел, что я, возможно, придется объявить пространство имен в моей composer.json, Поэтому я пробовал следующее, а также просто следующее:

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

, а затем побежал composer dump-autoload

Любые идеи, что я забываю делать?

+0

Я переместил конкретный репозиторий в папку служб и дал ему это пространство имен. По-прежнему такая же ошибка. – Jimmyt1988

ответ

16

Я заметил, что compiled.php не обновлялся.

Выполнить эту функцию в CMD строке на корневой папке проекта:

php artisan clear-compiled 
+0

Это было очень полезно –

+0

Мне пришлось запустить еще несколько команд, чтобы очистить кеш и оптимизировать. 'php artisan config: clear' ' php artisan clear-compiled' 'php artisan optimize' ' php artisan config: cache' –

5

Если вы запустите в ниже ошибки:

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

Очистить кэш конфигурации с:

php artisan config:clear 
+0

Кажется, вы можете мне помочь. Посмотрите на это: https://laracasts.com/discuss/channels/laravel/how-can-i-solve-target-apprepositoriesnewsreposi –