# Programmation PHP/Symfony

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]
    Pour plus de détails voir : Programmation PHP avec Symfony.

## Présentation

Symfony (parfois abrégé SF) est un cadriciel MVC libre écrit en PHP (> 5). En tant que framework, il facilite et accélère le développement de sites et d'applications Internet et Intranet. Il propose en particulier :
* Une séparation du code en trois couches, selon le modèle MVC, pour une plus grande maintenabilité et évolutivité.
* Des performances optimisées et un système de cache pour garantir des temps de réponse optimums.
* Le support de l'Ajax.
* Une gestion des URL parlantes (liens permanents), qui permet de formater l'URL d'une page indépendamment de sa position dans l'arborescence fonctionnelle.
* Un système de configuration en cascade qui utilise de façon extensive le langage YAML.
* Un générateur de back-office et un "démarreur de module" (scaffolding).
* Un support de l'I18N - Symfony est nativement multi-langue.
* Une architecture extensible, permettant la création et l'utilisation de composants, par exemple un mailer ou un gestionnaire de fichiers .css et .js (minification).
* Des bundles :
** Un templating simple, basé sur PHP et des jeux de "helpers", ou fonctions additionnelles pour les gabarits... Comme alternative au PHP, on peut aussi utiliser le moteur de templates Twig dont la syntaxe est plus simples.
** Une couche de mapping objet-relationnel (ORM) et une couche d'abstraction de données (cf. Doctrine et son langage DQL).

### Utilisations

Plusieurs autres projets notables utilisent Symfony, parmi lesquels :
* https://github.com/drupal/drupal : le système de gestion de contenu (CMS) Drupal.
* https://github.com/joomla/joomla-cms : le CMS Joomla.
* https://github.com/sulu/sulu : le CMS Sulu.
* https://github.com/Sylius/Sylius : Sylius, un CMS d'e-commerce.
* https://github.com/x-tools/xtools : Xtools, un compteur d'éditions des wikis.

### Différences entre les versions

Depuis la version 4, des pages récapitulant les nouvelles fonctionnalités sont mises à disposition :
* https://symfony.com/blog/symfony-4-1-curated-new-features
* https://symfony.com/blog/symfony-4-2-curated-new-features
* https://symfony.com/blog/symfony-4-3-curated-new-features
* https://symfony.com/blog/symfony-4-4-curated-new-features
* https://symfony.com/blog/symfony-5-0-curated-new-features
* https://symfony.com/blog/symfony-5-1-curated-new-features
* https://symfony.com/blog/symfony-5-2-curated-new-features
* https://symfony.com/blog/symfony-5-3-curated-new-features
* https://symfony.com/blog/symfony-6-1-curated-new-features
* https://symfony.com/blog/symfony-6-2-curated-new-features
* https://symfony.com/blog/symfony-6-3-curated-new-features

## Créer un projet

Vous trouverez sur la page dédiée Symfony 4 comment installer cette version sortie en 2017, et Symfony 3 ici. La v5 s'installe comme la v6, mais pour migrer de la v5 à la v6 il faut vérifier plusieurs choses.
Pour créer un nouveau projet sous Symfony 6, tapez la commande :
ou avec la commande "symfony" :
Cette commande a pour effet la création d'un dossier contenant les bases du site web à développer.

## Lancer le projet

On entend par cette expression le lancement d'un serveur web local pour le développement de l'application et le choix d'un hébergeur pour la déployer (autrement dit "la mettre en production").

### Serveur web de développement

Symfony intègre un serveur web local qu'on peut lancer avec la commande (se placer dans le répertoire du projet auparavant) :
En passant open:local en argument de la commande symfony, le projet s'ouvre dans un navigateur :
Ou bien en utilisant le serveur web intégré à php

### Serveur web de production

Pour le déploiement dans le monde "réel", il faut choisir un hébergeur web sur internet supportant PHP (nous l’appellerons "serveur web distant" pour le distinguer du précédent). Voici quelques exemples :
* https://www.lws.fr/hebergement_web.php
* https://www.hostinger.fr/hebergeur-web
* et surtout... https://symfony.com/cloud/
Autrement il est aussi possible d'installer un deuxième serveur web (autre que celui intégré à Symfony) sur sa machine pour se rendre compte du résultat final. Par exemple... Apache qui est très répandu chez les hébergeurs profesionnels. Il faudra alors ajouter un vhost et un nom de domaine dédiés au site Symfony. Pour le test, le domaine peut juste figurer dans /etc/hosts.
Le nom de domaine du site doit absolument rediriger vers le dossier /public. En effet, si on cherche à utiliser le site Symfony dans le sous-répertoire "public" d'un autre site, la page d'accueil s'affichera mais le routing ne fonctionnera pas.

## Configurer le projet
### Paramètres dev et prod

Les différences de configuration entre le site de développement et celui de production (par exemple les mots de passe) peuvent être définies de deux façons :
* Dans le dossier config/packages. config.yml contient la configuration commune aux sites, config_dev.yml celle de développement et config_prod.yml celle de production.
* Via le composant Symfony/Dotenv (abordé au chapitre suivant).
Par exemple, on constate l'absence de la barre de débogage (web_profiler) par défaut en prod. Une bonne pratique serait d'ajouter au config_dev.yml :
Les fichiers .yml contenant les variables globales sont dans app\config\.
Par exemple en SF2 et 3, le mot de passe et l'adresse de la base de données sont modifiables en éditant parameters.yml (non versionné et créé à partir du parameters.yml.dist). L'environnement de test passe par web/app_dev.php, et le mode debug y est alors activé par la ligne Debug::enable; (testable avec %kernel.debug% = 1).
Depuis SF4, il faut utiliser un fichier .env non versionné à la racine du projet, dont les lignes sont injectées ensuite dans les .yaml avec la syntaxe : '%env(APP_SECRET)%'. Le mode debug est activé avec APP_DEBUG=1 dans ce fichier .env.
Les variables d'environnement du système d'exploitation peuvent remplacer celles des .env.

## Références

* ↑ http://guidella.free.fr/General/symfony2AnnotationsReference.html
* ↑ http://mikinfo.free.fr/index.php/configurer-les-virtualhosts-pour-symfony/
* ↑ https://symfony.com/doc/current/setup/web_server_configuration.html
* « Wiki officiel »
* « Tutoriel openclassrooms.com »
* « Tutoriel developpez.com »
* (en) « Symfony 3.1 cookbook » : livre officiel de 500 pages
* (en) « Charming Development in Symfony 5 » (texte et vidéo)

## Voir aussi

* #symfony : canal IRC (#symfony sur Freenode)
* #symfony-fr : canal IRC francophone (#symfony-fr sur Freenode)
* https://sonata-project.org/get-started : un CMS basé sur Symfony