> For the complete documentation index, see [llms.txt](https://cours.davidannebicque.fr/symfony/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cours.davidannebicque.fr/symfony/version-4.1/introduction.md).

# Introduction

## Présentation

Découvrir et appréhender un framework PHP web.

## Pré-requis

* PHP
* Programmation Orientée Objet
* Structure MVC
* Base de données

## Organisation

* 20 heures de TD
* 12 heures de TP
* Notes :
  * 1 évaluation écrite (dernier TD)
  * 1 note pratique (lors du dernier TP)

## Rappels des concepts du MVC

![Schéma de principe du MVC](https://3681076841-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXc8ZoOM6TzFjRK4eHK%2F-LnpDdM8sxOMgq_R1ucV%2F-LnpEh2Ql_WL68DRsMOP%2Fmvc-architecture.png?alt=media\&token=dc88d1dd-1276-43b6-aa9e-91fb8c2cf8a8)

### C: Controller / Contrôleur

C'est lui qui reçoit l'interaction (la demande/**request**) du visiteur. Il se charge de récupérer les éléments nécessaires auprès du/des modèle(s). Il transmets toutes les données nécessaires à la vue.

### V: View / Vue

C'est lui qui apporte la réponse (**response/render**) au visiteur. Une vue peut être une page web, un fichier pdf, ... Ne se préoccupe que de l'affiche des informations, n'assure aucun traitement

### M: Model / Modèle

C'est lui qui s'occupe de récupérer et préparer les données. Le modèle peut être en lien avec une base de données. Le modèle peut être en lien avec des API. Le modèle prépare les données pour qu'elles soient facilement manipulables par la vue.

## Notion de Framework

### Définition générale

En programmation informatique, un framework ou structure logicielle est un ensemble cohérent de composants logiciels structurels, qui sert à créer les fondations ainsi que les grandes lignes de tout ou d’une partie d’un logiciel (architecture). Un framework se distingue d’une simple bibliothèque logicielle principalement par :

* son caractère générique,&#x20;
* faiblement spécialisé,&#x20;
* contrairement à certaines bibliothèques ;&#x20;

Un framework peut à ce titre être constitué de plusieurs bibliothèques chacune spécialisée dans un domaine. Un framework peut néanmoins être spécialisé, sur un langage particulier, une plateforme spécifique, un domaine particulier : reporting, mapping, etc. ;

Le cadre de travail (traduction littérale de l’anglais : *framework*) qu’il impose de par sa construction même, guidant l’architecture logicielle voire conduisant le développeur à respecter certains patterns (modèle de conception) ; les bibliothèques le constituant sont alors organisées selon le même paradigme.

### Framework Orienté Objet

Un framework dit orienté objet est typiquement composé de classes mères qui seront dérivées et étendues par héritage en fonction des besoins spécifiques à chaque logiciel qui utilise le framework.

Le développeur qui utilise le framework pourra personnaliser les éléments principaux du framework par extension, en utilisant le **mécanisme d’héritage** : créer des nouvelles classes qui contiennent toutes les fonctionnalités que met en place le framework, et en plus ses fonctionnalités propres, créées par le développeur en fonction des besoins spécifiques à son application.

| Avantages | Inconvénients |
| --------- | ------------- |

| <ul><li>Pour éviter des erreurs dans l’organisation des appels</li><li>Éviter les appels directs aux commandes PHP</li><li>Préférer les versions des Frameworks qui apportent leur lot de contrôles.</li><li>Plus grand portabilité du code</li><li>Ne pas réinventer la roue</li><li>La gestion des formulaire, des utilisateurs, ...</li></ul> | <ul><li>Apprentissage d’une couche supplémentaire</li><li>La majorité des fonctionnalités PHP sont redéfinies</li><li>Généralement apprentissage d’un moteur de template</li><li>Apprentissage de l’utilisation du framework choisit : ses classes, ses objets, sa logique !</li></ul> |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Article comparatifs des 10 frameworks PHP les plus populaires de 2019: <https://coderseye.com/best-php-frameworks-for-web-developers/>

## Symfony

![](https://3681076841-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXc8ZoOM6TzFjRK4eHK%2F-LhkACB5wEfW9y2CQ-HV%2F-LhkI14IztyEcscMgDwV%2Flogosymfony.png?alt=media\&token=aaa2832c-a144-42a6-948f-3b88033bdcde)

* Framework MVC en PHP 5 (V2) et PHP 7 (V3 et V4), libre
* Développé en 2005 par la société Sensio pour répondre à ses besoins
* Division de la société Sensio en deux entités l’agence Web et l’entreprise qui soutient et maintient Symfony : SensioLabs, dirigée par Fabien Potencier, l’auteur de Symfony
* Framework français !, De renommée mondiale
* Premier framework en France et en Europe

### SYMFONY : AVANTAGES

* Connectable à presque tous les SGBD
* De nombreux Bundles, contributeurs, utilisateurs
* Moteur de template puissant et simple
* Depuis la V4, Symfony est très léger et très rapide

![Feuille de route de l'évolution du framework](https://3681076841-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LXc8ZoOM6TzFjRK4eHK%2F-LnpG3lX1MX2wMcpewGg%2F-LnpHeDcovn2ETpeFh5z%2FCapture%20d%E2%80%99e%CC%81cran%202019-09-03%20a%CC%80%2006.03.08.png?alt=media\&token=d43b5885-361a-4b9a-802c-21f0cd32aac3)

### Symfony V4 : Un retour aux bases

Avec sa version 4 (et suivante), Symfony à pris un virage important par rapport aux précédentes versions, et se rapproche des "standards" de la majorité des framework, mais à aussi grandement optimisé son poids et sa vitesse d'exécution. Dans une grande logique de simplification Symfony à également automatisé de nombreux mécanismes qui auparavant auraient impliqués de nombreuses lignes de configuration.

#### SKELETON ET FLEX

La version **Skeleton** de Symfony : Apporte un framework Symfony très léger, avec le minimum pour faire fonctionner un controller.

La version 4 de Symfony introduit Flex qui est un gestionnaire de "recipes" (recettes), qui permet l'ajout de fonctionnalité à Symfony (gestionnaire de vue, de base de données, d'email, ...) avec un mécanisme d'auto-configuration de ces "bundles". Cela permet donc de fournir par défaut un framework très léger, avec une grande facilité pour lui ajouter tous les composants nécessaires, sans en mettre plus que nécessaire.

Par défaut Symfony version Skeleton ne sais rien faire ! Par contre, il n'embarque pas des dizaines de Bundles dont vous n'aurez peut être jamais besoin (fonctionnement des versions 2 et 3 avec plus de 46 bundles par défaut, contre 10 aujourd'hui).

Grâce à Flex vous installez rapidement le nécessaire pour répondre à votre projet.

## Installations

### Configuration requise pour votre serveur

* Un serveur Web
* PHP 7.2 ou supérieur
* [Git (différent de GitHub)](https://git-scm.com/)
* Le gestionnaire de dépendance [Composer (pour exécuter FLEX)](https://getcomposer.org/)
* Une maîtrise de son système d'exploitation ! (fichiers cachés, variables PATH, php.ini, console...)

## Exercice 1 : Installation des outils

* [ ] Installer un serveur local (si ce n'est pas déjà fait)
* [ ] Installer [Git](https://git-scm.com/)
* [ ] Installer [Composer](https://getcomposer.org/)
* [ ] Pour les utilisateurs de Windows : Installer une vraie console ! <https://cmder.net/> par exemple.
* [ ] Installer un vraie IDE ! (PhpStorm / NetBeans, ou éventuellement VSCode).

Pensez à vérifier que tout fonctionne correctement :

```
php -v
composer -v
git -v
```

Vous devez vous afficher les numéros de version. **Corrigez les messages d'erreurs éventuels.**

## Exercice 2 : Installation de Symfony.

Symfony propose deux versions :

* La version **skeleton**, la plus minimaliste et légère, qui n'installe que le stricte minimum, vous laissant ainsi la liberté d'ajouter les composants dont vous avez réellement besoin.
* Le version **website-skeleton**, qui va installer tout le nécessaire pour faire fonctionner un site (vues, annotations, base de données, ...)

On va privilégier la version **skeleton**.

Placez-vous dans le répertoire où vous souhaitez installer Symfony (www, public\_html, ...) et exécutez la commande suivante (cela va créer un répertoire du nom de votre projet).

```
composer create-project symfony/skeleton nomDuProjet
```

Par défaut cette commande récupère la dernière version stable de Symfony. Le téléchargement peut prendre quelques minutes.

Il est possible de tester immédiatement le bon fonctionnement de l'installation en utilisant la ligne de commande en php suivante :

```
cd nomDuProjet
php -S 127.0.0.1:8000 public/index.php
```

Si vous vous rendez sur l'URL <http://127.0.0.1:8000> vous devriez voir la page d'accueil de Symfony avec le numéro de la version installée.

Il est également possible d'installer un serveur embarqué avec Symfony. Cela peut servir pour des tests rapides. Pour cela il faut installer ce serveur (la version skeleton ne contenant que le strict minimum)

```
cd nomDuProjet
composer require symfony/web-server-bundle --dev
```

Et l'exécuter :

```
 php bin/console server:run
```

Et vous trouverez par défaut, votre site à l'URL : <http://localhost:8000/>
