0

Attachment在 Doctrine 中有一个实体,它引用了 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(),但我想在我的应用程序配置中保留此 URL 之类的细节,而不是 Entities 类(另请参阅下面的更新)

有人对我如何实现这一目标有任何想法吗?

更新添加到这一点,我现在知道我需要使用 AmazonS3 库生成一个临时 URL,以允许临时 authed 访问文件 - 我不想对我们的 Amazon/Attachment Service 进行静态调用这只是感觉不对。

4

1 回答 1

2

事实证明,最干净的方法是像这样使用 postLoad 事件;

<?php

namespace My\Listener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Events;
use Doctrine\ORM\Event\LifecycleEventArgs;
use My\Entity\Attachment as AttachmentEntity;
use My\Service\Attachment as AttachmentService;

class AttachmentPath implements EventSubscriber
{
    /**
     * Attachment Service
     * @param \My\Service\Attachment $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));
        }
    }
}
于 2012-10-18T14:55:02.493 回答