0

AttachmentAmazon S3 のファイルを参照する Doctrineのエンティティがあります。私がdownloadpath. これdownloadpathは計算された URL になります。たとえばhttp://site.s3.amazon.com/%s/attach/%sのように、2 つの文字列値をエンティティ自体 (アカウントとファイル名) の値に置き換える必要があるため、 ;

http://site.s3.amazon.com/1/attach/test1234.txt

downloadpathサービス レイヤーを使用していますが、SL を通過することなく、いつでもエンティティで利用できるようにしたいと考えています。

定数をエンティティに追加する明白な方法を検討しました。

const DOWNLOAD_PATH = 'http://site.s3.amazon.com/%s/attach/%s';およびカスタムgetDownloadPath()ですが、エンティティクラスではなく、この URL のような詳細をアプリの構成に保持したいと思います (また、以下の更新を参照してください)

どうすればこれを達成できるかについて誰かアイデアがありますか?

更新これに追加するには、ファイルへの一時的な認証済みアクセスを許可するために、AmazonS3 ライブラリを使用して一時的な URL を生成する必要があることを認識しています。これは、気分が悪いだけです。

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 に答える