2014-10-16 2 views
0

나는 동일한 구조를 공유하는 일부 기관이, 예를 들어, 기본 예제로이 둘을 :공유 FormType, 모범 사례/접근

/** 
* @ORM\Entity 
* @ORM\Table(name="nomencladores.modelo", schema="nomencladores") 
*/ 
class Modelo 
{ 
    use IdentifierAutogeneratedEntityTrait; 
    use NamedEntityTrait; 
    use ActiveEntityTrait; 

    /** 
    * @var \TipoTramite 
    * 
    * @ORM\ManyToOne(targetEntity="TipoTramite") 
    * @ORM\JoinColumn(name="tipo_tramite_id", referencedColumnName="id") 
    */ 
    protected $tipo_tramite; 

    /** 
    * Set tipo tramite 
    * 
    * @param \ComunBundle\Entity\TipoTramite $tipo_tramite 
    * @return FabricanteDistribuidor 
    */ 
    public function setTipoTramite(\ComunBundle\Entity\TipoTramite $tipo_tramite) 
    { 
     $this->tipo_tramite = $tipo_tramite; 

     return $this; 
    } 

    /** 
    * Get tipo tramite 
    * 
    * @return \ComunBundle\Entity\TipoTramite 
    */ 
    public function getTipoTramite() 
    { 
     return $this->tipo_tramite; 
    } 

} 

/** 
* @ORM\Entity 
* @ORM\Table(name="nomencladores.marca", schema="nomencladores") 
*/ 
class Marca 
{ 
    use IdentifierAutogeneratedEntityTrait; 
    use NamedEntityTrait; 
    use ActiveEntityTrait; 

    /** 
    * @var \TipoTramite 
    * 
    * @ORM\ManyToOne(targetEntity="TipoTramite") 
    * @ORM\JoinColumn(name="tipo_tramite_id", referencedColumnName="id") 
    */ 
    protected $tipo_tramite; 

    /** 
    * Set tipo tramite 
    * 
    * @param \ComunBundle\Entity\TipoTramite $tipo_tramite 
    * @return FabricanteDistribuidor 
    */ 
    public function setTipoTramite(\ComunBundle\Entity\TipoTramite $tipo_tramite) 
    { 
     $this->tipo_tramite = $tipo_tramite; 

     return $this; 
    } 

    /** 
    * Get tipo tramite 
    * 
    * @return \ComunBundle\Entity\TipoTramite 
    */ 
    public function getTipoTramite() 
    { 
     return $this->tipo_tramite; 
    } 

} 

당신이 엔티티 위의 코드에서 볼 수 있듯이 거의 동일한 코드를 공유하고, 정보가 저장되는 테이블을 변경하십시오.

class ModeloType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
       ->add('nombre') 
       ->add('activo') 
       ->add('tipo_tramite', 'entity', array(
        'class' => 'ComunBundle:TipoTramite', 
        'property' => 'nombre', 
        'empty_value' => '-- SELECCIONAR --', 
        'query_builder' => function (EntityRepository $er) { 
         return $er->createQueryBuilder('qb') 
           ->where('qb.activo = :activoValue') 
           ->setParameter('activoValue', TRUE); 
        } 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'ComunBundle\Entity\Modelo' 
     )); 
    } 

    public function getName() 
    { 
     return 'Modelo'; 
    } 

} 

그래서, 유일한 일이 하나 FormType 다른 사이 변경하면됩니다 : 지금은 그들 각각의 양식을 구축하고 기본적으로 약간의 변경과 동일합니다, Modelo 법인이 예를 참조해야합니다 : 클래스 이름, data_class 속성 및 getName() 반환 값은이 시나리오에서 FormType에 DRY를 적용 할 수있는 방법이 있습니까?

답변

1

첫째, 두 개의 거의 동일한 엔티티 (따라서 거의 동일한 두 개의 테이블)가 나에게 냄새처럼 보입니다. 어떻게 든 그들을 구분하기위한 몇 가지 추가 범주가있는 하나의 엔티티로 결합하는 것에 대해 열심히 생각할 것입니다.

그렇다면 자신 만의 중간 추상 형식을 정의한 다음 다른 점을 상속하여 그 두 가지 작은 것들을 상속 할 수 있습니까? 예 :

//This is not a good name, I'm sure you can do better! 
abstract class AbstractModeloMarcaType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
       ->add('nombre') 
       ->add('activo') 
       ->add('tipo_tramite', 'entity', array(
        'class' => 'ComunBundle:TipoTramite', 
        'property' => 'nombre', 
        'empty_value' => '-- SELECCIONAR --', 
        'query_builder' => function (EntityRepository $er) { 
         return $er->createQueryBuilder('qb') 
           ->where('qb.activo = :activoValue') 
           ->setParameter('activoValue', TRUE); 
        } 
     )); 
    } 

    abstract protected function getDataClass(); 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => $this->getDataClass() 
     )); 
    } 

} 

public class ModeloType extends AbstractModeloMarcaType 
{ 
    public function getName() 
    { 
     return 'Modelo'; 
    } 

    public function getDataClass() 
    { 
     return 'ComunBundle\Entity\Modelo'; 
    } 
} 

public class MarcaType extends AbstractModeloMarcaType 
{ 
    public function getName() 
    { 
     return 'Marca'; 
    } 

    public function getDataClass() 
    { 
     return 'ComunBundle\Entity\Marca'; 
    } 
} 
+0

실체가 거의 동일하지만 나는 내가 DB 모델 뒤에 전문가가 아니에요, 두 가지를두고 그 다른 테이블과의 관계를 공유하는, 즉 DB 설계자, 난 코드 뒤에 사람이야 – ReynierPM

관련 문제