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