0

Zend Framework 2 と Doctrine 2 を使用するプロジェクトに取り組んでいます。

データベースを維持するための次のプロセスがあります。

  1. エンティティの XML マッピング ファイルを作成する
  2. コマンド「orm:generate-entities」を使用してエンティティを生成します
  3. コマンド「orm:schema-tool:update --force」を使用してデータベースを生成します

生成されたエンティティをカスタム ビジネス コードで強化したい : 生成されたエンティティを編集するだけでもかまいませんが、新しいエンティティが生成されるたびにカスタム コードが失われ、より良いワークフローを探しています。

基本的に、これは私ができるようにしたいことです:

生成されたエンティティ:

namespace My\Base\Entity;

class Cart
{
    private $quantity;

    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;

        return $this;
    }

    public function getQuantity()
    {
        return $this->quantity;
    }
}

強化されたエンティティ:

namespace My\Entity;

class Cart extends \My\Base\Entity\Cart
{
    public function setQuantity($quantity)
    {
        $quantity = filter_var(
            $quantity,
            \FILTER_VALIDATE_INT, array('min_range' => 1)
        );

        if ($quantity === false) {
            throw new \InvalidArgumentException(
                'Quantity should be an integer higher than 0'
            );
        } else {
            return parent::setQuantity($quantity);
        }
    }
}

Doctrine は \My\Entity\Cart がエンティティ自体であると想定しているため (基本エンティティの拡張のみ)、これは機能しません。

それに似たものを実装する方法はありますか?

4

3 に答える 3

0

私の意見では、それはあなたが何を達成したいかによって異なります。

記述されたコードには、単純な検証のようなものがあります。

関数getInputFilter()を使用して Entity クラスを拡張しました。ここでは、検証のルールを単一のレコードに保持しています。

public function getInputFilter()
{
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();

        $factory = new InputFactory();

        $inputFilter->add($factory->createInput(array(
            'name' => 'id',
            'required' => true,
            'filters' => array(
                array('name' => 'Int'),
            ),
        )));

        // [...]

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}

完全なコードを確認するには、次のリンクを確認してください: https://github.com/evolic/zf2-tutorial/blob/v0.4.2/module/Album/src/Album/Entity/Song.php

すべてのレコードまたはモデル クラスに入れた単一のレコードを取得するなどの他の方法: (/module/Album/src/Album/Model/Song.php)

コントローラ クラスは次の場所にあります: (/module/Album/src/Album/Controller/SongController.php)

コード全体はhttps://github.com/evolic/zf2-tutorial/blob/v0.4.2/にあります。

データベースに基づいてエンティティを生成していません。私は自分でそれらを作成します。

お役に立てば幸いです。

于 2013-05-08T19:16:53.477 に答える