Как использовать репозиторий интерфейса в действии Laravel Nova?

#php #laravel #laravel-nova

#php #laravel #laravel-nova

Вопрос:

Я использую шаблон репозитория Laravel для управления своими ресурсами, и мне было интересно, как я могу использовать интерфейс внутри действия Nova? Поскольку невозможно создать экземпляр интерфейса, мне было интересно, как я могу использовать свои интерфейсы в своем действии?

В моем конструкторе контроллера я создаю свой репозиторий, а затем могу использовать его в своих функциях, но я не могу понять, как сделать то же самое внутри действия Laravel.

Есть идеи, как я мог бы это сделать?

Пример в моем контроллере

 private $myRepository;

public function __construct(
    MyRepositoryInterface $myRepository,
)
{
    $this->myRepository = $myRepository;
}
  

А затем внутри функции я могу сделать что-то вроде

 public function destroy($id)
{
    $this->myRepository->delete($id);

    return response()->json( array("message" => "success") );
}
  

Теперь в моем действии Nova я пытаюсь сделать вот что

 public function handle(ActionFields $fields, Collection $models)
{
    foreach ($models as $model)
    {
        $myRepository = new MyRepositoryInterface(); // This doesn't work obviously
        $myRepository->customManipulation($model->id);
        $this->markAsFinished($model);
    }
}
  

Есть идеи, как я мог бы использовать свои репозитории?

Спасибо!

Комментарии:

1. MyRepository Реализует ли MyRepositoryInterface интерфейс? Вы говорите, что new MyRepository() это не работает, но это всего лишь конструктор, поэтому он не должен завершаться сбоем, если MyRepository это класс, а это не так throw .

Ответ №1:

Вы можете сделать $myRepository = App::make(MyRepositoryInterface::class); , IoC разрешит это и создаст экземпляр экземпляра класса.

Я предполагаю, что вы уже привязали класс к интерфейсу:

 App::bind('MyRepositoryInterface', 'MyRepository');