我有一个关于 Pimple 和动态构造函数注入的问题。
假设我有一个 MVC 框架,我想做一些像图片上传这样的事情。这样做的半 DI 方式是这样的:
class ImageUploadController
{
public function upload()
{
$targetImage = new Image(1920, 1080, 75, 'jpg', 'save/path');
$imageSaver = new JPEGImageSaver($targetImage);
$imageUploader = new ImageUploader($imageSaver);
$imageUploader->upload('myUploadfield');
}
}
基本上Image
是我要创建和保存的图像属性的简单容器。JPEGImageSaver
利用imagecreatefromjpeg()
、imagecopyresized()
、 和imagejpeg()
对象Image
的属性以及上传的临时图像的属性来保存上传图像的新安全版本。ImageUploader
接口JPEGImageSaver
以安全地存储上传的图像。
问题是我有三个与控制器紧密耦合的类,我试图避免这种情况的方法是使用 Pimple,然后将 Pimple 传递给控制器。
class ImageUploadController
{
public function upload()
{
$targetImage = $this->app['Image'];
$targetImage->setWidth(1920);
$targetImage->setHeight(1080);
$targetImage->setQuality(75);
$targetImage->setExtension('jpg');
$targetImage->setSavePath('save/path');
$imageSaver = $this->app['JPEGImageSaver'];
$imageSaver->setTargetImage($targetImage);
$imageUploader = $this->app['ImageUploader'];
$imageUploader->setImageSaver($imageSaver);
$imageUploader->upload('myUploadField');
}
}
但是正如你所看到的,使用 Pimple 将依赖项注入我的控制器使使用它们比以前更加复杂。主要问题是我在 Pimple 中看不到在请求期间为对象设置构造函数值的方法,因此需要一堆Image
对象的设置器。
这个问题有一个通用的解决方案吗?我曾考虑将 Pimple 包装在一个解析容器中,让我传入构造函数参数,但问题是我的 IDE 不会指示应如何通过智能感知构造各种对象。$this->app['something']
我也有点怀疑我的控制器有多少可测试性。
控制器甚至需要可测试吗?如果是这样,我可以认为该Image
对象是一个值对象吗?
有什么想法吗?