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
問題は、コントローラーと密接に結合された 3 つのクラスがあることです。これを回避しようとした方法は、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
もしそうなら、そのオブジェクトを値オブジェクトと見なすことができますか?
何かご意見は?