2013-07-22 25 views
4

我想這樣做:在Symfony2中乾淨地擴展Propel模型的策略?

// Model class 
namespace Bookshop\Inventory\Model; 
use Core\Inventory\Model\Product as BaseProduct; 

class Book extends BaseProduct { 
    // ... 
} 


// Query class 
namespace Bookshop\Inventory\Model; 
use Core\Inventory\Model\ProductQuery as BaseProductQuery; 

class BookQuery extends BaseProductQuery { 
    // ... 
} 

看起來不錯,對吧?但是:

$book = BookQuery::create()->find($id); 
var_dump(get_class($book)); 
// expected: Bookshop\Inventory\Model\Book 
// actual: Core\Inventory\Model\Product 

AFAIK這是由於波輪的關係是在編譯時定義的事實,而不是運行時......我發現實現這一目標的唯一方法是通過使用GlorpenPropelBundle發現擴展行爲並在我的配置中定義擴展類:

glorpen_propel: 
    extended_models: 
     Core\Inventory\Model\Product: Bookshop\Inventory\Model\Book 

很好,它的工作,但肯定有更好的方法?我錯過了什麼,或者這是真正拓展Propel + Symfony模型的唯一方法嗎?我真的想用行走在教義,但事情就是這樣離開了我認爲根本的Propel不適合超過一定規模的項目......

(行走1.6 + 2.3 Symfony的BTW)

+1

我懷疑GlorpenPropelBundle是你最好的選擇。我遇到了無法擴展Propel模型的類似問題,通常我所做的就是添加一個新的類,它在構造函數中使用基礎模型。然後在查詢類中,我們只需獲取原始模型,然後包裝它們並返回它們。 –

+0

X-Ref:[FOSUserBundle extend propel User](http://stackoverflow.com/q/16585957/367456) – hakre

回答

0

問題你有和詢問是否已經寫過關於內置時間/運行時間。由於BookQuery::create()是一種靜態方法,它將模型類名解析爲BaseProduct

這在行走手動以及概述:

由於後期靜態綁定的問題在PHP 5.2,您不能使用create()工廠上繼承查詢 - 除非你自己重寫它的子類。另外,行走提供了一個名爲PropelQuery一個全球性的查詢工廠:

<?php 
// Use 'frontendBook' instead of 'Book' in the frontend to retrieve only 
// published articles 
$books = PropelQuery::from('frontendBook')->find(); 

來源:Propel Query ReferenceDOCS - 向下滾動到非常結束。

因此,覆蓋它或指定它。

我希望這可以解決您的問題,因爲它允許您指定哪個查詢以及由propel使用的實體類。

Glorpen Propel Bundle採用不同的方式,改變了靜態方法getOMClass執行的代碼。這聽起來像是鼻子裏的黑客,但現在判斷我還爲時過早。您可以在Behaviors/ExtendBehavior.php中找到代碼。

3

我GlorpenPropelBundle的創造者,所以我想我能闡明問題:)一些輕

行走確實提供了修改模型類,但不幸與類內生成自己的模式在談論外部包的時候他們。沒有二級用戶類。

在某些情況下,您可以使用Propel單繼承行爲 - http://propelorm.org/documentation/09-inheritance.html或由hakre提供的解決方案。

如果您想簡單地將一些方法添加到供應商捆綁模型中,那麼您的運氣不好。 在古代,有http://trac.symfony-project.org/wiki/HowToExtendPropelPluginModel,但現在有些情況下它不起作用 - 這就是我的捆綁套裝起作用的地方。

如果你自己的應用程序中,你總是可以做類以下(僅因爲行走用戶類別生成一次)一直延伸:

namespace Bookshop\Inventory\Model; 
//your custom class extending Propel base class 
class Book extends \Core\Inventory\Model\om\BaseProduct { ... } 

namespace Core\Inventory\Model; 
//propel user class extending your custom class 
class Book extends Bookshop\Inventory\Model\Book {...} 
+1

+1加入並留下回答,沒有看到它在WE上。謝謝。 – hakre