2014-04-03 34 views
0

在symfony 2應用程序中訪問實體內部配置值的最佳方式是什麼?在symfony 2實體中訪問配置值

我搜索關於這個,我已經找到了兩個解決方案:

  1. 定義實體的服務和注入服務容器訪問配置值
  2. this approach,用以定義一個類使用靜態方法獲得參數值的實體的相同束

是否有任何其他解決方案?什麼是最好的解決方法?

+0

你是指哪種配置?它是數據庫配置還是基於您提供的鏈接,它是一些全局配置值? – Javad

+0

這是一個在parameters.yml中定義的字符串參數值。我試過第二種解決方案,它工作正常。雖然我不知道這是否是最好的方法,但在我提到的2之間它看起來是最好的。 –

回答

0

您不應該在您的實體中需要配置。

例如,您有File實體,您需要將此實體表示的文件保存到磁盤。你需要一些參數,比如說「upload_dir」。您可以將此參數以某種方式傳遞給實體,並在此實體內定義一個方法,該方法保存要上傳目錄的文件。但更好的方法是創建一個服務來負責保存文件。然後你可以注入配置,並在save方法中傳遞實體對象作爲參數。

+2

雖然我會找到一個'FileEntity :: getUploadDir()'方法,非常方便... –

2

除了關聯的實體之外,您的實體不應該真正訪問其他任何內容。它不應該與外界真正有任何聯繫。

做你想做的一種方法是使用訂閱者或偵聽器來偵聽實體加載事件,然後使用通常的setter將該值傳遞給實體。

例如....

你的實體

namespace Your\Bundle\Entity; 

class YourClass 
{ 
    private $parameter; 

    public function setParameter($parameter) 
    { 
     $this->parameter = $parameter; 

     return $this; 
    } 

    public function getParameter() 
    { 
     return $this->parameter; 
    } 

    ... 

} 

監聽

namespace Your\Bundle\EventListener; 

use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Your\Bundle\Entity\YourEntity; 

class SetParameterSubscriber implements EventSubscriber 
{ 
    protected $parameter; 

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

    public function getSubscribedEvents() 
    { 
     return array(
      'postLoad', 
     ); 
    } 

    public function postLoad(LifecycleEventArgs $args) 
    { 
     /** @var YourEntity $entity */ 
     $entity = $args->getEntity(); 

     // so it only does it to your YourEntity entity 
     if ($entity instanceof YourEntity) { 
      $entity->setParameter($this->parameter); 
     } 
    } 
} 

你的服務文件。

parameters: 
    your_bundle.subscriber.set_parameter.class: 
      Your\Bundle\EventListener\SetParameterSubscriber 
      // Should all be on one line but split for readability 

services: 
    your_bundle.subscriber.set_parameter: 
     class: %your_bundle.subscriber.set_parameter.class% 
     arguments: 
      - %THE PARAMETER YOU WANT TO SET% 
     tags: 
      - { name: doctrine.event_subscriber }