我在学说中有一个Attachment
实体,该实体在Amazon S3上引用文件。我需要能够在实体上提供一种"计算出的字段",使我称为downloadpath
。downloadpath
将是计算出的URL,例如http://site.s3.amazon.com/%S/attach/%S,我需要用实体本身上的值替换两个字符串值(帐户和文件名),所以;
http://site.s3.amazon.com/1/attach/test1234.txt
尽管我们使用服务层,但我希望downloadpath
始终在实体上可用,而不必通过SL。
我已经考虑了向实体添加常数的明显途径;
const DOWNLOAD_PATH = 'http://site.s3.amazon.com/%s/attach/%s';
和一个自定义getDownloadPath()
,但我想在我的应用程序的配置中保留这样的详细信息,而不是实体类(另请参见下面的更新)
有人对我如何实现这一目标有任何想法吗?
更新要添加到此,我现在知道我需要使用Amazons3库生成临时URL,以允许对文件进行临时授权访问 - 我宁愿不做一个静态呼叫我们的亚马逊/附件服务,因为它感觉不正确。
事实证明,这样做的最干净的方法是使用后载事件so;
<?php
namespace MyListener;
use DoctrineCommonEventSubscriber;
use DoctrineORMEvents;
use DoctrineORMEventLifecycleEventArgs;
use MyEntityAttachment as AttachmentEntity;
use MyServiceAttachment as AttachmentService;
class AttachmentPath implements EventSubscriber
{
/**
* Attachment Service
* @param MyServiceAttachment $service
*/
protected $service;
public function __construct(AttachmentService $service)
{
$this->service = $service;
}
public function getSubscribedEvents()
{
return array(Events::postLoad);
}
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof AttachmentEntity) {
$entity->setDownloadPath($this->service->getDownloadPath($entity));
}
}
}