Laravel 7: поставщик услуг связывает класс с моделью параметров конструктора - PullRequest
0 голосов
/ 28 апреля 2020

Я создал поставщика услуг с классом, которому в конструктор передан model.

model должна быть определенной c записью, основанной на взятии $id из URL, например / path / {$ id}

Как я могу использовать запрошенный model в поставщике услуг?

Можно передать model в метод execute но сейчас мне нужно передать его в конструкцию.

MyController

  class MyController {

     public function show(MyClass $myClass, $id) 
     { 
        $model = MyModel::find($id);

        return $myClass->execute();
     }
  }

MyClass

class MyClass
{
   $private $myModel;

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

   public function execute()
   {
      //do something fun with $this->myModel

      return $theFunStuff;
   }
}

MyServiceProvider


public function register()
    {
        $this->app->singleton(MyClass::class, function ($app) {
            return new MyClass(/* How can I use $myModel? */);
        });
    }  

1 Ответ

2 голосов
/ 28 апреля 2020

Я не вижу здесь значения / причины для использования синглтона.

Поставщик услуг регистрирует синглтон до того, как ваш маршрут разрешен, поэтому нет способа передать $model из контроллера в метод регистра. Я бы удалил поставщика услуг и сделал бы следующее:

Из документов :

Если некоторые из зависимостей вашего класса не могут быть разрешены через контейнер, Вы можете внедрить их, передав их как ассоциативный массив в метод makeWith:

$api = $this->app->makeWith('HelpSpot\API', ['id' => 1]);

Так что в вашем случае что-то вроде этого:

public function show($id)
{
    return app()->makeWith(MyClass::class, ['myModel' => MyModel::find($id)])->execute();
}

Или с помощью короче привязка модели маршрута :

public function show(MyModel $myModel)
{
    return app()->makeWith(MyClass::class, compact('myModel'))->execute();
}

Обратите внимание, что имена аргументов, передаваемые в makeWith, должны соответствовать именам параметров в конструкторе класса.

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