2016-07-27 1 views
0

두 개의 간단한 객체 PurchaseAddress을 설정하려고합니다.일대일 위험 - 잡히지 않은 PHP 예외 Symfony Component PropertyAccess Exception NoSuchPropertyException

하나 개 구입 여러 주소 (구매 주소, 청구서 주소)를 가질 수

같은 주소 엔티티에서

단순화 ORM 보인다 :

X\Entity\Purchase: 
    repositoryClass: X\Repository\PurchaseRepository 
    type: entity 
    oneToMany: 
     addresses: 
      targetEntity: Address 
      mappedBy: purchase 
    id: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
    fields: 
     quantity: 
      type: integer 
     orderedAt: 
      type: datetime 
     toBeDeliveredAt: 
      type: datetime 
    lifecycleCallbacks: { } 
:

X\Entity\Address: 
    repositoryClass: X\Repository\AddressRepository 
    type: entity 
    manyToOne: 
     purchase: 
      targetEntity: Purchase 
      inversedBy: addresses 
      joinColumn: 
       name: purchase_id 
       referencedColumnName: id 
    id: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
    fields: 
     firstname: 
      type: string 
      length: 255 
     email: 
      type: string 
      length: 255 
    lifecycleCallbacks: { } 
구매 법인에서

단순화 ORM의 모습

구매 클래스의 다음 줄에 오류가 발생합니다.

말 :

어느 재산 "주소"나 방법 중 하나 "getAddress에()", "주소()", "isAddress()", "hasAddress()", "__get()"이 (가) 있고 "X \ Entity \ Purchase"클래스에 공개 액세스 권한이 있습니다.

어느 것이 정확합니까? 속성 address이없고 그 기존 속성에 대한 방법이 없습니다.

문제가되는 부동산 종류는 addresses이고 방법은 getAddresses이지만 문제가 있습니다.

이제 "시스템"(심포니?)이 속성 이름 address을 검색하는 이유는 무엇입니까? 그리고 물론 어떻게 해결할 수 있습니까?

업데이트

오류는 양식 제출에 발생합니다.

class DefaultController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     $purchase = new Purchase(); 
     $form = $this->createFormBuilder($purchase) 
      ->add('address', AddressType::class) 
      ->add('quantity', IntegerType::class) 
      ->add('toBeDeliveredAt', DateType::class) 
      ->add('comment', TextareaType::class) 
      ->add('save', SubmitType::class, array('label' => 'Submit')) 
      ->getForm(); 

     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($purchase); 
      $em->flush(); 
     } 


     return $this->render('X:Default:index.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
} 

을 그리고 인 AddressType은 다음과 같습니다 : 컨트롤러는 다음과 같습니다 돕는

class AddressType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('firstname', TextType::class) 
      ->add('email', EmailType::class); 
    } 
} 

감사합니다! 필요한 경우

는 전체 구매 클래스는 다음과 같습니다

<?php 

namespace X\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Purchase 
*/ 
class Purchase 
{ 
    /** 
    * @var int 
    */ 
    private $id; 

    /** 
    * @var int 
    */ 
    private $quantity; 

    /** 
    * @var \DateTime 
    */ 
    private $orderedAt; 

    /** 
    * @var \DateTime 
    */ 
    private $toBeDeliveredAt; 

    /** 
    * @var bool 
    */ 
    private $delivered; 

    /** 
    * @var \DateTime 
    */ 
    private $deliveredAt; 

    /** 
    * @var bool 
    */ 
    private $payd; 

    /** 
    * @var \DateTime 
    */ 
    private $paydAt; 

    /** 
    * @var string 
    */ 
    private $comment; 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    */ 
    private $addresses; 

    /** 
    * 
    */ 
    public function __construct() 
    { 
     $this->addresses = new ArrayCollection(); 
    } 


    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set quantity 
    * 
    * @param integer $quantity 
    * @return Purchase 
    */ 
    public function setQuantity($quantity) 
    { 
     $this->quantity = $quantity; 

     return $this; 
    } 

    /** 
    * Get quantity 
    * 
    * @return integer 
    */ 
    public function getQuantity() 
    { 
     return $this->quantity; 
    } 

    /** 
    * Set orderedAt 
    * 
    * @param \DateTime $orderedAt 
    * @return Purchase 
    */ 
    public function setOrderedAt($orderedAt) 
    { 
     $this->orderedAt = $orderedAt; 

     return $this; 
    } 

    /** 
    * Get orderedAt 
    * 
    * @return \DateTime 
    */ 
    public function getOrderedAt() 
    { 
     return $this->orderedAt; 
    } 

    /** 
    * @param \DateTime $toBeDeliveredAt 
    */ 
    public function setToBeDeliveredAt($toBeDeliveredAt) 
    { 
     $this->toBeDeliveredAt = $toBeDeliveredAt; 
    } 

    /** 
    * @return \DateTime 
    */ 
    public function getToBeDeliveredAt() 
    { 
     return $this->toBeDeliveredAt; 
    } 

    /** 
    * @param Address $address 
    * @return Address 
    */ 
    public function addAddress(Address $address) 
    { 
     $this->addresses[] = $address; 
     if($address->getPurchase() !== $this) { 
      $address->setPurchase($this); 
     } 
     return $this; 
    } 

    /** 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getAddresses() 
    { 
     return $this->addresses; 
    } 
} 
+0

언제이 오류가 있습니까? – DOZ

+0

@DOZ 양식 제출시 질문에 부품이 포함됩니다. – caramba

+0

@DOZ 질문은 Controller indexAction 및 AddressType ... – caramba

답변

1

오류는 PurchaseType에 ->add('address', AddressType::class)에서 온다.

->add('addresses', AddressType::class) 
+0

CollectionType? – caramba

+1

실수는 미안 해요 내 대답을 편집합니다. – DOZ

0

나는 또한 직면 같은 문제 :

이보십시오. 하지만이 문제를 해결할 수있었습니다.

entity.orm.yml 파일을 확인하고 관계를 만드는 필드 인 form에서 필드를 제거하십시오.

$builder->add('question')->add('demographicYesNo')->add('questionSetId')->add('questionOptionTypeId')->add('questionSliderRange'); 

그래서,

추가 ('questionSetId')을 제거한 -> 나는 기본적으로이 분야에 대한 관계와 심포니를 생성되면서 ('questionOptionTypeId')

를 추가 양식에 이것을 추가하십시오.

감사합니다,

제공 : Anirudh 수드.

관련 문제