Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.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

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 Symfony-带原则的可选继承_Php_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php Symfony-带原则的可选继承

Php Symfony-带原则的可选继承,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我们在Symfony 5上遇到了继承问题 我们创建了一个UserBundle捆绑包,其中包括一个简单的User实体(id、电子邮件、密码):该捆绑包的目的是能够轻松地将其重新导入到我们的各种项目中 在某些项目中,我们希望扩展此实体以添加一些特定字段(电话、地址等),但情况并非总是如此 以下是我们设置的代码: UserBundle>User类: <?php namespace MyCompany\UserBundle\Entity; use Doctrine\ORM\Mapping as

我们在Symfony 5上遇到了继承问题

我们创建了一个UserBundle捆绑包,其中包括一个简单的
User
实体(id、电子邮件、密码):该捆绑包的目的是能够轻松地将其重新导入到我们的各种项目中

在某些项目中,我们希望扩展此实体以添加一些特定字段(电话、地址等),但情况并非总是如此

以下是我们设置的代码:

UserBundle>User类:

<?php

namespace MyCompany\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
* @ORM\MappedSuperclass()
*/
class User implements UserInterface
{
   /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    ...
<?php

namespace App\Entity;

use MyCompany\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
* @ORM\Entity
* @UniqueEntity(fields={"email"})
*/
class User extends BaseUser
{
    /**
     * @ORM\Column(type="string", length=50)
     */
    private $phone;

    ...

下面的想法行不通

正如@Cerad已经指出的,最好的方法可能真的是在每个应用程序中定义具体的
用户。这也是FOSUserBundle所做的


我将采用以下方法:声明映射的超类抽象

/**
* @ORM\MappedSuperclass()
*/
abstract class AbstractBaseUser implements UserInterface
{
   /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    ...
并在包中实现一个具体的空子类
User

/**
* @ORM\Entity
*/
class User extends AbstractBaseUser
{
}

这样,每个应用程序都可以使用库中的
用户
,也可以从库中继承。

要求每个应用程序都有自己的用户类可能是最好的方法。谢谢!我们已经尝试过了,但是当我们执行
bin/console make:migration
时,Doctrine拒绝说
用户表已经存在了
,这是有意义的,因为我们有两个
用户
类定义为实体。答案可能很明显,但有没有解决办法迫使条令根据我们的项目选择一个实体或另一个实体?@AlexandreO如此正确。当然,我更新了我的答案。如果不深入挖掘,一种可行的方法可能是在yaml中定义orm映射,而不是在注释中定义orm映射。然后,捆绑包的使用者应该能够覆盖配置。