2015-08-26 2 views
1

Я хочу получить доступ к полному URL-адресу моей фотографии в одном из моих объектов.Правильный способ получения параметров в объекте

Объект (PlacePhoto) сериализуется с помощью JMSSerializerBundle, когда я использую свой API.

Вот образец моего лица:

/** 
* @VirtualProperty 
*/ 
public function getUrl() 
{ 
    return 'https://xxxx.s3.amazonaws.com/' . $this->path; 
} 

КДС путь (https://xxxx.s3.amazonaws.com/) находится в моем файле parameters.yml, и я предпочел бы, чтобы получить доступ к этому значению, вместо того, чтобы писать непосредственно путь в моей сущности ,

Каков правильный путь? Я знаю, что я могу получить доступ к параметрам, создав службу, но я не вижу, как и когда я мог бы называть ее в своем коде, зная, что я получаю доступ к фотографиям через свой объект Place (отношения «один ко многим») таким образом:

public function getPlaceAction() 
{ 
    $places = $this->getDoctrine()->getRepository('CyrAppBundle:Place')->findAll() 

    return $places; 
} 

Есть ли способ сделать это? возможно, во время сериализации?

EDIT 27/08/2015

мне удалось это сделать, создав doctrine listener на postLoad события.

Мой services.yml

services: 
    app.listener.placephoto_helper: 
     class: Cyr\AppBundle\Listener\PlacePhotoHelper 
     arguments: [%cdn_webpath%] 
     tags: 
      - { name: doctrine.event_listener, event: postLoad, connection: default } 

Мой слушатель

<?php 

namespace Cyr\AppBundle\Listener; 

use Doctrine\ORM\Event\LifecycleEventArgs; 
use Cyr\AppBundle\Entity\PlacePhoto; 

class PlacePhotoHelper 
{ 
    private $cdnWebPath; 

    public function __construct($cdnWebPath) 
    { 
     $this->cdnWebPath = $cdnWebPath; 
    } 

    public function postLoad(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     $entityManager = $args->getEntityManager(); 

     if ($entity instanceof PlacePhoto) { 
      $entity->setUrl($this->cdnWebPath . '/' . $entity->getPath()); 
     } 
    } 
} 
+0

Отличное решение! –

ответ

1

Я бы предпочел, чтобы добавить новую услугу: ImageHelper. Дайте этому помощнику метод GetUrl(), который принимает один обязательный параметр: ваш Entity.

например.

class ImageHelper 
{ 
    private $container; 

    public function __construct(Container $container) 
    { 
     $this->container = $container; 
    } 

    public function getUrl(Image $image) 
    { 
     $base_url = $this->container->getParameter('image.base_url'); 
     return $base_url . $image->getPath(); 
    } 

    // ... 
} 
+2

Вам не нужно вводить весь контейнер в службу (это очень плохая оценка), если вам нужно вводить только один параметр конфигурации (вы можете вводить только то, что вам действительно нужно). –

Смежные вопросы