Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2:持久化给定子类的父实体_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php Doctrine2:持久化给定子类的父实体

Php Doctrine2:持久化给定子类的父实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我已经定义了一个用户实体(在yml中映射) 我创建了一个子类,该子类继承自该实体,因此我可以添加一些自定义验证方法和一些我需要但不需要持久化的字段(例如ConfirmPassword、ConfirmMail字段) 当用户提交注册表单时,我将请求映射到UserModel实体,如果请求有效,我将尝试持久化用户 下面的代码引发一个异常 $entityManager->persist($userModel); //=>The class 'My\SecondBundle\EditMode

我已经定义了一个用户实体(在yml中映射)

我创建了一个子类,该子类继承自该实体,因此我可以添加一些自定义验证方法和一些我需要但不需要持久化的字段(例如ConfirmPassword、ConfirmMail字段)

当用户提交注册表单时,我将请求映射到UserModel实体,如果请求有效,我将尝试持久化用户

下面的代码引发一个异常

$entityManager->persist($userModel);

//=>The class 'My\SecondBundle\EditModels\UserModel' was not found in the chain configured namespaces My\CoreBundle\Entity
问题:如何将$userModel(userModel的实例)持久化为用户实体类?可能的选择:

  • 不要使用继承类并向用户实体本身添加自定义字段和验证方法
  • 将字段从UserModel复制到用户实体并持久化用户实体
我不认为我应该使用条令继承机制,因为我不想保存额外的字段


谢谢你

我想你这里的问题是,你刚刚在Doctrine2中配置了
My\CoreBundle\Entity
名称空间,但是你真正想要持久化的实体位于
My\SecondBundle\EditModels

通常,在继承标记为
@ORM\Entity()
的类时,从中扩展的类必须具有类注释
@ORM\MappedSuperclass()
。但通常情况下,您将其用于单表插入,例如,不用于您的用例

在我看来,将数据库相关属性从其他属性中分离出来的方法是负担不起的。我会将与验证相关的内容保存在模型本身中—您需要在创建/更新操作中使用它

我不熟悉XML配置,但在使用注释时,需要标记要映射到数据库的每个属性(使用
@ORM\Column()
)。因此,该学说将完全忽略所有其他属性和方法

因此,我在这里向您分享我最近开发的AbstractModel,以了解我是如何实现验证的(使用):


namespace My\SecondBundle\EditModels;

use My\CoreBundle\Entity\User;

class UserModel extends User
{
$entityManager->persist($userModel);

//=>The class 'My\SecondBundle\EditModels\UserModel' was not found in the chain configured namespaces My\CoreBundle\Entity
<?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);
    }
}
<?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, ...
}