Création d'une application

De Wiki de Jordan LE NUFF
< Technique‎ | Symfony
Révision datée du 2 mars 2020 à 08:59 par Jordan (discussion | contributions) (→‎Formulaires)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Symfony - Page d'accueil vierge

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 dossier public
  • 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
  • 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 :

Putty icon.png Console SSH


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 commande export. Pour ceux devant manipuler plusieurs applications et plusieurs connexions aux bases de données différentes, il est possible de créer plusieurs fichiers env_<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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

Si le test est concluant comme l'exemple ci-dessus, lancer la mise à jour avec la commande php bin/console doctrine:migrations:migrate. Exemple :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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,
        ]);
    }
}