• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Symfony - Could not determine access type for property

0 głosów
1,330 wizyt
pytanie zadane 16 lutego 2021 w PHP przez XiverKi Bywalec (2,050 p.)

Dwie encje 

ReportSchemaRowElement

I relacje do niej posiada encja 

RowElementData

W pierwszej encji mam zrobioną właściwość

/**
 * @ORM\OneToMany(targetEntity=RowElementData::class, mappedBy="element", cascade={"persist", "remove"})
 */
private $rowElementData;

Definiuje ją w kosntruktorze 

$this->rowElementData = new ArrayCollection();

Posiadam metody:

/**
 * @return Collection|RowElementData[]
 */
public function getRowElementData(): Collection
{
    return $this->rowElementData;
}

public function addRowElementData(RowElementData $rowElementData): self
{
    if (!$this->rowElementData->contains($rowElementData)) {
        $this->rowElementData[] = $rowElementData;
        $rowElementData->setElement($this);
    }

    return $this;
}

public function removeRowElementData(RowElementData $rowElementData): self
{
    if ($this->rowElementData->removeElement($rowElementData)) {
        // set the owning side to null (unless already changed)
        if ($rowElementData->getElement() === $this) {
            $rowElementData->setElement(null);
        }
    }

    return $this;
}

A symfony krzyczy, że 

Could not determine access type for property "rowElementData" in class "App\Entity\ReportSchemaRowElement".

Co robie źle? Bo już nie wiem o co chodzi. Obiekty tworze za pomocą formualrzy symfony poprzez odwołanie postmanem.

Mam dodaną drugą właściwość na tej samej zasadzie iwszystko działa prawidłowo, a z tą są takie problemy.

2 odpowiedzi

0 głosów
odpowiedź 16 lutego 2021 przez Ehlert Ekspert (215,010 p.)
Spróbuj dodać setter dla tego pola.
komentarz 16 lutego 2021 przez XiverKi Bywalec (2,050 p.)

Hmm okej to zadziałało ale widze, że problem chyba jednak leży w innym miejscu.
Po stworzeniu kolekcji wygląda ona tak:

<?php
-rowElementData: array:1 [
0 => App\Entity\RowElementData {#3494
  -id: null
  -field: App\Entity\ReportSchemaSourceField {#3447}
  -element: null
}
]

Element powinien być obiektem nadrzędnym.

Encja ReportSchemaRowElement  posiada jeszcze dwie relację:

$this->rowElementDimensions = new ArrayCollection();
$this->rowElementProperty = new ArrayCollection();

u nich wszystko działa poprawnie, a zostałe dodana tak samo. Czyli poprzez automaty symfony make:entity, nie dodawałem żadnego settera.

Tworzona jest poprzez Type. Tak to wygląda mniej więcej:

Type dla ReportSchemaRowElement

<?php    
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('rowElementProperty', CollectionType::class, [
                'entry_type' => RowElementPropertyType::class,
                'allow_add' => true,
            ])
            ->add('rowElementDimensions', CollectionType::class, [
                'entry_type' => RowElementDimensionType::class,
                'allow_add' => true,
            ])
            ->add('rowElementData', CollectionType::class, [
                'entry_type' => RowElementDataType::class,
                'allow_add' => true,
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => ReportSchemaRowElement::class,
        ]);
    }

 

RowElementDataType:
 

<?php
class RowElementDataType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('field')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => RowElementData::class,
        ]);
    }
}

A tutaj kolejna relacja, która działa całkowicie poprawnie.

<?php
class RowElementDimensionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('aggregationType')
            ->add('field')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => RowElementDimension::class,
        ]);
    }
}

Relacja w jej encji wygląda tak:

/**
 * @ORM\ManyToOne(targetEntity=ReportSchemaRowElement::class, inversedBy="rowElementDimensions")
 * @ORM\JoinColumn(nullable=false)
 */
private $element;

InversedBy:

<?php
    /**
     * @ORM\OneToMany(targetEntity=RowElementDimension::class, mappedBy="element", cascade={"persist", "remove"})
     * @Groups("listing")
     */
    private $rowElementDimensions;

 

0 głosów
odpowiedź 17 lutego 2021 przez XiverKi Bywalec (2,050 p.)
Udało mi się obejść problem dodając nową relacje, która sprawować będzie własnie tą rolę.
Zakładam,m że symfony / doctrine coś zapisuje w cache czego nie sposób usunąć i przez to nie działa.

Nie mam pojecia o co chodzi, jeżeli jakaś mądra głowa zna odpowiedź możę się podzielić na przysżłośc

Podobne pytania

0 głosów
1 odpowiedź 2,391 wizyt
pytanie zadane 10 grudnia 2022 w Java przez letmestay Użytkownik (520 p.)
0 głosów
2 odpowiedzi 1,728 wizyt
0 głosów
0 odpowiedzi 281 wizyt
pytanie zadane 2 września 2016 w C# przez lakewik Nowicjusz (120 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...