Model (Entities) in Symfony

Model of Entity?

In het MVC model heb je de models, in het geval van Symfony heten ze Entities. Daar waar we op MBO-SD schrijven over Models bedoelen we ook Entities en andersom. Het is op deze site dus hetzelfde.

Een Entity is een object in Symfony waar je data in/ uit kan halen. Een Entity is praktisch altijd verbonden aan een tabel in de database. Met Symfony kan je deze ook vrij makkelijk aanmaken.

Aanmaken van een nieuwe Entity

Om een entity aan te maken heb je het commando symfony console make:entity [EntityName]
Als je het commando uitvoert zonder een naam zal de eerste vraag de naam van de Entity te zijn, maar je kan ook het commando uitvoeren met de naam na make:entity.

Belangrijk!

Entities in Symfony zijn PHP-Classes en worden ALTIJD met hoofdletters geschreven.
Een Entity is altijd enkelvoud, het is altijd verbonden met 1 rij/ deel uit de gekoppelde tabel
Als je een nieuwe Entity aanmaakt wordt het veld id altijd toegevoegd als primary-key en met auto-increment erop. Dit hoef je zelf niet te doen!
Je moet weten wat voor datatypen jouw velden zijn, hiervoor gebruik je uiteraard de ERD van jouw applicatie!
Het datatype relation is een speciaal datatype, zie verderop voor meer informatie!

Per veld worden er 3-5 belangrijke vragen gesteld:

  • De naam van de property (veld in de database)
  • Datatype van de property (standaard string, dit is character varying)
  • Afhankelijk van de datatype een of twee vragen over de datatype, bij een string bijvoorbeeld de grote (standaard 255 karakters)
  • Mag de property leeg zijn in de database (nullable)
Na deze vier vragen krijg je de vraag of je een nieuwe property wil toevoegen, dit kan door de nieuwe naam van de nieuwe property toe te voegen, druk op enter om te stoppen.
Onderstaand een voorbeeld van een nieuwe Entity van een boek (Book).
# symfony console make:entity Book
 created: src/Entity/Book.php
 created: src/Repository/BookRepository.php

 Entity generated! Now let's add some fields!
 You can always add more fields later manually or by re-running this command.

 New property name (press <return> to stop adding fields):
 > name

 Field type (enter ? to see all types) [string]:
 > ?

Main Types
  * string
  * text
  * boolean
  * integer or smallint or bigint
  * float

Relationships/Associations
  * relation or a wizard 🧙 will help you build the relation
  * ManyToOne
  * OneToMany
  * ManyToMany
  * OneToOne

Array/Object Types
  * array or simple_array
  * json
  * object
  * binary
  * blob

Date/Time Types
  * datetime or datetime_immutable
  * datetimetz or datetimetz_immutable
  * date or date_immutable
  * time or time_immutable
  * dateinterval

Other Types
  * ascii_string
  * decimal
  * guid


 Field type (enter ? to see all types) [string]:
 > string

 Field length [255]:
 >

 Can this field be null in the database (nullable) (yes/no) [no]:
 >

 updated: src/Entity/Book.php

 Add another property? Enter the property name (or press <return> to stop adding fields):
 > description

 Field type (enter ? to see all types) [string]:
 >

 Field length [255]:
 >

 Can this field be null in the database (nullable) (yes/no) [no]:
 >

 updated: src/Entity/Book.php

 Add another property? Enter the property name (or press <return> to stop adding fields):
 >

  Success!


 Next: When you're ready, create a migration with symfony console make:migration

Maken van de migratie en uitvoeren van de migratie

Als je de tekst goed leest raadt Symfony aan om een migratie bestand aan te maken, dit doe je met het commando symfony console make:migration (dit staat letterlijk ook in de tekst).
Na het uitvoeren zie je ongeveer de volgende informatie terug

# symfony console make:migration
 created: migrations/Version20240330142545.php


  Success!


 Review the new migration then run it with symfony console doctrine:migrations:migrate
 See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html

Dit commando maakt een nieuw Version- bestand aan in de map /migrations/Version----.php. Als je dit bestand bekijkt zie je de MYSQL commando's die uitgevoerd gaan worden. Als de migratie bestanden klaar gezet zijn kan je ze vervolgens uitvoeren met het commando:
symfony console doctrine:migrations:migrate
Dit zorgt ervoor dat de SQL-statements uit het Version-- bestand uitgevoerd worden.
Voer altijd de make:migration en doctrine:migrations:migrate uit na het maken of aanpassen van een Entity!

Aanpassen van een Entity

Om een Entity aan te passen, je wilt een property bijvoorbeeld toevoegen, gebruik je weer het commando wat je gebruikt om een Entity aan te maken, Symfony zal zien dat de Entity al bestaat en zal je vragen wat je wilt toevoegen.

# symfony console make:entity User
 Your entity already exists! So let's add some new fields!

 New property name (press <return> to stop adding fields):
 > date_of_birth

 Field type (enter ? to see all types) [string]:
 > ?

Main Types
  * string
  * text
  * boolean
  * integer or smallint or bigint
  * float

Relationships/Associations
  * relation or a wizard 🧙 will help you build the relation
  * ManyToOne
  * OneToMany
  * ManyToMany
  * OneToOne

Array/Object Types
  * array or simple_array
  * json
  * object
  * binary
  * blob

Date/Time Types
  * datetime or datetime_immutable
  * datetimetz or datetimetz_immutable
  * date or date_immutable
  * time or time_immutable
  * dateinterval

Other Types
  * ascii_string
  * decimal
  * guid


 Field type (enter ? to see all types) [string]:
 > date

 Can this field be null in the database (nullable) (yes/no) [no]:
 >

 updated: src/Entity/User.php

 Add another property? Enter the property name (or press  to stop adding fields):
 >



  Success!


 Next: When you're ready, create a migration with symfony console make:migration
Een voorbeeld van het aanpassen van de User entity met een datum veld

De repository

Als je een nieuwe Entity maakt wordt er voor die Entity ook een repository gemaakt. Deze vind je in de map src/Repository en heeft altijd de naam van jouw entity met het woord Repository. Deze repository wordt gebruikt als link tussen de entity en de database. In de basis hoef je niets met het bestand te doen, je kan ze som in je functie gebruiken in plaats van de EntityManager aan te roepen.

De getters en setters

Bij het object georieenteerd programmeren (OOP of object oriented programming) kan je de attributen van een entity nooit direct benaderen, maar doe je dit door een functie aan te roepen. Deze functies zijn getters (ophalen van informatie) en setters het wegschrijven/ aanpassen van informatie.

Alle properties (velden) uit de database worden als getters en setters in de Entity geplaatst. Een User entity met de properties first_name, last_nameemail en age heeft de volgende getters en setters:

  • ->getId() (er is geen setter voor het veld id)
  • ->getFirstName() en ->setFirstName(<name>)
  • ->getLastName() en ->setLastName(<name>)
  • ->getEmail() en ->setEmail(<email>)
  • ->getAge() en ->setAge(<email>)
Belangrijk velden in de database zijn kebab-case terwijl in PHP we functies (getters en setters) CamelCase schrijven. first_name in de database wordt dus ->getFirstName() en ->setLastName(<name>