Herança da doutrina.Existe uma maneira fácil de obter todas as classes/tabelas filhas para usá-las em um campo de seleção nos formulários do symfony?
-
23-09-2019 - |
Pergunta
Acabei de começar a usar o symfony 1.4 e o Doctrine.(Usei 1.0 - 1.2 + Propel muito antes).
Pensei em experimentar a doutrina, por causa do rápido e enorme processo de desenvolvimento no passado.
Obrigado ao jwage ;-)
Estou usando herança de tabela.Esta é uma pequena parte do meu schema.yml:
Articles:
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
marken_id:
type: integer(4)
notnull: false
user_id:
type: integer(4)
notnull: false
address_id:
type: integer(4)
notnull: false
...
Vehicles:
inheritance:
extends: Articles
type: concrete
Rennfahrzeuge:
columns:
stvo:
type: boolean
notnull: false
default: false
inheritance:
extends: Vehicles
type: concrete
Tourenwagen:
inheritance:
extends: Rennfahrzeuge
type: column_aggregation
keyField: type
keyValue: 1
...
Sonstige:
inheritance:
extends: Rennfahrzeuge
type: column_aggregation
keyField: type
keyValue: 6
Karts:
inheritance:
extends: Vehicles
type: concrete
TonyKart:
inheritance:
extends: Karts
type: column_aggregation
keyField: type
keyValue: 1
...
Sonstige:
inheritance:
extends: Karts
type: column_aggregation
keyField: type
keyValue: 9
Agora estou pensando em usar uma maneira simples de criar o formulário certo.
O usuário deve ter que selecionar campos no topo do formulário (como você pode ver aqui: http://msm-esv.dyndns.org/frontend_dev.php/fahrzeuge/insert )
Você deve escolher a "classe dos pais" como Rennfahrzeuge ou Karts e assim por diante.
Depois disso, o usuário deve escolher a classe infantil como Tourenwagen ou Sonstige.
Então a página deve recarregar e exibir o formato correto.
Existe alguma função na doutrina para obter as classes herdadas/filho para exibi -las no segundo campo selecionado?
(por exemplo.Rennfahrzeuge tem Tourenwagen, .., ..., Sonstige e Karts tem Tonykart, ..., ..., Sonstige)
Depois disso, eu poderia criar dinamicamente a classe de formulário atribuída como:
$chooseMode = $request->getParameter('chooseMode').'Form';
$modeFormClass = new $chooseMode();
Ou pensei em definir o modelo certo na classe de formulário pai.
Quais são seus pensamentos?Eu realmente apreciaria qualquer sugestão e ajuda :-)
Muito obrigado,
Marco
Solução
Existem funções diretas, como uma Doutrina getSubclasses
ou um PHP get_children_of
?Não que eu tenha encontrado, em Doctrine ou PHP.O mais próximo que conheço é a função PHP is_subclass que você pode usar enquanto itera por todas as classes possíveis.
Suas subclasses variam significativamente em relação ao seu modelo principal?Vejo apenas uma variação de coluna nos exemplos acima, mas acho que foi apenas por uma questão de brevidade.
Entendo o apelo da estrutura que você está tentando, mas também parece que pode ser uma dor incrível no longo prazo.Seria possível, em vez disso, criar um VehicleCategory
modelo que se referenciou para fornecer uma estrutura aninhada e então seu Vehicles
poderia pertencer a essas categorias?Isso teria Rennfahrzeuge como uma categoria de nível superior e Tourenwagen e Sonstige seriam categorias com um pai de Rennfahrzeuge com Vehicles
pertencente aos três.Se você não tivesse muita variação de campos em seus modelos filhos, você poderia incluir todos os campos personalizados no Vehicles
modelo e apenas exibi-los/defini-los nos momentos apropriados.
Apenas algumas reflexões, espero que ajude.
Outras dicas
Se você precisar encontrar as subclasses de um registro de doutrina, você pode usar
$yourSuperObject->getTable()->getOption('subclasses')
ou
Doctrine::getTable('SuperClass')->getOption('subclasses');