• 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

Object Storage Arubacloud
0 głosów
1,018 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 (212,670 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ź 1,923 wizyt
pytanie zadane 10 grudnia 2022 w Java przez letmestay Użytkownik (520 p.)
0 głosów
2 odpowiedzi 1,159 wizyt
0 głosów
0 odpowiedzi 253 wizyt
pytanie zadane 2 września 2016 w C# przez lakewik Nowicjusz (120 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...