2016-04-02 5 views
1

Я связал свой интерфейс под названием CustomerRepository с номером EloquentCustomerRepository. Это мой CustomerServiceProvider:Laravel Поставщик услуг не работает

public function register() 
    { 
     $this->app->bind(CustomerRepository::class,EloquentCustomerRepository::class); 
     $this->app->bind(PackageRepository::class,EloquentPackageRepository::class); 
    } 

Когда я пытаюсь создать его экземпляр в мой контроллер, как это:

<?php 

namespace App\Http\Controllers\api\v1; 

use Lsupport\repositories\api\v1\customer\CustomerRepository; 
use App\Http\Controllers\Controller; 
use Lsupport\customer\Customer; 
use App\Http\Requests; 

class CustomerController extends Controller 
{ 
    protected $CustomerRepository; 

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

Он выдает следующее сообщение об ошибке:

Target [Lsupport\repositories\api\v1\Customer\CustomerRepository] is not instantiable while building [App\Http\Controllers\api\v1\CustomerController].

Я также зарегистрированное в app.config :

App\Providers\CustomerServiceProvider::class, 

Что я делаю неправильно?

CustomerServiceProvider

<?php 

namespace App\Providers; 

use Lsupport\repositories\api\v1\customer\EloquentCustomerRepository; 
use Lsupport\repositories\api\v1\customer\EloquentPackageRepository; 
use Lsupport\repositories\api\v1\customer\CustomerRepository; 
use Lsupport\repositories\api\v1\customer\PackageRepository; 
use Illuminate\Support\ServiceProvider; 

class CustomerServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind(CustomerRepository::class,EloquentCustomerRepository::class); 
     $this->app->bind(PackageRepository::class,EloquentPackageRepository::class); 
    } 
} 

CustomerRepository

<?php 

    namespace Lsupport\repositories\api\v1\Customer; 

    interface CustomerRepository 
    { 
     public function create($request); 
    } 

**EloquentCustomerRepository** 

<?php 

namespace Lsupport\repositories\api\v1\customer; 

use Lsupport\repositories\api\v1\customer\CusteromRepositoryTrait; 
use Lsupport\repositories\api\v1\remain\RightTrait; 
use Lsupport\repositories\api\v1\remain\JsonTrait; 
use Lsupport\customer\Customer; 

class EloquentCustomerRepository implements CustomerRepository 
{ 
    use JsonTrait; 
    use RightTrait; 
    use CustomerRepositoryTrait; 

    code..... 
+0

Мое понимание заключается в том, что второй аргумент bind() должен быть закрытием 'https: // laravel.com/docs/5.2/container # binding' – Chris

+0

Попробуйте использовать' $ this-> app-> bind ('CustomerRepository ',' EloquentCustomerRepository '); '. Если вы используете 'EloquentCustomerRepository' вместо' CustomerRepository', на контроллере это работает? –

+0

@milz Да! когда я использую EloquentCustomerRepository, он работает. Что я делаю не так? – Jamie

ответ

1

Хорошо, первая вещь, которую я замечаю, что вы, вероятно, хотят того же пространства имен на интерфейсе и на классе. Таким образом, пространство имен EloquentCustomerRepository должно быть

namespace Lsupport\repositories\api\v1\Customer; 

и не

namespace Lsupport\repositories\api\v1\customer; 

(с меньшим заказчиком).

Теперь на вашем CustomerServiceProvider, вы должны использовать:

public function register() 
{ 
    $this->app->bind('Lsupport\repositories\api\v1\Customer\CustomerRepository', 'Lsupport\repositories\api\v1\Customer\EloquentCustomerRepository'); 
} 

Убедитесь, что вы запустите composer dumpautoload -o в командной строке.

+0

Спасибо, очень мило! – Jamie

Смежные вопросы