Как сделать запрос репозитория в Laravel? - PullRequest
2 голосов
/ 02 августа 2020

Я использую шаблон репозитория в laravel для извлечения записей из таблицы, но получаю сообщение об ошибке, например

"Target [App \ Repositories \ ThirdPartyRepository] не может быть создан при создании [App \ Http \ Контроллеры \ Dashboardcontroller]. "

Это следующая структура, которая у меня есть

app ->
  Repositories
     ->Thirdpartyrepository.php
     -> Thirdpartyrepositoryinterface.php
     -> ThirdpartyServiceProvider.php

Thirdpartyrepositoryinterface. php

    namespace App\Repositories;
    
    interface ThirdpartyRepositoryInterface
    {
        
        public function getAll();
        
    }

Thirdpartyrepository. php

    namespace App\Repositories;
    
    abstract class ThirdPartyRepository implements ThirdpartyRepositoryInterface
    {
        
        public function getAll(){
            $getcmp= DB::table('xyz')
                ->orderBy('id', 'desc')
                ->select('name', 'id', 'created_at')
                ->get();
            return $getcmp;
        }
        
    }

ThirdpartyServiceProvider. php

    namespace App\Repositories;
    use Illuminate\Support\ServiceProvider;
    class ThirdpartyServiceProvider extends ServiceProvider
    {
        
        public function register(){
            $this->app->bind(
                'App\Repositories\ThirdpartyRepositoryInterface',
                'App\Repositories\ThirdPartyRepository'
            );
        }
    }

Контроллер приборной панели. php

    use App\Repositories\ThirdPartyRepository;
        protected $thirdparty;
        public function __construct(ThirdPartyRepository $thirdparty){
                $this->thirdparty= $thirdparty;
            }
    
        public function getproducts(){
                $getCompanies=$this->thirdparty->getAll();
                dd ($getCompanies);
        }

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Чтобы подробно объяснить мой комментарий, в вашем контроллере Dashboard вы вводите реализацию вместо интерфейса. Ваш текущий код:

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

Главное преимущество использования интерфейсов состоит в том, что они позволяют абстрагироваться от вашего кода. Поскольку вы вводите реализацию, это преимущество теряется. Скажем, например, когда вы пишете новую реализацию, вам нужно будет изменить этот контроллер. Классы должны быть максимально закрыты для модификации (принцип SOLID).

Вам нужно будет изменить этот метод на:

public function __construct(Thirdpartyrepositoryinterface $thirdparty){ //inject interface
  $this->thirdparty= $thirdparty;
}

И мой третий комментарий: вместо абстрактного класса , у вас должен быть обычный класс, реализующий интерфейс.

class ThirdPartyRepository implements ThirdpartyRepositoryInterface //remove abstract
{ 
    public function getAll(){

И вам нужно добавить вашего поставщика услуг в массив поставщиков в config. php.

'providers' => [
    ...
    App\Providers\ThirdpartyServiceProvider::class, //your new service provider.

],
0 голосов
/ 02 августа 2020

Проблема в том, что вы пытаетесь привязать абстрактный класс к интерфейсу. Измените

abstract class ThirdPartyRepository

на

class ThirdPartyRepository

, а также вы должны ввести интерфейс, а не конкретный класс, подобный этому

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

В противном случае вся ваша цель использования контрактов для привязка бессмысленна. Привязать интерфейс к реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...