Reputation: 67
I'm working on a symfony project and I wanted to create a form class. But when I create generate class PropertyType
, it does not find, and I have an error in the edit method:
Property "postalCode" does not exist in class "App\Entity\Property"
My code:
/**
* @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()
]);
}
And the Property class (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 class generated with 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,
]);
}
}
Upvotes: 3
Views: 2581
Reputation: 125
I am experiencing a similar issue where i'm using underscores in my entity but the form is looking for camel case variant (ex: form is looking for firstName but the entity has first_name).
I believe this may be an issue with the most recent version of Symfony seeing how your question is very recent and how the project i'm working on is using Symfony 4.3. My Symfony 4.2 project uses underscores in the entity and does not experience this issue with the form builder. So I'm gonna go on a hunch and say that this is a Symfony issue with some recent changes they made in this minor release. I'll look into reporting the issue on Git.
Changing your entities to use mixed case is a work-around; however when you've already got entities generated and relationships created this is a lengthy work-around for something that should just work.
Upvotes: 0
Reputation: 4691
I believe this is because your getters don't match. So instead of :
public function getPostalCode(): ?string
{
return $this->postal_code;
}
try:
public function getPostal_code(): ?string
{
return $this->postal_code;
}
Do the same for your created_at
and your setters.
Using the ccoding standard (CamelCase here) will make your life easier. So postalCode
instead of postal_code
etc...
Upvotes: 1