2015-11-19 94 views
1

只是好奇..我有一些代碼,就像這樣:一個學說實體可以自我閱讀嗎?

​​

但是......不是調用findOneBy$className,我可以移動getSerialization()方法實體(是的$ className)裏面,從那裏返回類的參數?

我想這是不可能的,因爲實體無法讀取本身。正確?

我試圖解決的問題。 ...在上面的例子中,通過Doctrine填充實體,然後返回數據。因此我不得不使用另一個類來填充實體。沒有教條我知道可以做一些事情,比如從實體內部讀取數據,例如通過mysqli,然後直接或通過方法返回屬性。換句話說,我是否絕對需要另一個位置(實體之外的類/函數/方法)來填充實體?

樣品實體看起來像這樣

class Pricing 
{ 
    function getSerialization(){} 

    /** 
    * @var integer @Column(name="id", type="integer", nullable=false) 
    *  @Id 
    *  @GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 
    //etc, a typical Doctrine Entity 
} 
+0

No.學說實體只是普通的對象,不能從數據庫加載自己。你可以做的是創建一個方法ProductRepository :: getSerializedPricing($ productId)。但堅持你的代碼可能是最好的。 – Cerad

回答

2

是,實體類的實例可以閱讀本身。
但我想你的問題應該是:「一個學說實體可以加載和自我閱讀嗎?」。答案是否定的...實體

加載由學說內部管理。如果您希望實體類自己加載,則意味着將實體類注入EntityManager

這是一個壞主意,我quote @BryanM。他的另一個堆棧溢出問題答案涵蓋這很好:

這不是一個好主意,讓一個實體對象依靠實體管理器。它將實體與持久層連接起來,這是第2條專門試圖解決的問題。依賴實體管理器最大的麻煩在於,它使得你的模型難以獨立測試,遠離數據庫。

你也許應該靠服務對象來處理依賴於實體管理器的操作。

這意味着你需要照顧裝載實體的外部。我仍然沒有看到getSerialization的問題。它可以在Entity類中,可以在實體加載後使用嗎?

如果你想要一次加載和序列化,我會建議做一個PricingService在其中注入存儲庫或實體管理器,並在其中定義一個公共方法來完成所有這些。例如:

<?php 

use Application\Entity\Pricing; 
use Doctrine\ORM\EntityManager; 
use Doctrine\ORM\EntityRepository; 

class PricingService 
{ 
    /** 
    * @var EntityManager 
    */ 
    protected $entityManager; 

    /** 
    * @param EntityManager $entityManager 
    */ 
    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 

    /** 
    * @return EntityRepository; 
    */ 
    protected function getRepository() 
    { 
     return $this->entityManager->getRepository(`Application\Entity\Pricing`); 
    } 

    /** 
    * @param $params 
    * @return array 
    */ 
    public function findSerializedBy($params) 
    { 
     $pricing = $this->getRepository()->findOneBy($params); 
     return $pricing->getSerialization(); 
    } 
} 

現在,您可以直接與您的PricingService工作:

$serializedPricing = $pricingService->findSerializedBy(array(
    'active' => true, 
    'product_id' => (int) $this->id 
)); 

您可以通過添加與$classname另一個參數的過程概括爲您服務。

+0

@丹尼斯創建這樣的服務是否解決了您的問題?或者這不是你正在尋找的答案? :d – Wilt