4

私はこれをしたい:

// 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

私の知る限り、これは Propel の関係が実行時ではなくビルド時に定義されるという事実によるものです...これを達成するために私が見つけた唯一の方法は、GlorpenPropelBundleにある拡張動作を使用し、構成で拡張クラスを定義することです:

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

うまくいきましたが、確かにもっと良い方法がありますか? 私は何かを見逃していましたか、それとも Propel + Symfony でモデルを拡張する唯一の方法ですか? 私はDoctrineよりもPropelを使いたいのですが、このようなことから、Propelは特定のサイズを超えるプロジェクトには単に適していないと思います...

(Propel 1.6 + Symfony 2.3 ところで)

4

2 に答える 2

3

私は GlorpenPropelBundle の作成者なので、問題に光を当てることができると思いました:)

Propel は変更用のモデル クラスを提供しますが、悲しいことに、独自のモデルを持つ外部バンドルについて話すと、クラスはそれらの内部で生成されます。第 2 レベルのユーザー クラスはありません。

ただし、場合によっては、Propel の単一継承動作 ( http://propelorm.org/documentation/09-inheritance.htmlまたは hakre が提供するソリューション) を利用できます。

単純にベンダーバンドル モデルにいくつかのメソッドを追加したい場合は、うまくいきません。昔はhttp://trac.symfony-project.org/wiki/HowToExtendPropelPluginModelがありましたが、今ではうまくいかないケースがいくつかあります - そしてそれが私のバンドルが動くところです。

独自のアプリケーション内にいる場合は、いつでも次の方法でクラス拡張を行うことができます (Propel ユーザー クラスは 1 回しか生成されないため):

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 {...}
于 2013-08-02T10:28:15.293 に答える