2017-04-01 3 views
0

私は(YMLでのマッピング)定義されたユーザエンティティDoctrine2:持続親エンティティ与えられた子クラス

namespace My\CoreBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

class User 
{ 

...

を持っていると私はそのエンティティから継承子クラスを作成し、私はいくつかのカスタム検証方法と、私は必要がありますが、ユーザーは登録フォームを送信すると(例えばConfirmPassword、ConfirmEmailフィールド)

namespace My\SecondBundle\EditModels; 

use My\CoreBundle\Entity\User; 

class UserModel extends User 
{ 

永続化する必要はありませんいくつかのフィールドを追加できるように、私は番目のマップeリクエストをUserModelエンティティに送信し、有効であればユーザを永続化しようとします。どのように私はUserエンティティクラスとして$ userModel(UserModelのインスタンス)を持続することができます

次のコードは、例外

$entityManager->persist($userModel); 

//=>The class 'My\SecondBundle\EditModels\UserModel' was not found in the chain configured namespaces My\CoreBundle\Entity 

質問を投げますか?可能なオプション:

  • が継承されたクラスを使用してUserエンティティ自体
  • コピーにカスタムフィールドや検証メソッドを追加しUserModelからフィールドをUserエンティティへとユーザエンティティ
を持続しません。

余分なフィールドを保存したくないので、私はDoctrineの継承メカニズムを使うべきではないと思います。

が、私はここにあなたの問題を考える

答えて

0

ありがとう、あなただけのDoctrine2でMy\CoreBundle\Entity名前空間を構成しましたが、あなたが実際に永続化したいエンティティがMy\SecondBundle\EditModelsに位置していることです。

通常、継承するクラスが@ORM\Entity()の場合、拡張するクラスにはクラス注釈@ORM\MappedSuperclass()が必要です。しかし、通常、これは単一テーブルの継承のために使用します。たとえば、あなたのユースケースではありません。

私の意見では、データベース関連の属性を他のものから分割する方法は手頃ではありません。私はモデル自体にバリデーション関連のものを残しておきます - 作成/更新アクションでそれを必要とします。

私はXML設定に精通していませんが、アノテーションを使用する場合は、データベースにマップする各プロパティをマークする必要があります(@ORM\Column()を使用)。したがって、Doctrineは他のすべての属性とメソッドを完全に無視します。

だからここに私は(respect/validationとの)検証を実施してきた方法を確認するために、あなたのための私の最近開発AbstractModelを共有:

<?php 
namespace Vendor\Package\Model; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Abstract Model 
* 
* @ORM\MappedSuperclass() 
*/ 
abstract class AbstractModel 
{ 
    /** 
    * @var \Respect\Validation\Validator 
    */ 
    protected $validator; 

    /** 
    * AbstractModel constructor 
    */ 
    public function __construct() 
    { 
     $this->validator = static::validation(); 
    } 

    /** 
    * Defines validation for this model 
    * 
    * @return \Respect\Validation\Validator 
    */ 
    public static function validation() : \Respect\Validation\Validator 
    { 
     return \Respect\Validation\Validator::create(); 
    } 

    /** 
    * Executes validations, defined in validation method. 
    * 
    * @return bool 
    */ 
    public function isValid() : bool 
    { 
     if (is_null($this->validator)) { 
      $this->validator = new \Respect\Validation\Validator(); 
      $this->validation(); 
     } 
     return $this->validator->validate($this); 
    } 
} 

AbstractModelから延びているモデルは、静的検証メソッドを実装する必要があり、クラスの検証を定義する:

<?php 
namespace Vendor\Package\Model; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
* @ORM\Table(name="my_model") 
*/ 
class MyModel extends AbstractModel 
{ 
    /** 
    * @var string 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * Defines validation for this model 
    * 
    * @return \Respect\Validation\Validator 
    */ 
    public static function validation() : \Respect\Validation\Validator 
    { 
     return \Respect\Validation\Validator::create() 
      ->attribute('name', \Respect\Validation\Validator::notEmpty()->stringType()->length(null, 32)) 
      ; 
    } 
    // getter, setter, ... 
} 

各エンティティを、データベースに永続化、$validator財産およびすべてのこれらのメソッドを持つことになりますが、私はここに注釈を残したので(とかなり確信してこれは、XML/YAMLで動作します) Doctrineはそれを無視します。

このようにして、モデルクラス自体の検証に関連するものも取り除くことができます。これは可読性に優れています。検証そのものは、モデルそのものに定義する必要があります。しかし、この尊重/妥当性確認の枠組みは、これを達成するうえでうまい方法です。希望がこれを助ける:)

関連する問題