• 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

42 Warsaw Coding Academy
0 głosów
1,320 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,367 wizyt
pytanie zadane 10 grudnia 2022 w Java przez letmestay Użytkownik (520 p.)
0 głosów
2 odpowiedzi 1,688 wizyt
0 głosów
0 odpowiedzi 280 wizyt
pytanie zadane 2 września 2016 w C# przez lakewik Nowicjusz (120 p.)

93,377 zapytań

142,379 odpowiedzi

322,526 komentarzy

62,724 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
...