Я работаю над проектом с использованием Zend Framework 3 и Doctrine 2, используя для интеграции DcotrineModule, следующее - моделирование сущностей, с которыми у меня возникли проблемы:
Чтобы работать с этим моделированием с помощью доктрины, я использую @InheritanceType, ниже приведены соответствующие выдержки из Entities:
Сущность Песоа:
/**
* Abstração de Pessoa
*
* @author Rodrigo Teixeira Andreotti <[email protected]>
*
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="tipo", type="string")
* @DiscriminatorMap( { "pessoa" = "Pessoa",
* "pessoa_fisica" = "PessoaFisica",
* "pessoa_juridica" = "PessoaJuridica" } )
* @Table(name="pessoa")
*/
abstract class Pessoa implements JsonSerializable, PessoaInterface
{
use JsonSerializeTrait;
/**
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @Column(type="integer", length=32, unique=true, nullable=false, name="id_pessoa")
* @var integer
*/
protected $idPessoa;
/**
* Usuário
* @OneToOne(targetEntity="User\Entity\User", inversedBy="pessoa", cascade={"persist"})
* @JoinColumn(name="usuario", referencedColumnName="id")
*
* @var User
*/
protected $usuario;
/**
* @OneToOne(targetEntity="EnderecoPessoa", mappedBy="pessoa", cascade={"persist"})
* @var EnderecoPessoa
*/
protected $endereco;
/**
* Contatos da pessoa
* @OneToMany(targetEntity="ContatoPessoa", mappedBy="pessoa", cascade={"persist"}, orphanRemoval=true)
* @var ArrayCollection|array
*/
protected $contatos;
const PESSOA_FISICA = "pessoa_fisica", PESSOA_JURIDICA = "pessoa_juridica";
public function __construct()
{
$this->contatos = new ArrayCollection();
}
}
Компания PessoaFisica:
/**
* Abstração da pessoa física
*
* @Entity
* @Table(name="pessoa_fisica")
* @author Rodrigo Teixeira Andreotti <[email protected]>
*/
class PessoaFisica extends Pessoa implements JsonSerializable {
use JsonSerializeTrait;
/**
* Nome da pessoa física
* @Column(type="string", length=14)
* @var string
*/
private $nome;
/**
* Número do CPF da pessoa (quando brasileiro)
* @Column(type="string", length=14)
* @var string
*/
private $cpf;
/**
* Número do RG (quando brasileiro)
* @Column(type="string", length=13)
* @var string
*/
private $rg;
/**
* Data de nascimento
* @Column(type="date", name="data_nascimento")
* @var DateTime
*/
private $dataNascimento;
}
Компания PessoaJuridica:
/**
* Abstração de Pessoa Jurídica
*
* @Entity
* @Table(name="pessoa_juridica")
* @InheritanceType("JOINED")
* @author Rodrigo Teixeira Andreotti <[email protected]>
*/
class PessoaJuridica extends Pessoa implements JsonSerializable {
use JsonSerializeTrait;
/**
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @Column(type="integer", length=32, unique=true, nullable=false, name="id_pessoa")
* @var integer
*/
protected $idPessoa;
/**
* Nome fantasia
* @Column(type="string", length=32, name="nome_fantasia")
* @var String
*/
protected $nomeFantasia;
/**
* Número do CNPJ
* @Column(type="string", length=14, unique=true, name="cnpj")
* @var string
*/
protected $cnpj;
/**
* Razão social da empresa
* @Column(type="string", length=32, name="razao_social")
* @var string Razão social da empresa, quando necessário
*/
protected $razaoSocial;
}
Пока все работает отлично, проблема в том, что когда мне нужно сгенерировать форму для этой информации, я сейчас работаю над модулем «Клиент», в основном то, что я для него сделал:
- Создайте форму с идентификатором клиента + Pessoa Fieldset
- В Pessoa Fieldset я создал наборы полей для общей информации (пользователь, адрес, контакты и т. Д.)
- В Pessoa Fieldset он также включает два других Fieldset, по одному для каждого дочернего класса Pessoa (PessoaFisica и PessoaJuridica) - и вот в чем проблема.
На экране ниже вы можете увидеть мою регистрационную форму:
Эта форма отображает или скрывает набор полей PessoaJuridica или PessoaFisica в соответствии с выбранным типом с использованием javascript, однако, поскольку они представляют собой разные наборы полей внутри формы, когда zend гидратирует их, они также гидратируются как разные объекты, т. Е. Наследование не применяется к Объект Person, который следует выбрать по типу.
В основном, с моей точки зрения, должно было произойти то, что zend может не отображать наборы полей, относящиеся к дочерним классам класса Person как отдельные объекты, в момент визуализации формы с этими поля так (например):
человек [fsPeople] [имя]
человек [fsPessoaJuridica] [nameFantasica]
И это приводит к тому, что zend не генерирует правильный класс для сохранения в базе данных.
Как правильно реализовать эту реализацию формы?
DiscriminatorMap
, если вы не создадите его, Doctrine автоматически сгенерирует его для вас (меньше подверженности ошибкам). - person rkeet   schedule 18.02.2019"pessoa" = "Pessoa"
в своемDiscriminatorMap
, этого никогда не произойдет, поскольку вы создалиPessoa
классabstract
. - person rkeet   schedule 18.02.2019