2017-04-01 96 views
0

我已經得到了定義(在陽明映射)中,用戶實體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 
{ 

當用戶提交登記表的幾個領域,我第地圖對UserModel實體的請求,如果有效,我嘗試堅持用戶。

下面的代碼拋出一個異常

$entityManager->persist($userModel); 

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

問:我如何能堅持$的usermodel(的usermodel的實例)爲用戶實體類?可能的選項:

  • 不要使用繼承的類,並添加自定義字段和驗證方法的用戶實體本身
  • 中的複製的usermodel該用戶實體領域,堅持用戶實體

我不認爲我應該使用Doctrine繼承機制,因爲我不想保存額外的字段。

謝謝

回答

0

我覺得你的問題就在這裏,就是你剛剛配置Doctrine2 My\CoreBundle\Entity命名空間,但是你真的想堅持的實體位於My\SecondBundle\EditModels

通常,當繼承標記爲@ORM\Entity()的類時,您要擴展的類必須具有類註釋@ORM\MappedSuperclass()。但是,通常情況下,您可以將其用於單表聯合,例如,不適用於您的用例。

在我看來,分解數據庫相關屬性的方法並不便宜。我會在模型中保留與驗證有關的東西 - 您需要在創建/更新操作中使用它。

我不熟悉XML配置,但使用註釋時,您需要標記每個要與數據庫映射的屬性(使用@ORM\Column())。所以教義會完全忽略所有其他的屬性和方法。

所以我在這裏分享我最近開發AbstractModel給你,看看我是如何實現的驗證(與respect/validation):

<?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需要實現一個靜態validate方法的模型,定義類的驗證:

<?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)主義忽視它。

這樣你也可以保留模型類本身的驗證相關的東西,這對於可讀性是有好處的。驗證本身應該在模型本身imho中定義。但是這個方面/驗證框架是完成這個任務的完美方式。希望這有助於:)