Форма сборки на Symfony, свойство не существует - PullRequest
2 голосов
/ 11 июня 2019

Я работаю над проектом Symfony, и я хотел создать класс формы.Но когда я создаю сгенерированный класс PropertyType, он не находит, и у меня возникает ошибка в методе редактирования:

Property "postalCode" does not exist in class "App\Entity\Property"

Мой код:

/**
 * @Route("/admin/{id}", name="admin.property.edit")
 * @param Property $property
 * @return Response
 */
public function edit (Property $property) : Response
{
    $form = $this->createForm(PropertyType::class, $property);
    return $this->render('admin/property/edit.html.twig', [
        'property'  =>  $property,
        'form'      =>  $form->createView()
    ]);
}

И класс Property(Entity):

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Cocur\Slugify\Slugify;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PropertyRepository")
 */
class Property
{

    const HEAT = [
        0   => 'Electrique',
        1   => 'Gaz'
    ];

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $description;

    /**
     * @ORM\Column(type="integer")
     */
    private $surface;

    /**
     * @ORM\Column(type="integer")
     */
    private $rooms;

    /**
     * @ORM\Column(type="integer")
     */
    private $bedrooms;

    /**
     * @ORM\Column(type="integer")
     */
    private $floor;

    /**
     * @ORM\Column(type="integer")
     */
    private $price;

    /**
     * @ORM\Column(type="integer")
     */
    private $heat;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $city;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $address;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $postal_code;

    /**
     * @ORM\Column(type="boolean", options={"default": false})
     */
    private $sold = false;

    /**
     * @ORM\Column(type="datetime")
     */
    private $created_at;

    public function __construct ()
    {
        $this->created_at = new \DateTime();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function getSlug() : string
    {
        return (new Slugify())->slugify($this->title);
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(?string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getSurface(): ?int
    {
        return $this->surface;
    }

    public function setSurface(int $surface): self
    {
        $this->surface = $surface;

        return $this;
    }

    public function getRooms(): ?int
    {
        return $this->rooms;
    }

    public function setRooms(int $rooms): self
    {
        $this->rooms = $rooms;

        return $this;
    }

    public function getBedrooms(): ?int
    {
        return $this->bedrooms;
    }

    public function setBedrooms(int $bedrooms): self
    {
        $this->bedrooms = $bedrooms;

        return $this;
    }

    public function getFloor(): ?int
    {
        return $this->floor;
    }

    public function setFloor(int $floor): self
    {
        $this->floor = $floor;

        return $this;
    }

    public function getPrice(): ?int
    {
        return $this->price;
    }

    public function getFormattedPrice() : string
    {
        return \number_format($this->price, 0, '', ' ');
    }

    public function setPrice(int $price): self
    {
        $this->price = $price;

        return $this;
    }

    public function getHeat(): ?int
    {
        return $this->heat;
    }

    public function getHeatType(): string
    {
        return self::HEAT[$this->heat];
    }

    public function setHeat(int $heat): self
    {
        $this->heat = $heat;

        return $this;
    }

    public function getCity(): ?string
    {
        return $this->city;
    }

    public function setCity(string $city): self
    {
        $this->city = $city;

        return $this;
    }

    public function getAddress(): ?string
    {
        return $this->address;
    }

    public function setAddress(string $address): self
    {
        $this->address = $address;

        return $this;
    }

    public function getPostalCode(): ?string
    {
        return $this->postal_code;
    }

    public function setPostalCode(string $postal_code): self
    {
        $this->postal_code = $postal_code;

        return $this;
    }

    public function getSold(): ?bool
    {
        return $this->sold;
    }

    public function setSold(bool $sold): self
    {
        $this->sold = $sold;

        return $this;
    }

    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->created_at;
    }

    public function setCreatedAt(\DateTimeInterface $created_at): self
    {
        $this->created_at = $created_at;

        return $this;
    }
}

Класс PropertyType, созданный с помощью Symfony.

<?php

namespace App\Form;

use App\Entity\Property;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PropertyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('description')
            ->add('surface')
            ->add('rooms')
            ->add('bedrooms')
            ->add('floor')
            ->add('price')
            ->add('heat')
            ->add('city')
            ->add('address')
            ->add('postal_code')
            ->add('sold')
            ->add('created_at')
        ;
    }

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

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Я считаю, что это потому, что ваши геттеры не совпадают.Поэтому вместо:

    public function getPostalCode(): ?string
{
    return $this->postal_code;
}

попробуйте:

public function getPostal_code(): ?string
{
    return $this->postal_code;
}

Сделайте то же самое для вашего created_at и ваших сеттеров.

Использование стандарта кодирования (здесь CamelCase) сделает вашу жизнь проще.Так что postalCode вместо postal_code и т.д ...

0 голосов
/ 21 июня 2019

У меня возникла похожая проблема, в которой я использую подчеркивания в моей сущности, но форма ищет вариант с верблюжьим регистром (например, форма ищет firstName, но у сущности есть first_name).

Я полагаю, что это может быть проблема с самой последней версией Symfony, которая видит, как ваш вопрос очень свежий и как проект, над которым я работаю, использует Symfony 4.3.Мой проект Symfony 4.2 использует подчеркивание в сущности и не сталкивается с этой проблемой при построении форм.Так что я пойду на догадку и скажу, что это проблема Symfony с некоторыми недавними изменениями, которые они внесли в этот минорный выпуск.Я посмотрю на сообщение о проблеме на Git.

Изменение ваших сущностей для использования смешанного регистра - это обходной путь;однако, когда у вас уже созданы сущности и созданы отношения, это длительный обходной путь для чего-то, что должно просто работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...