Création d'une application
(Page créée avec « == Présentation == Cette page/section a pour objet de lister les différentes actions pour créer une application PHP. Cette page/section n'est pas finalisée et les don… ») |
|||
(Une révision intermédiaire par le même utilisateur non affichée) | |||
Ligne 611 : | Ligne 611 : | ||
=== Récupérer un objet en BDD === | === Récupérer un objet en BDD === | ||
+ | |||
+ | == Formulaires == | ||
+ | === Créer un formulaire avec la console === | ||
+ | Grâce au [https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html bundle SymfonyMaker], il est possible de créer automatiquement la classe de formulaire de l'entité désirée. Pour ce faire, lancer la commande suivante : | ||
+ | php bin/console make:form | ||
+ | |||
+ | Cela donnera par exemple le retour suivant : | ||
+ | {{terminal|text= | ||
+ | [php-fpm@myserver APPLI]$ php bin/console make:form | ||
+ | |||
+ | The name of the form class (e.g. DeliciousChefType): | ||
+ | > CompanyType | ||
+ | |||
+ | The name of Entity or fully qualified model class name that the new form will be bound to (empty for none): | ||
+ | > Company | ||
+ | |||
+ | created: src/Form/CompanyType.php | ||
+ | |||
+ | |||
+ | Success! | ||
+ | |||
+ | |||
+ | Next: Add fields to your form and start using it. | ||
+ | Find the documentation at https://symfony.com/doc/current/forms.html | ||
+ | }} | ||
+ | |||
+ | Dont le contenu du fichier <code>src/Form/CompanyType.php</code> sera : | ||
+ | <syntaxhighlight lang="php"> | ||
+ | <?php | ||
+ | |||
+ | namespace App\Form; | ||
+ | |||
+ | use App\Entity\Company; | ||
+ | use Symfony\Component\Form\AbstractType; | ||
+ | use Symfony\Component\Form\FormBuilderInterface; | ||
+ | use Symfony\Component\OptionsResolver\OptionsResolver; | ||
+ | |||
+ | class CompanyType extends AbstractType | ||
+ | { | ||
+ | public function buildForm(FormBuilderInterface $builder, array $options) | ||
+ | { | ||
+ | $builder | ||
+ | ->add('name') | ||
+ | ; | ||
+ | } | ||
+ | |||
+ | public function configureOptions(OptionsResolver $resolver) | ||
+ | { | ||
+ | $resolver->setDefaults([ | ||
+ | 'data_class' => Company::class, | ||
+ | ]); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Modifier le fichier en y ajoutant les lignes suivantes : | ||
+ | <syntaxhighlight lang="php" highlight="7,17"> | ||
+ | <?php | ||
+ | |||
+ | namespace App\Form; | ||
+ | |||
+ | use App\Entity\Company; | ||
+ | use Symfony\Component\Form\AbstractType; | ||
+ | use Symfony\Component\Form\Extension\Core\Type\SubmitType; | ||
+ | use Symfony\Component\Form\FormBuilderInterface; | ||
+ | use Symfony\Component\OptionsResolver\OptionsResolver; | ||
+ | |||
+ | class CompanyType extends AbstractType | ||
+ | { | ||
+ | public function buildForm(FormBuilderInterface $builder, array $options) | ||
+ | { | ||
+ | $builder | ||
+ | ->add('name') | ||
+ | ->add('save', SubmitType::class) | ||
+ | ; | ||
+ | } | ||
+ | |||
+ | public function configureOptions(OptionsResolver $resolver) | ||
+ | { | ||
+ | $resolver->setDefaults([ | ||
+ | 'data_class' => Company::class, | ||
+ | ]); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> |
Version actuelle datée du 2 mars 2020 à 08:59
Sommaire
Présentation
Cette page/section a pour objet de lister les différentes actions pour créer une application PHP.
Cette page/section n'est pas finalisée et les données qu'elle contient vont régulièrement évoluer.
Pour commencer
Le serveur utilisé pour la démonstration est myserver. La nouvelle application à créer est GreatApp.
Créer le dossier applicatif de développement et s'y rendre :
mkdir -p /data/www/dev-greatapp cd /data/www/dev-greatapp
Créer le lien symbolique APPLI
pointant vers la version en cours :
ln -s 1.0.0 APPLI
Créer les dossiers de l'architecture applicative normalisée :
mkdir {DATA,LOG,PARAM}
Installation Symfony
Télécharger l'installeur du framework Symfony :
wget https://get.symfony.com/cli/installer -O - | bash
Exemple de retour :
[root@myserver dev-greatapp]# wget https://get.symfony.com/cli/installer -O - | bash --2019-11-21 11:34:08-- https://get.symfony.com/cli/installer Résolution de get.symfony.com (get.symfony.com)... 143.204.15.125, 143.204.15.50, 143.204.15.106, ... Connexion vers get.symfony.com (get.symfony.com)|143.204.15.125|:443...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 4713 (4,6K) [binary/octet-stream] Sauvegarde en : «STDOUT» 100%[===================================================================================================================================================================================================>] 4 713 --.-K/s ds 0s 2019-11-21 11:34:08 (441 MB/s) - envoi vers sortie standard [4713/4713] Symfony CLI installer Environment check [*] cURL is installed [*] Gzip is installed [*] Git is installed Download Finding the latest version (platform: "linux_amd64")... Downloading version 4.10.2 (https://github.com/symfony/cli/releases/download/v4.10.2/symfony_linux_amd64.gz)... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 613 0 613 0 0 783 0 --:--:-- --:--:-- --:--:-- 783 100 7494k 100 7494k 0 0 1163k 0 0:00:06 0:00:06 --:--:-- 1534k Uncompress binary... Making the binary executable... Installing the binary into your home directory... The binary was saved to: /root/.symfony/bin/symfony The Symfony CLI v4.10.2 was installed successfully! Add this to your shell configuration file: export PATH="$HOME/.symfony/bin:$PATH" Start a new shell, and then run 'symfony' Or install it globally on your system: mv /root/.symfony/bin/symfony /usr/local/bin/symfony and then run 'symfony'
Dans le cas où le serveur serait utilisé à des fins de plusieurs développements sous Symfony, il conviendrait d'ajouter la commande Symfony de façon globale au serveur.
Etant donné que le serveur myserver n'est pas un serveur de développement, il convient d'ajouter la commande Symfony à l'utilisateur courant. Pour ce faire, éditer le fichier $HOME/.bashrc
et y ajouter la ligne suivante :
export PATH="$HOME/.symfony/bin:$PATH"
Pour que la modification soit effective, quitter la session et se reconnecter, ou bien sourcer le fichier en lançant la commande . $HOME/.bashrc
.
Nouveau projet Symfony
Création
Se rendre dans le dossier de l'application :
cd /data/www/dev-greatapp
Lancer la commande de création d'un nouveau projet Symfony :
symfony new 1.0.0 --full
En cas d'erreur
Si Composer n'est pas installé, Symfony affichera une erreur :
[root@myserver dev-greatapp]# symfony new 1.0.0 --full Version 4.11.3 is available. Do you want to update now (execution will continue after whatever you decide) ? [Y/n]: Y Update notes: v4.11.3: - Fix loading the local ``php.ini`` on FPM (loading PHP extensions now works) - Fix loading PHP config from ``.symfony.cloud.yaml`` for web servers using PHP CGI or PHP CLI - Remove ``php:wrappers:install`` and supports for the PHP wrappers (use ``symfony php/pecl/...`` instead) - Update extension list for PHP 7.4 - Fix infinite login loop when used in non interactive environment - Add Blackfire integration when using Docker for the Blackfire agent - Fix ``open:remote:rabbitmq`` does not found the RabbitMQ management UI - Specify which environment will be snapshoted when running ``env:sync`` - Fix double spinner issue on ``env:sync`` v4.11.2: - Fix panic when no PHP versions are detected v4.11.1: - Fix going into background makes parent process hang - Remove ``--force-php-discovery`` flag on ``server:start`` v4.11.0: - Allow customers to stop or decline a cloud trial and move to a paid subscription directly - Add command ``project:billing:accept`` to disable project suspension at then end of trial - Rename ``billing:update:card`` command to ``project:billing:update-card`` - Fix detection of the default PHP version from PATH - Fix PHP version used when executing `php` in a sub-process - Add Docker Compose detection when configured via `COMPOSE_FILE` - Allow to configure COMPOSE_PROJECT_NAME via .env Upgrading to 4.11.3 7.33 MiB / 7.33 MiB [===================================] 100.00% 1.36 MiB/s 5s 2020/01/06 10:02:46 Integrity check in 27490 from 27382. Upgrade done, now relaunching. 2020/01/06 10:02:46 Continue execution here in 27509 from 27382. * Creating a new Symfony project with Composer WARNING Unable to find Composer, downloading one. It is recommended to install Composer yourself at https://getcomposer.org/download/ (running /root/.symfony/bin/composer create-project symfony/website-skeleton 1.0.0) /usr/bin/env: php: Aucun fichier ou dossier de ce type unable to run /root/.symfony/bin/composer create-project symfony/website-skeleton 1.0.0 : exit status 127
Suivre la procédure d'installation de Composer pour régler cette erreur.
Absence d'erreur
En cas d'absence d'erreur, la sortie ressemble à ceci :
[root@myserver dev-greatapp]# symfony new 1.0.0 --full * Creating a new Symfony project with Composer (running /root/.symfony/bin/composer create-project symfony/website-skeleton 1.0.0) * Setting up the project under Git version control (running git init 1.0.0) [OK] Your project is now ready in /data/www/dev-greatapp/1.0.0
Correction des droits
Corriger les droits en lançant la commande :
chown -R php-fpm:www /data/www/dev-greatapp
L'application Symfony vierge est disponible :
Installation de bundles
Certains bundles de base doivent être installés :
- symfony/apache-pack
- Ce bundle installe un fichier
.htaccess
contenant les règles de ré-écriture dans le dossierpublic
- Ce bundle installe un fichier
- annotations
- Ce pack permet de définir des routes en ajoutant des annotations dans les contrôleurs plutôt que dans le fichier
config/routes.yaml
- Ce pack permet de définir des routes en ajoutant des annotations dans les contrôleurs plutôt que dans le fichier
- twig
- Ce pack permet d'utiliser un langage de template, Twig, permettant l'utilisation de modèles HTML
Pour installer un bundle, par exemple symfony/apache-pack
, lancer la commande suivante :
composer require symfony/apache-pack
Le résultat ressemble à ceci :
[php-fpm@myserver APPLI]$ composer require symfony/apache-pack Using version ^1.0 for symfony/apache-pack ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Restricting packages listed in "symfony/symfony" to "5.0.*" Package operations: 1 install, 0 updates, 0 removals - Installing symfony/apache-pack (v1.0.1): Loading from cache Package zendframework/zend-code is abandoned, you should avoid using it. Use laminas/laminas-code instead. Package zendframework/zend-eventmanager is abandoned, you should avoid using it. Use laminas/laminas-eventmanager instead. Writing lock file Generating autoload files ocramius/package-versions: Generating version class... ocramius/package-versions: ...done generating version class Symfony operations: 1 recipe (75eba4e176ac9e0cc03e38c2ca0ae992) - WARNING symfony/apache-pack (>=1.0): From github.com/symfony/recipes-contrib:master The recipe for this package comes from the "contrib" repository, which is open to community contributions. Review the recipe at https://github.com/symfony/recipes-contrib/tree/master/symfony/apache-pack/1.0 Do you want to execute this recipe? [y] Yes [n] No [a] Yes for all packages, only for the current installation session [p] Yes permanently, never ask again for this project (defaults to n): y - Configuring symfony/apache-pack (>=1.0): From github.com/symfony/recipes-contrib:master Executing script cache:clear [OK] Executing script assets:install public [OK] Some files may have been created or updated to configure your new packages. Please review, edit and commit them: these files are yours.
Pour annotations :
composer require annotations
Pour Twig :
composer require twig
.htaccess
Comme stipulé dans la documentation officielle de Symfony, il est possible de gagner en performance en déplaçant le contenu du fichier public/.htaccess
précédemment créé lors de l'installation du bundle symfony/apache-pack
dans la configuration du VirtualHost d'Apache.
Pour ce faire, dans le VirtualHost, ou la directive Directory
en cas de présence de l'application dans un sous-répertoire, modifier la valeur de la directive AllowOverride
de All à None et ajouter la ligne Include conf/sites/greatapp_htaccess
. Cela donne la modification suivante :
...
# Configuration greatapp
Alias /greatapp /data/www/dev-greatapp/APPLI/public
<Directory "/data/www/dev-greatapp/APPLI/public">
Options FollowSymLinks
DirectoryIndex index.php
AllowOverride None
Require all granted
<FilesMatch \.php$>
SetHandler "proxy:unix:/local/php/sockets/php7_greatapp.sock|fcgi://localhost/"
</FilesMatch>
Include conf/sites/greatapp_htaccess
</Directory>
# Fin de configuration greatapp
...
Créer ensuite le fichier conf/sites/greatapp_htaccess
et y ajouter le contenu du fichier .htaccess
précédemment créé.
OPTIONNEL : Le fichier .htaccess
peut être vidé afin de lever toute ambiguïté sur la provenance des règles appliquées sur l'instance en cours. Toutefois, en cas de ré-utilisation des sources de l'application sur une autre instance, il faudra alors s'assurer de récupérer les règles depuis le fichier conf/sites/greatapp_htaccess
.
Doctrine
Cette section s'inspire fortement de la documentation officielle de Symfony sur Doctrine.
Installation
Pour installer les bundles nécessaires à l'utilisation de Doctrine dans Symfony, il faut installer le pack "symfony/orm-pack" qui est composé d'un simple fichier composer.json
dont le contenu actuel est le suivant :
{
"name": "symfony/orm-pack",
"type": "symfony-pack",
"license": "MIT",
"description": "A pack for the Doctrine ORM",
"require": {
"php": "^7.0",
"doctrine/orm": "^2.5.11",
"doctrine/doctrine-bundle": "^1.6.10|^2.0",
"doctrine/doctrine-migrations-bundle": "^1.3|^2.0"
}
}
Pour ce faire, dans le dossier de l'application, lancer la commande suivante :
composer require symfony/orm-pack
La documentation Symfony recommande également d'installer le bundle "symfony/maker-bundle" afin de créer facilement des commandes vides, des contrôleurs, des classes de formulaire, des tests et plus encore. Ce bundle est une alternative à SensioGeneratorBundle pour les applications Symfony modernes et nécessite l'utilisation de Symfony 3.4 ou plus récent. Cet ensemble implique d'utiliser une structure de répertoire Symfony 4 standard, mais de nombreuses commandes peuvent générer du code dans n'importe quelle application.
Ce bundle étant nécessaire que dans des phases de développement de l'application, l'installer avec l'option --dev
:
composer require --dev symfony/maker-bundle
Paramètre base de données
Doctrine devant se connecter à une (ou plusieurs) base de données, il faudra s'assurer, au préalable, d'avoir créé un utilisateur ayant les droits sur la future base de données. Il n'est pas nécessaire de créer la base de données au travers de MySQL, Doctrine pourra le faire grâce aux droits données à l'utilisateur. Il faut donc spécifier correctement les droits lors de la création de l'utilisateur.
Afin que Doctrine puisse se connecter à ladite base de données, il faut définir la variable d'environnement DATABASE_URL
. Voir la documentation Symfony à propos de la configuration basée sur les variables d'environnement et les différentes manières de les définir (fichier .env
, variable de shell, variable d'environnement serveur, ...).
Ainsi, par exemple, la variable DATABASE_URL
sera définie dans le socket php-fpm de l'application, dans le fichier /local/php/php-7.3.4/etc/php-fpm.d/greatapp.conf
:
...
env[DATABASE_URL] = "mysql://dev_greatapp_user:xxxxxxxxxxxx@127.0.0.1:3306/dev_greatapp_db"
...
NB : Si la première connexion à la base de données au travers de Doctrine échoue, ne pas hésiter à remplacer 127.0.0.1
par localhost
(ou inversement) dans la chaîne de connexion.
Créer la base de données via Doctrine
Si les droits ont correctement été définis lors de la création de l'utilisateur, Doctrine va être en mesure de créer automatiquement la base de données.
- NB : dans le cas d'une définition de la variable
DATABASE_URL
directement dans Apache ou PHP-FPM, elle ne sera pas accessible en ligne de commande. Pour l'utiliser, il faudra la définir dans le shell grâce à la commandeexport
. Pour ceux devant manipuler plusieurs applications et plusieurs connexions aux bases de données différentes, il est possible de créer plusieurs fichiersenv_<nom_application>
dans lesquels renseigner les lignes suivantes :
DATABASE_URL="mysql://application_user:password@127.0.0.1:3306/application_db" export DATABASE_URL
- Et ensuite, en fonction de l'application sur laquelle travailler, il faut sourcer le fichier :
. env_dev-greatapp
Pour créer la base de données, lancer la commande php bin/console doctrine:database:create
. Exemple :
[php-fpm@myserver APPLI]$ php bin/console doctrine:database:create Created database `dev_greatapp_db` for connection named default
Créer une classe d’entité
Symfony étant un framework reposant sur de la programmation OOP (ou POO pour PHP Orienté Objet), il faut donc raisonner en "objet" (appelé "entités" sous Symfony). Ainsi, pour représenter et manipuler les objets de l'application à créer, il faut créer des entités.
Pour ce faire, lancer la commande php bin/console make:entity
. Exemple :
[php-fpm@myserver APPLI]$ php bin/console make:entity Class name of the entity to create or update (e.g. OrangePizza): > Application created: src/Entity/Application.php created: src/Repository/ApplicationRepository.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, bigint) * float Relationships / Associations * relation (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 * decimal * guid * json_array Field type (enter ? to see all types) [string]: > string Field length [255]: > 255 Can this field be null in the database (nullable) (yes/no) [no]: > no updated: src/Entity/Application.php Add another property? Enter the property name (or press <return> to stop adding fields): > alias Field type (enter ? to see all types) [string]: > string Field length [255]: > 255 Can this field be null in the database (nullable) (yes/no) [no]: > no updated: src/Entity/Application.php Add another property? Enter the property name (or press <return> to stop adding fields): > applicationManager Field type (enter ? to see all types) [string]: > string Field length [255]: > Can this field be null in the database (nullable) (yes/no) [no]: > yes updated: src/Entity/Application.php Add another property? Enter the property name (or press <return> to stop adding fields): > businessManager Field type (enter ? to see all types) [string]: > string Field length [255]: > Can this field be null in the database (nullable) (yes/no) [no]: > yes updated: src/Entity/Application.php Add another property? Enter the property name (or press <return> to stop adding fields): > company Field type (enter ? to see all types) [string]: > string Field length [255]: > Can this field be null in the database (nullable) (yes/no) [no]: > no updated: src/Entity/Application.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]: > yes updated: src/Entity/Application.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 make:migration
Créer une table d'entité
Une fois la classe d'entité créée dans PHP, il faut pouvoir disposer d'une table pour pouvoir stocker les objets de cette classe en base de données. Pour mettre à jour le schéma de la base de données en conséquence, tester dans un premier en simulation la mise à jour avec la commande php bin/console make:migration
. Exemple :
[php-fpm@myserver APPLI]$ php bin/console make:migration Success! Next: Review the new migration "src/Migrations/Version20200116140541.php" Then: Run the migration with php bin/console doctrine:migrations:migrate See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html
Si le test est concluant comme l'exemple ci-dessus, lancer la mise à jour avec la commande php bin/console doctrine:migrations:migrate
. Exemple :
[php-fpm@myserver APPLI]$ php bin/console doctrine:migrations:migrate Application Migrations WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y Migrating up to 20200116140541 from 0 ++ migrating 20200116140541 -> CREATE TABLE application (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, alias VARCHAR(255) NOT NULL, application_manager VARCHAR(255) DEFAULT NULL, business_manager VARCHAR(255) DEFAULT NULL, company VARCHAR(255) NOT NULL, description VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB ++ migrated (took 542,4ms, used 16M memory) ------------------------ ++ finished in 575,6ms ++ used 16M memory ++ 1 migrations executed ++ 1 sql queries
Créer un contrôleur
Les contrôleurs contiennent le code central de l'application. Ce sont eux qui décident quoi faire des objet, comment traiter les appels et quelles réponses renvoyer. Suite à la création d'une classe d'entité, Doctrine permet la création automatique du contrôleur associé. Pour ce faire, lancer la commande php bin/console make:controller ApplicationController
. Exemple :
[php-fpm@myserver APPLI]$ php bin/console make:controller ApplicationController created: src/Controller/ApplicationController.php created: templates/application/index.html.twig Success! Next: Open your new controller class and add some pages!
Editer le contrôleur nouvellement créé src/Controller/ApplicationController.php
et y ajouter une route permettant l'ajout d'un nouvel enregistrement d'un objet. Exemple :
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use App\Entity\Application; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Response; class ApplicationController extends AbstractController { /** * @Route("/application", name="application") */ public function index() { return $this->render('application/index.html.twig', [ 'controller_name' => 'ApplicationController', ]); } /** * @Route("/application/add", name="add_application") */ public function createApplication(EntityManagerInterface $entityManager): Response { $application = new Application(); $application->setName('MyNewApp'); $application->setAlias('MNA'); $application->setApplicationManager('Michel DUPONT'); $application->setBusinessManager('Philippe TARFTUFFE'); $application->setCompany('Ma petite entreprise'); $entityManager->persist($application); $entityManager->flush(); return new Response('Saved new application with id '.$application->getId()); } }
Pour tester le bon fonctionnement de ce bout de code, se rendre sur l'URL /application/add. Si le test est concluant, le message suivant s'affiche :
Saved new application with id 1
Pour vérifier l'enregistrement en base de données, il est possible de faire une requête SQL depuis Doctrine avec la commande php bin/console doctrine:query:sql 'SELECT * FROM application'
. Exemple :
[php-fpm@myserver APPLI]$ php bin/console doctrine:query:sql 'SELECT * FROM application' array(1) { [0]=> array(7) { ["id"]=> string(1) "1" ["name"]=> string(11) "MyNewApp" ["alias"]=> string(4) "MNA" ["application_manager"]=> string(15) "Michel DUPONT" ["business_manager"]=> string(14) "Philippe TARFTUFFE" ["company"]=> string(15) "Ma petite entreprise" ["description"]=> NULL } }
Validation d'objet
Symfony offre la possibilité d'activer une validation simple des objets, se basant sur leur déclaration au travers des annotations Doctrine. Bien que cela ne remplace en rien configuration complète de validation, celle-ci permet d'activer la validation des contraintes suivantes :
- Ne peut être nul (attribut doctrine
nullable=false
) - Type (attribut doctrine
type
) - Unique (attribut doctrine
unique=true
) - Longueur (attribut doctrine
length
)
Pour activer cette simple validation, éditer le fichier config/packages/validator.yaml
et décommenter les lignes suivantes :
framework:
validation:
email_validation_mode: html5
# Enables validator auto-mapping support.
# For instance, basic validation constraints will be inferred from Doctrine's metadata.
auto_mapping:
App\Entity\: []
Ensuite, dans le contrôleur qui manipule les objets, ajouter la ligne use Symfony\Component\Validator\Validator\ValidatorInterface;
avant la déclaration de la classe du contrôleur, et ajouter la section suivante pour valider les objets :
public function createApplication(EntityManagerInterface $entityManager, ValidatorInterface $validator): Response
{
$application = new Application();
$application->setName('MyNewApp');
$application->setAlias('MNA');
$application->setApplicationManager('Michel DUPONT');
$application->setBusinessManager('Philippe TARFTUFFE');
$application->setCompany('Ma petite entreprise');
$application->setDescription('toto');
$errors = $validator->validate($application);
if (count($errors) > 0) {
return new Response((string) $errors, 400);
}
$entityManager->persist($application);
$entityManager->flush();
Penser à injecter la classe ValidatorInterface $validator
dans la déclaration de la fonction pour injecter la dépendance au service Validator
.
Pour plus d'informations et/ou mettre en place une validation plus poussée des objets, se rendre sur la documentation officielle de la validation de Symfony.
Récupérer un objet en BDD
Formulaires
Créer un formulaire avec la console
Grâce au bundle SymfonyMaker, il est possible de créer automatiquement la classe de formulaire de l'entité désirée. Pour ce faire, lancer la commande suivante :
php bin/console make:form
Cela donnera par exemple le retour suivant :
[php-fpm@myserver APPLI]$ php bin/console make:form The name of the form class (e.g. DeliciousChefType): > CompanyType The name of Entity or fully qualified model class name that the new form will be bound to (empty for none): > Company created: src/Form/CompanyType.php Success! Next: Add fields to your form and start using it. Find the documentation at https://symfony.com/doc/current/forms.html
Dont le contenu du fichier src/Form/CompanyType.php
sera :
<?php
namespace App\Form;
use App\Entity\Company;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CompanyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Company::class,
]);
}
}
Modifier le fichier en y ajoutant les lignes suivantes :
<?php
namespace App\Form;
use App\Entity\Company;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CompanyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Company::class,
]);
}
}