2013-07-26 2 views
6

는 안녕 Symfony2 FormBuilder 몇 가지 문제가, 사실, 난 엔티티 ADRESS에 연결 (OneByOne)하는 기업 사용자를 모두 I'am는 정말 간단한 것 같다하지만 난 '때 m는 UserType을로 인 AddressType 양식을 삽입하려고 나는이 예외에 직면하고있어 하나 :Symfony2 : 폼의 데이터보기 문제가

형태의 뷰 데이터는 클래스 한국 전기 \ 번들 \ AddressBundle \ 법인 \ ADRESSE의 인스턴스가 될 것으로 예상하지만, 인스턴스이다

Doctrine \ Common \ Collections \ ArrayCollection 클래스에 있습니다. "data_class"옵션을 null로 설정하거나 Doctrine \ Common \ Collections \ ArrayCollection 클래스의 인스턴스를 Acme \ Bundle \ AddressBundle \ Entity \ Adresse의 인스턴스로 변환하는 뷰 변환기를 추가하여이 오류를 피할 수 있습니다.

class User extends BaseUser 
{ 
    ... 

    /** 
    * @ORM\OneToOne(targetEntity="Acme\bundle\AddressBundle\Entity\Address", cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(nullable=true) 
    * @Assert\Valid 
    */ 
    public $address; 

    ....... 

} 

LINKE :합니다 (FosUserBundle 하나의 확장)

내 사용자 클래스를 :

나는 내 문제가 더 understable하기 위해 여기 (읽을 수 감소) 일부 코드를 넣어 D 양식 유형 buildForm 기능 :

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     // add your custom field 
     $builder->add('name','text') 
       ->add('address',new AddressType(),array(

          'data_class' => 'Acme\Bundle\AddressBundle\Entity\Address' 

        ) 
       ); 


    } 

내 주소 양식 유형 :

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('city','text') 
       ->add('title','text'); 
    } 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\Bundle\AddressBundle\Entity\Address' 
     )); 
    } 

당신의 도움에 미리 감사합니다! 당신이 양식 필드 유형이 엔티티에서로드 알려해야합니다 있도록

+0

오류 메시지에서 제안한 내용을 시도해 보셨습니까? – cheesemacfly

+0

예 시도했으나 다음과 같은 메시지가 나타납니다. spl_object_hash()는 매개 변수 1이 객체가 될 것으로 예상합니다. –

답변

1

하나의 문제는 당신이 주소를 공용 속성 작성입니다. Doctrine 2에서는 개인 또는 보호 된 속성을 만들어야합니다. D2는 이것을 사용하여 지연로드를 구현합니다. 기본적으로 배열을 가져 오는 이유는 다소 수수께끼이지만 주소는 절대로드되지 않습니다. 주소를 생성자의 배열로 초기화하고 있습니까? 어쩌면 복사/붙여 넣기 오류일까요?

당신은이 있어야합니다

class User extends BaseUser 
{ 
    protected $address; 

    public function getAddress() { return $this->address; } 

당신은 또한 userObject로는 항상 주소 객체가 있거나 형태가 불평 할 수 있도록해야합니다.

============================================== ==========

당신의 페이스트 빈 보면, 나는 다음을 참조하십시오뿐만 아니라 원치 않는 배열을 설명하지만, 의지는 그것의 생성자는 엉망 FOS 사용자의 기본 클래스이기 때문에

class User extends BaseUser 
{ 
public function __construct() 
{ 
    $this->adresse = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

호출되지 않았습니다.

나는 당신이 단지 최소 사용자/주소로 아래 양식 유형을 제거하고 작업하는 것을 얻을 제안했다. 그런 다음 당신의 빌리 아와 다른 모든 것들을 더하십시오. 사실 간단한 사용자를 만든 다음 주소를 추가하는 것으로 시작하십시오.

사용자 개체를 어떻게 작성했는지 표시하지는 않았지만 양식을 시작하기 전에 주소 개체가 존재하는지 확인하는 것은 사용자의 몫이라는 것을 기억하십시오. 교리는 당신을 위해 그것을 창조하지 않을 것입니다.

+1

안녕하세요 Cerad, 고맙습니다, public에서 protected로 변경했습니다. 주소를 생성자의 배열로 초기화하지 않으며 사용자는 항상 –

+0

과 연결된 Address 개체를가집니다. 오류 메시지가 있습니다 ... Entity \ Adresse ... 귀하의 사업체는 주소라고합니다. 붙여 넣기 문제를 복사 하시겠습니까? 사용자 엔티티를 양식에 전달 하시겠습니까? 시스템에 두 가지 버전의 사용자가있는 것과 거의 같습니다. – Cerad

+0

Cerad, 복사 붙여 넣기 문제입니다. adresse를 주소로 생각합니다. FOSUserBundle 및 해당 RegistrationFormType을 사용하고 있습니다. 사용되는 유일한 User 엔티티는 FosuserBundle (Acme/Bundle/UserBundle/User)을 확장 한 것입니다. –

0

귀하의 주소는 엔티티이다. 여기를 참조하십시오 :이 같은 http://symfony.com/doc/2.2/reference/forms/types/entity.html

시도 뭔가 :

$builder->add('name', 'text') 
     ->add('address', 'entity',array(
       'class' => 'AddressBundle:Address', 
       'property' => 'address' 
)); 
+2

기존 엔티티 목록에서 선택해야 할 경우 엔티티 유형이 사용됩니다. op가하려고하는 것은 정확히 아닙니다. – Cerad