Не удалось определить тип доступа для свойства "offerOrders" в классе "App\Form\OrderType": ни одно свойство
Ошибка :
Не удалось определить тип доступа для свойства "offerOrders" в классе "App\Form\OrderType": ни свойство "offerOrders", ни один из методов "addOfferOrder()"/"removeOfferOrder()", "setOfferOrders()", "offerOrders()", "__set()"или"__call()"существуют и имеют открытый доступ в классе" App \ Form \ OrderType "..
PhotoSession Класс
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\PhotoSessionRepository")
*/
class PhotoSession
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Order", inversedBy="photoSession", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $purchaseOrder;
Класс заказа
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\OrderRepository")
* @ORM\Table(name="`order`")
*/
class Order
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\PhotoSession", mappedBy="purchaseOrder", cascade={"persist", "remove"})
*/
private $photoSession;
/**
* @ORM\OneToMany(targetEntity="App\Entity\OfferOrder", mappedBy="purchaseOrder", cascade={"persist"})
*/
private $offerOrders;
public function __construct()
{
$this->offerOrders = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getPhotoSession(): ?PhotoSession
{
return $this->photoSession;
}
public function setPhotoSession(PhotoSession $photoSession): self
{
$this->photoSession = $photoSession;
// set the owning side of the relation if necessary
if ($photoSession->getPurchaseOrder() !== $this) {
$photoSession->setPurchaseOrder($this);
}
return $this;
}
/**
* @return Collection|OfferOrder[]
*/
public function getOfferOrders(): Collection
{
return $this->offerOrders;
}
public function addOfferOrder(OfferOrder $offerOrder): self
{
if (!$this->offerOrders->contains($offerOrder)) {
$this->offerOrders[] = $offerOrder;
$offerOrder->setPurchaseOrder($this);
}
return $this;
}
public function removeOfferOrder(OfferOrder $offerOrder): self
{
if ($this->offerOrders->contains($offerOrder)) {
$this->offerOrders->removeElement($offerOrder);
// set the owning side to null (unless already changed)
if ($offerOrder->getPurchaseOrder() === $this) {
$offerOrder->setPurchaseOrder(null);
}
}
return $this;
}
}
OfferOrder Класс
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\OfferOrderRepository")
*/
class OfferOrder
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Offer", inversedBy="offerOrders")
* @ORM\JoinColumn(nullable=false)
*/
private $offer;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order", inversedBy="offerOrders")
* @ORM\JoinColumn(nullable=false)
*/
private $purchaseOrder;
/**
* @ORM\Column(type="float", nullable=true)
*/
private $quantity;
/**
* @ORM\Column(type="float", nullable=true)
*/
private $totalPriceHt;
public function getId(): ?int
{
return $this->id;
}
public function getOffer(): ?Offer
{
return $this->offer;
}
public function setOffer(?Offer $offer): self
{
$this->offer = $offer;
return $this;
}
public function getPurchaseOrder(): ?Order
{
return $this->purchaseOrder;
}
public function setPurchaseOrder(?Order $purchaseOrder): self
{
$this->purchaseOrder = $purchaseOrder;
return $this;
}
public function getQuantity(): ?float
{
return $this->quantity;
}
public function setQuantity(?float $quantity): self
{
$this->quantity = $quantity;
return $this;
}
public function getTotalPriceHt(): ?float
{
return $this->totalPriceHt;
}
public function setTotalPriceHt(?float $totalPriceHt): self
{
$this->totalPriceHt = $totalPriceHt;
return $this;
}
}
предложить класс
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\OfferRepository")
*/
class Offer
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="float")
*/
private $price;
/**
* @var Tag
* @ORM\ManyToOne(targetEntity="App\Entity\Tag")
* @ORM\JoinColumn(nullable=false)
*/
private $tag;
/**
* @var integer|null
* @ORM\Column(type="integer")
*/
private $version = 0;
/**
* @ORM\OneToMany(targetEntity="App\Entity\OfferOrder", mappedBy="offer")
*/
private $offerOrders;
public function __construct()
{
$this->offerOrders = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getPrice(): ?float
{
return $this->price;
}
public function setPrice(float $price): self
{
$this->price = $price;
return $this;
}
/**
* @return Tag|null
*/
public function getTag(): ?Tag
{
return $this->tag;
}
/**
* @param Tag $tag
* @return Offer
*/
public function setTag(Tag $tag): self
{
$this->tag = $tag;
return $this;
}
/**
* @return int|null
*/
public function getVersion(): ?int
{
return $this->version;
}
/**
* @param int|null $version
* @return Offer
*/
public function setVersion(?int $version): self
{
$this->version = $version;
return $this;
}
/**
* @return Collection|OfferOrder[]
*/
public function getOfferOrders(): Collection
{
return $this->offerOrders;
}
public function addOfferOrder(OfferOrder $offerOrder): self
{
if (!$this->offerOrders->contains($offerOrder)) {
$this->offerOrders[] = $offerOrder;
$offerOrder->setOffer($this);
}
return $this;
}
public function removeOfferOrder(OfferOrder $offerOrder): self
{
if ($this->offerOrders->contains($offerOrder)) {
$this->offerOrders->removeElement($offerOrder);
// set the owning side to null (unless already changed)
if ($offerOrder->getOffer() === $this) {
$offerOrder->setOffer(null);
}
}
return $this;
}
}
SessionPhotoType
<?php
namespace App\Form;
use App\Entity\Family;
use App\Entity\PhotoSession;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PhotoSessionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('description')
->add('family', EntityType::class, [
'class' => Family::class,
'choice_label' => 'name',
])
->add('purchaseOrder', OrderType::class, [
'data_class' => OrderType::class
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => PhotoSession::class,
]);
}
}
OrderType
<?php
namespace App\Form;
use App\Entity\Order;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class OrderType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('offerOrders', CollectionType::class, [
'entry_type' => OfferOrderType::class,
'by_reference' => false,
'allow_add' => true,
'allow_delete' => true,
])
->add('totalPriceHt')
->add('tva')
->add('finalPrice')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Order::class,
]);
}
}
OfferOrderType
class OfferOrderType расширяет AbstractType {общедоступная функция buildForm(FormBuilderInterface $builder, array $ options) {$ builder
->add('offer', EntityType::class, [
'class' => Offer::class,
'choice_label' => function(Offer $offer) {
return sprintf('%s %f €', $offer->getTag()->getName(), $offer->getPrice());
},
'placeholder' => 'Choissiez une offre'
])
->add('quantity', NumberType::class)
->add('totalPriceHt', NumberType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'widget' => 'single_text',
'data_class' => OfferOrder::class,
]);
}
}
Прошу прощения за длинные блоки кода, но для людей, которые попытаются исправить ошибку, я думаю, что есть необходимый. Ошибка возвращается, когда я отправляю форму. Я задаю себе вопрос: почему symfony ищет аксессоры в классе App \ Form \ OrderType?
Я помещаю дампы повсюду в PropertyAccessor.php PropertyPathMapper.php и vendor/symfony/form/Form.php, и когда он идет сюда:
if (FormUtil::isEmpty($viewData)) {
$emptyData = $this->config->getEmptyData();
if ($emptyData instanceof \Closure) {
$emptyData = $emptyData($this, $viewData);
}
$viewData = $emptyData;
dump($viewData);
}
в Form.php он устанавливает $viewData на App\Form\OrderType
но я не знаю почему
Ответ был такой:
Чтобы форма прошла успешно, необходимо было изменить PurchaseOrder в photoSessionType следующим образом:
-> add ('purchaseOrder', OrderType :: class)
Еще раз спасибо @Ihor Kostrov
1 ответ
Попробуй изменить
->add('purchaseOrder', OrderType::class, [
'data_class' => OrderType::class
])
Чтобы
->add('purchaseOrder', OrderType::class, [
'data_class' => Order::class
])
Или просто удалите параметр data_class