Мой конвейерный шаблон для загрузки фото:
// 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');
Проблема в том, что эти классы используют пример экземпляра config:
public function fotoFileExist($filename, $ext)
{
$foto_subdirs = C::inst()->get('product_foto.subdirs');
// ...
}
Какой лучший элегантный способ с этим справиться:
А) Внедрение зависимостей.
Добавить конструктор в класс для 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))
...
Задача ещё не решена.
Других решений пока нет …