• 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,410 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,070 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,569 wizyt
pytanie zadane 10 grudnia 2022 w Java przez letmestay Użytkownik (520 p.)
0 głosów
2 odpowiedzi 1,965 wizyt
0 głosów
0 odpowiedzi 320 wizyt
pytanie zadane 2 września 2016 w C# przez lakewik Nowicjusz (120 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2459p. - CC PL
  9. 2410p. - Maurycy W
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...