Лучшая стратегия использования шаблона конвейера для тестирования и изоляции метода в PHP - PullRequest
0 голосов
/ 12 февраля 2019

Мой конвейерный шаблон для загрузки фото:

    // Define the pipeline stages
    $pipeline = (new Pipeline\Pipeline(new Pipeline\InterruptiblePayloadProcessor))
        ->pipe(new \component\Product\Foto\GenerateName)
        ->pipe(new \component\Product\Foto\Upload)
        ->pipe(new \component\Product\Foto\Resize)
        ->pipe(new \component\Product\Foto\Save)
        ->pipe(new \component\Product\Foto\UpdateDefault);

    // The payload is an object that's passed between stages
    $payload = new Pipeline\Payload($_POST, ['files' => $_FILES]);
    // Run the pipeline
    $payload = $pipeline->process($payload);

Я хочу использовать некоторые классы в другом месте кода (или протестировать его):

$class = new \component\Product\Foto\GenerateName();
$res = $class->action('ABC');

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

public function fotoFileExist($filename, $ext)
{
    $foto_subdirs = C::inst()->get('product_foto.subdirs');
    // ...
}

Какой изящный способ справиться с этим:

A) Внедрение зависимости.Добавить конструктор в класс для ConfigInterface

public function __construct(\core\ConfigInterface $c)
{
    $this->conf = $c;
}

..->pipe(new \component\Product\Foto\GenerateName(C::inst()))
..->pipe(new \component\Product\Foto\Upload(C::inst()))
...

Является ли этот элемент таким большим количеством повторений C :: inst ()?

B) Добавить Config obj в конвейер:

$payload = new Pipeline\Payload($_POST, ['files' => $_FILES], ['config' => C::inst()]);

C) Использовать только данные одного массива из примера конфигурации:

$config = C::inst()->get('product_foto);
..->pipe(new \component\Product\Foto\GenerateName($config))
..->pipe(new \component\Product\Foto\Upload($config))
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...