php - 具有多个注入类实例的 DI
问题描述
我正在使用Imagine库进行一些图像实时编辑,并且正在碰壁了解如何解耦我可能需要动态构建多个实例的类。
人为的例子
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);
}
}
解决方案
我不确定这是这里最好的答案,但没有人插话,所以我会接受它。我创建了一个工厂类,该类注入到图像类中,该类接受参数并返回 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);
}
}
现在为了测试,我创建了一个工厂的模拟并将其传入。