DI с множественными интанциями введенного класса

Я использую Представить библиотека для редактирования изображений в реальном времени, и я сталкиваюсь со стеной, которая понимает, как отделить классы, которые могут понадобиться для динамического создания нескольких экземпляров.

Придуманный пример

namespace App;

use Imagine\Image\{ Point, ImagineInterface };
use Imagine\Image\Palette\PaletteInterface;

class Image
{
protected $imagine;
protected $palette;

public function __construct(ImagineInterface $imagine, PaletteInterface $palette)
{
$this->imagine = $imagine;
$this->palette = $palette;
}

public function buildImage($args)
{
$image = $this->imagine->open('some/file/path');
$font = $this->imagine->font('some/font/path', 20, $this->palette->color('#000'));

/* how to inject these when x/y are dynamically set? */
$point1 = new Point($args['x1'], $args['y1']);
$point2 = new Point($args['x2'], $args['y2']);

$image->draw()->text('example one', $font, $point1);
$image->draw()->text('example one', $font, $point2);
}
}

0

Решение

Я не уверен, что это лучший ответ здесь, но никто не вмешался, поэтому я собираюсь пойти на это. Я создал фабричный класс, который внедряется в класс изображения, который принимает аргументы и возвращает новый экземпляр класса Imagine Point следующим образом:

завод

namespace App\Image;

use Imagine\Image\Point;

class PointFactory
{
public function create($x, $y)
{
return new Point($x, $y);
}
}

Образ

namespace App;

use Imagine\Image\ImagineInterface;
use Imagine\Image\Palette\PaletteInterface;
use App\Image\PointFactory;

class Image
{
protected $imagine;
protected $palette;

public function __construct(ImagineInterface $imagine, PaletteInterface $palette, PointFactory $point)
{
$this->imagine = $imagine;
$this->palette = $palette;
$this->pointFactory = $point;
}

public function buildImage($args)
{
$image = $this->imagine->open('some/file/path');
$font = $this->imagine->font('some/font/path', 20, $this->palette->color('#000'));

/* how to inject these when x/y are dynamically set? */
$point1 = $this->pointFactory->create($args['x1'], $args['y1']);
$point2 = $this->pointFactory->create($args['x2'], $args['y2']);

$image->draw()->text('example one', $font, $point1);
$image->draw()->text('example one', $font, $point2);
}
}

Теперь для тестирования я создаю макет фабрики и передаю его.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]