[英]Error when embed a collection of Forms in Symfony2
我正在嘗試在symfony2應用程序中嵌入一組表單。 我必須簡單的實體: Shop
和Address
,其中有多個地址的商店。 我遵循Symfony2文檔,但出現錯誤:
屬性“ address”或方法“ getAddress()”,“ address()”,“ isAddress()”,“ hasAddress()”,“ __ get()”都不存在,並且在類“ AppBundle \\”中沒有公共訪問權限實體\\地址”。 500內部服務器錯誤-NoSuchPropertyException
在我看來,它正在嘗試訪問我的Address Entity
的address
權限。
這是我的Shop Entity
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use AppBundle\Entity\Address;
use UserBundle\Entity\Seller;
/**
* Shop
*
* @ORM\Table(name="app_shop")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ShopRepository")
*/
class Shop
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="shopName", type="string", length=255)
*/
private $shopName;
/**
* @var string
* @ORM\Column(name="description", type="text", nullable=true)
*/
private $description;
/**
* @var string
* @ORM\Column(name="ownerName", type="string", length=255)
*/
private $ownerName;
/**
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\Seller", cascade={"refresh"}, fetch="EAGER")
* @ORM\JoinColumn(nullable=false, onDelete="NO ACTION")
* @Assert\Valid()
*/
private $owner;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Address", mappedBy="shop")
* @Assert\Valid()
*/
private $address;
/**
* @ORM\Column(type="string", nullable=true)
* @Assert\Length(
* min = 9,
* max = 10,
* minMessage = "Le numéro siret doit contenir 10 chiffres",
* maxMessage = "Le numéro siret doit contenir 10 chiffres"
* )
*/
private $siret;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Image")
* @ORM\JoinColumn(nullable=true)
*/
private $image;
public function __construct()
{
$this->address = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set shopName
*
* @param string $shopName
* @return Shop
*/
public function setShopName($shopName)
{
$this->shopName = $shopName;
return $this;
}
/**
* Get shopName
*
* @return string
*/
public function getShopName()
{
return $this->shopName;
}
/**
* Set shopName
*
* @param string $description
* @return Shop
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set ownerName
*
* @param string $ownerName
* @return Shop
*/
public function setOwnerName($ownerName)
{
$this->ownerName = $ownerName;
return $this;
}
/**
* Get ownerName
*
* @return string
*/
public function getOwnerName()
{
return $this->ownerName;
}
/**
* Set siret
*
* @param string $siret
* @return Shop
*/
public function setSiret($siret)
{
$this->siret = $siret;
return $this;
}
/**
* Get siret
*
* @return string
*/
public function getSiret()
{
return $this->siret;
}
/**
* Set address
*
* @param ArrayCollection $address
*
* @return Address
*/
public function setAddress(ArrayCollection $address)
{
$this->address = $address;
return $this;
}
/**
* Get address
*
* @return \AppBundle\Entity\Address
*/
public function getAddress()
{
return $this->address;
}
/**
* Set owner
*
* @param \UserBundle\Entity\Seller $owner
*
* @return Owner
*/
public function setOwner(Seller $owner = null)
{
$this->owner = $owner;
return $this;
}
/**
* Get owner
*
* @return \UserBundle\Entity\Sellers
*/
public function getOwner()
{
return $this->owner;
}
/**
*
* @param Image $image
* @return \AppBundle\Entity\Shop
*/
public function setImage(Image $image)
{
$this->image = $image;
return $this;
}
/**
*
*/
public function getImage()
{
return $this->image;
}
}
這是我的Address Entity
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Adress
*
* @ORM\Table(name="app_address")
* @ORM\Entity(repositoryClass="AppBundle\Repository\AddressRepository")
*/
class Address
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="street", type="string", length=255)
* @Assert\Length( min = 5 ,
* max = 200,
* minMessage = "L'adresse doit faire au minimum {{ limit }} caractères.",
* maxMessage = "L'adresse doit faire au maximum {{ limit }} caractères.")
*
*/
private $street;
/**
* @ORM\Column(type="string", length=5)
* @Assert\Regex(
* pattern="/^\d{4,5}$/",
* match=true,
* message="Le format n'est pas correct"
* )
*/
private $postalCode;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $city;
/**
* @var string
*
* @ORM\Column(name="country", type="string", length=255 , nullable=true)
* @Assert\Length( min = 3 ,
* max = 50,
* minMessage = "Le pays doit faire au minimum {{ limit }} caractères.",
* maxMessage = "L'adresse doit faire au maximum {{ limit }} caractères.")
*
*/
private $country;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Shop", inversedBy="address")
* @ORM\JoinColumn(name="shop_id", referencedColumnName="id")
*/
private $shop;
/**
* Get id
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set street
*
* @param string $street
*
* @return Address
*/
public function setStreet($street)
{
$this->street = $street;
return $this;
}
/**
* Get street
*
* @return string
*/
public function getStreet()
{
return $this->street;
}
/**
* Set postalCode
* @return Address
*/
public function setPostalCode($postalCode)
{
$this->postalCode = $postalCode;
return $this;
}
/**
* Get postalCode
*/
public function getPostalCode()
{
return $this->postalCode;
}
/**
*
* @param string
* @return \AppBundle\Entity\Address
*/
public function setCity($city = null)
{
$this->city = $city;
return $this;
}
/**
*
*/
public function getCity()
{
return $this->city;
}
/**
*
* @param string
* @return \AppBundle\Entity\Address
*/
public function setCountry($country = null)
{
$this->country = $country;
return $this;
}
/**
*
*/
public function getCountry()
{
return $this->country;
}
/**
*
* @param Shop
* @return \AppBundle\Entity\Address
*/
public function setShop($shop = null)
{
$this->shop = $shop;
return $this;
}
/**
*
*/
public function getShop()
{
return $this->shop;
}
public function __toString() {
return $this->street." ".$this->postalCode." ".$this->city;
}
}
我創建了兩個formType來管理我的實體:
ShopType.php
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use AppBundle\Form\AddressType;
use AppBundle\Entity\Shop;
use AppBundle\Entity\Address;
class ShopType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('shopName', TextType::class, array('label' => 'Nom du magasin *', 'required' => true, 'error_bubbling' => true))
->add('ownerName', TextType::class, array('label' => 'Nom du gérant *', 'required' => true, 'error_bubbling' => true))
->add('address', CollectionType::class, array( 'entry_type' => AddressType::class,
'allow_add' => true,
'label' => 'Adresse *',
'required' => true
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Shop::class,
));
}
}
AddressType.php
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use AppBundle\Entity\Address;
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('address', TextType::class, array('label' => 'Adresse*', 'required' => true))
->add('CodePostal', TextType::class, array('label' => 'Code postal*', 'required' => true, 'error_bubbling' => true))
->add('Ville', TextType::class, array('label' => 'Ville', 'required' => false, 'error_bubbling' => true))
->add('Pays', 'choice', array(
'choices' => array(
'FR' => 'France',
'SU' => 'Suisse',
'BE' => 'Belgique'
)
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Address::class,
));
}
public function getName()
{
return 'addresse';
}
}
在我的控制器中,我實例化如下:
$shop = $shopRepo->findOneByOwner($user);
if ($shop == null){
$shop = new Shop();
}
$form = $this->createForm(ShopType::class , $shop);
發生此錯誤是由於AddressType
類的以下行:
->add('address', TextType::class, array('label' => 'Adresse*', 'required' => true))
您正在嘗試訪問“ Address
實體的address
屬性,但其中不包含該屬性。 這與其他字段有關: CodePostal
=> postalCode
等
同樣在您的Shop
實體上,您將address
字段注釋為OneToMany
關系,這是可以的,並且同時您擁有setAddress(ArrayCollection $address)
方法,但是應該具有:
public function addAddress(Address $address)
{
$this->address->add($address);
return $this;
}
和可選
public function removeAddress(Address $address)
{
$this->address->remove($address);
return $this;
}
順便說一句,我建議將屬性address
重命名為addresses
以突出顯示它應包含集合,但不能包含單個實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.