Один интерфейс для многих репозиториев
Есть сервис App\Services\CarService, в котором нужно использовать репозитории с одним интерфейсом.
App\Repositories\RepositoryInterface
interface RepositoryInterface {
public function all();
public function paginate(array $params);
public function find(int $id);
public function create(array $data);
public function update(int $id, array $data);
public function delete(int $id);
}
App\Repositories\CarRepository
class CarRepository implements RepositoryInterface {
public function all(){}
public function paginate(array $params){}
public function find(int $id){}
public function create(array $data){}
public function update(int $id, array $data){}
public function delete(int $id){}
}
App\Repositories\ImageRepository
class ImageRepository implements RepositoryInterface {
public function all(){}
public function paginate(array $params){}
public function find(int $id){}
public function create(array $data){}
public function update(int $id, array $data){}
public function delete(int $id){}
}
App\Repositories\SomeRepository
class SomeRepository implements RepositoryInterface {
public function all(){}
public function paginate(array $params){}
public function find(int $id){}
public function create(array $data){}
public function update(int $id, array $data){}
public function delete(int $id){}
}
App\Services\CarService
class CarService{
public function __construct(RepositoryInterface $repository) {
$this->repository = $repository;
}
}
app/Providers/CarServiceProvider.php
class CarServiceProvider extends ServiceProvider {
public function register() {
$this->app->when(CarService::class)
->needs(RepositoryInterface::class)
->give(function ($app) {
return $app->make(CarRepository::class); // как можно привязать к примеру ImageRepository?
});
//к примеру
$this->app->when(CarService::class)
->needs(RepositoryInterface::class(ImageRepository::class)) //ImageRepository реализует также RepositoryInterface, и нужно их как-то различать
->give(function ($app) {
return $app->make(ImageRepository::class);
});
}
...
}
Подскажите, как в сервисе App\Services\CarService можно обращаться к репозиториям, у которых один интерфейс?
т.е. как нужно делать привязку в сервис-провайдере?
или у каждого репозитория должен быть свой интерфейс?