注入多个实例化的 DI class

DI with multiple intantiations of injected class

我正在使用 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);
    }
}

我不确定这是这里的最佳答案,但没有人插话,所以我将接受它。我创建了一个工厂 class,它被注入到图像 class 中,它接受参数和 returns Imagine Point class 的新实例,如下所示:

工厂

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);
    }
}

现在为了测试,我创建了一个工厂模拟并将其传入。