将服务注入实体:检查图像文件是否存在


Injecting services into Entities: check if an image file exists

我正在使用PHP和Doctrine ORM,这是交易:我有一个带有图像字段的产品表,我想要一个事件来检查我的资产云存储(Amazon S3)中是否存在图像。如果文件存在,那么一切都很好,但如果不存在,我想返回占位符图像的文件路径。 现在,执行图像是否存在检查的方法驻留在我的 S3Service 类中。

有没有办法让我将事件绑定到实体,以便每次我调用以下内容时:

$product = $this->em->getRepository('Entities'Product')
                ->findBy(['id' => $productId]);
echo $product->getImagePath();

如果文件不存在,我将能够获得默认图像(当然是通过调用 S3Service 中的方法)。现在我知道您不应该将服务注入实体,但是如果我可以用我的实体抽象这部分,那么我的其余代码会更干净。这就是为什么我正在寻找一种事件驱动的解决方案。我看过教义实体的生命周期事件,但我不知道是否有一个事件在检索实体后立即执行。

问题是:我应该查看什么事件,或者我应该完全寻找另一种解决方案?

服务注入实体(例如,在方法参数中)不是一个好的做法。IMO 您应该创建对图像进行操作的服务,并以特定方法获取实体作为参数。正如Kris Wallsmith在SymfonyCon上所说 - 模型是应用程序和持久(db)层之间的薄层。它们不应该包含很多逻辑。