Как использовать контейнер Laravel для передачи динамического свойства внедренному классу? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть класс, который я хотел бы добавить в другой класс (например, контроллер). Этот класс принимает модель в качестве первого аргумента и объект клиента Guzzle HTTP в качестве второго аргумента.

<?php
namespace App\Services;

use App\MyModel;
use GuzzleHttp\Client;

class MyClass
{
    private $model;
    private $client;

    public function __construct(MyModel $model, Client $client)
    {
        $this->model = $model;
        $this->client = $client;
    }
}

MyModel имеет URL-адрес, который клиент Guzzle будет использовать для конфигурации по умолчанию (которая передается его конструктору).

Без DI это выглядело бы примерно так.

public function myControllerMethod()
{
    $model = new MyModel;
    $client = new Client([
        'base_uri' => $model->url, 
        'headers' => [
            'Authorization' => "Bearer {$model->api_token}",
         ]
    ]);

    $my_class = new MyClass($model, $client);
}

Как мне провести рефакторинг, чтобы я мог просто внедрить MyClass в метод контроллера, не настраивая $ client вручную на основе данной модели? Это вообще возможно?

public function myControllerMethod(MyModel $model, MyClass $my_class)
{
    // The model could come from the request or injected into this method (as shown).

    $my_class->doSomething();
}
...