diff --git a/developpement/symfony3/presentation/slides.md b/developpement/symfony3/presentation/slides.md new file mode 100644 index 0000000..11f6dc5 --- /dev/null +++ b/developpement/symfony3/presentation/slides.md @@ -0,0 +1,705 @@ + + +# Remise à niveau Symfony3 +## William Petit - S.C.O.P. Cadoles + +--- + + +# Les principales nouveautés de Symfony 3 + +- Simplification de l'authentification avec le système de "Guard" +- Composant LDAP pour l'authentification (compatible Active Directory) +- Amélioration des mécanismes d'injection de dépendances: "auto-wiring", services dépréciés... +- Un "MicroKernel" pour créer des applications minimalistes basées sur Symfony3 +- Et beaucoup d'autres améliorations et composants mineurs... + +--- + +# Structure d'un projet, générateurs et "bundles" + +## Amorçage d'un projet +## Notion de "bundle" +## Structuration d'un projet +## La console, les commandes et les générateurs + +--- + +## Amorçage d'un projet + +### Récupération de l'installeur Symfony + +```bash +sudo mkdir -p /usr/local/bin +sudo curl -LsS https://symfony.com/installer \ + -o /usr/local/bin/symfony +sudo chmod a+x /usr/local/bin/symfony +``` + +### Création du projet (avec la dernière LTS) + +```bash +symfony new 3.4 +``` +--- + +## Notion de "bundle" + +> Un "bundle" est un ensemble de fichiers (code, templates, etc) représentant une unité fonctionnelle dans le framework Symfony. + +**Avant Symfony 3** Les "bundles" étaient le moyen utilisé pour structurer le code d'une application. Une application pouvait donc avoir plusieurs bundles "internes", i.e. ne provenant pas d'un développeur tiers. + +**Après Symfony 3** Les bundles ne sont plus considérés à titre organisationnel mais uniquement comme un moyen de diffuser le code sous forme d'unité réutilisable. Une application ne devrait donc plus qu'avoir un seul bundle interne: `AppBundle`. + +--- + +## Structuration d'un projet (1) + +### Les principaux répertoires et leur rôle + +|Répertoire|Rôle| +|:-:|:-:| +|`app/config/`|Configuration de l'application| +|`app/Resources/`|Depuis Symfony3, répertoire contenant les vues ainsi les "assets" de l'application| +|`src/AppBundle/`|Sources de l'application| + + +--- +## Structuration d'un projet (2) + +|Répertoire|Rôle| +|:-:|:-:| +|`tests/`|Répertoire contenant les tests de l'application (unitaire comme fonctionnels)| +|`var/`|Répertoire contenant toutes les données "vivantes" de l'application| +|`vendor/`| Dépendances Composer +|`web/`| Répertoire des ressources publiques de l'application + +--- +## La console, les commandes et les générateurs (1) + +### Quelques commandes (très) utiles +|Commande|Description| +|:-:|:-:| +|`server:run`|Exécuter l'application avec le serveur HTTP PHP| +|`security:check`|Vérifier que les dépendances du projet ne comportent pas de vulnérabilités connues| +|`debug:container`|Retrouver le mapping services <-> classe PHP| +|`router:match`|Vérifier quelle controleur/action sera utilisée pour un chemin donné| +--- + +## La console, les commandes et les générateurs (2) + +### Les générateurs par défaut +|Commande|Description| +|:-:|:-:| +|`generate:bundle`|Créer un nouveau bundle| +|`generate:controller`|Créer un nouveau contrôleur| +|`generate:command`|Créer une nouvelle commande| +|`doctrine:generate:entity`|Créer une nouvelle entité Doctrine| +--- + +# Le routage et les contrôleurs + +## Création d'un nouveau contrôleur +## Déclaration des contrôleurs +## Actions, routes et verbes HTTP avec les annotations + +--- + +## Création d'un nouveau contrôleur + +```bash +bin/console generate:controller +``` +--- + +## Déclaration des contrôleurs + + +--- + +## Actions, routes et verbes HTTP avec les annotations (1) + +### Action annotée basique +```php +class DemoController extends Controller +{ + /** + * @Route("/demo") + */ + public function demoAction() + { + // ... + } + +} +``` +--- + +## Actions, routes et verbes HTTP avec les annotations (2) + +### Action avec méthodes HTTP contraintes + +```php +class DemoController extends Controller +{ + /** + * @Route( + * "/demo", + * methods = { "POST", "PUT" } + * ) + */ + public function demoAction() + { + // ... + } +} +``` +--- + +## Actions, routes et verbes HTTP avec les annotations (3) + +### Action nommée + +```php +class DemoController extends Controller +{ + /** + * @Route("/demo-named", name="my_demo_action") + */ + public function demoAction() + { + // ... + } +} +``` +--- + +## Actions, routes et verbes HTTP avec les annotations (4) + +### Action avec paramètres + +```php +class DemoController extends Controller +{ + /** + * @Route("/demo/{myParam}") + */ + public function demoAction($myParam) + { + // ... + } + + /** + * @Route("/demo/{paramWithDefaultVal}") + */ + public function demoAction($paramWithDefaultVal = 1) + { + // ... + } +} +``` +--- + +## Actions, routes et verbes HTTP avec les annotations (5) + +### Action avec paramètres contraints + +```php +class DemoController extends Controller +{ + /** + * @Route( + * "/demo/{myParam}", + * requirements = { "myParam"="^\d+$" } + * ) + */ + public function demoAction($myParam) + { + // ... + } +} +``` +--- + +## Actions, routes et verbes HTTP avec les annotations (6) + +### Action avec paramètres contraints + +```php +class DemoController extends Controller +{ + /** + * @Route( + * "/demo/{myParam}", + * requirements = { "myParam"="^\d+$" } + * ) + */ + public function demoAction($myParam) + { + // ... + } +} +``` +--- + +## Actions, routes et verbes HTTP avec les annotations (7) + +### Paramètres spéciaux + +|Paramètre|Description| +|:-:|:-:| +|`_locale`| La "locale" utilisé par l'application pour la requête en cours | +|`_format`| Le "format" utilisé par l'application pour la requête en cours | +|`_controller`| L'identifiant du contrôleur et son action utilisés pour traiter la requête en cours| + +--- + +## Actions, routes et verbes HTTP avec les annotations (8) + +### Générer une URL pour une route nommée + +```php +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; + +$this->generateUrl( + 'demo', // Nom de la route + ['myParam' => 'my-value'], // Paramètres à injecter + // L'URL générée doit elle être absolue ou non ? + UrlGeneratorInterface::ABSOLUTE_URL +); +``` +--- + +# Services + +## Utilisation des services +## Création de nouveaux services + +--- + +## Utilisation des services (1) + +### Lister les services existants + +```bash +bin/console debug:container +``` + +--- + +## Utilisation des services (2) + +### Utiliser un service (méthode classique) + +```php +class DemoController extends Controller +{ + /** + * @Route("/demo") + */ + public function demoAction() + { + $logger = $this->get('logger'); + $logger->info('Hello world !'); + } +} +``` +--- + +## Utilisation des services (3) + +### Utiliser un service (Via le "type hint") + +```php +use Psr\Log\LoggerInterface; + +class DemoController extends Controller +{ + /** + * @Route("/demo") + */ + public function demoAction(LoggerInterface $logger) + { + $logger->info('Hello world !'); + } +} +``` + +**Tip** Pour identifier les différentes interfaces disponibles, utilisez la commande `bin/console debug:autowiring` + +--- + +## Création d'un service (1) + +### Création de la classe PHP + +```php +namespace AppBundle\Service; + +class MyService { + public function doNothing() {} +} +``` + +**Tip** On peut vérifier que le service est bien détecté par l'application avec la commande `bin/console debug:autowiring` + +--- + +## Création d'un service (2) + +### Utilisation du service dans un contrôleur + +```php +use AppBundle\Service\MyService; + +class DemoController extends Controller +{ + /** + * @Route("/demo") + */ + public function demoAction(MyService $my) + { + $my->doNothing(); + } +} +``` + +--- + +## Création d'un service (3) + +### Déclaration de dépendances inter-services + +```php +namespace AppBundle\Service; + +use Psr\Log\LoggerInterface; + +class MyService { + + private $logger; + + public function __construct(LoggerInterface $logger) { + $this->logger = $logger; + } + + public function log($message) { + $this->logger->info($message); + } + +} +``` + +--- + +## Création d'un service (4) + +### Déclaration de dépendances vers des valeurs de configuration + +```php +namespace AppBundle\Service; + +class MyService { + + private $myCustomParameter; + + public function __construct($myCustomParameter) { + $this->myCustomParameter = $myCustomParameter; + } + +} +``` +--- + +## Création d'un service (5) + +### Déclaration explicite de la dépendance + +Dans `app/config/services.yml`, déclarer la dépendance explicitement: +```yaml +services: + AppBundle\Service\MyService: + arguments: + $myCustomParameter: 'test' +``` + +--- + +# Authentification et autorisation + +## Le fichier `app/config/security.yml` +## Firewalls, providers et encoders +## Gestion des rôles et contrôle des accès +## Méthode d'authentification personnalisée + +--- + +## Le fichier `app/config/security.yml` + +### Authentifications et autorisations + +--- + +## Firewalls (1) + +### Déclarer une nouvelle méthode d'authentification dans un firewall + +```yaml +security: + firewalls: + main: + anonymous: ~ + http_basic: ~ +``` + +--- + +## Firewalls (2) + +### Multiple firewalls + +```yaml +security: + + firewalls: + + authenticated_area: + pattern: ^/secured + http_basic: ~ + + public_area: + anonymous: ~ + +``` +--- + +## Providers (1) + +### Utilisation du provider `memory` + +```yaml +security: + + providers: + in_memory: + memory: + users: + bob: + password: bob + roles: 'ROLE_USER' + admin: + password: 123456 + roles: 'ROLE_ADMIN' + +``` + +--- + +## Providers (2) + +### Déclaration de l'`encoder` pour la gestion des mots de passe + +```yaml +security: + encoders: + Symfony\Component\Security\Core\User\User: plaintext +``` + +--- + +## Providers (3) + +### Utilisation d'un `encoder` apportant un meilleur niveau de sécurité + +```yaml +security: + encoders: + Symfony\Component\Security\Core\User\User: + algorithm: bcrypt + cost: 12 +``` +#### Calcul de l'empreinte d'un mot de passe + +```bash +bin/console security:encode-password +``` + +--- + +## Gestion des rôles et contrôle des accès (1) + +## Définition de rôles + +```yaml +security: + access_control: + - { path: ^/admin, roles: ROLE_ADMIN } + - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } +``` + +--- + +## Gestion des rôles et contrôle des accès (2) + +## Restriction d'accès par adresse IP + +```yaml +security: + access_control: + - path: ^/local-api + roles: ROLE_API_USER + ips: [127.0.0.1] +``` + +--- + + +## Gestion des rôles et contrôle des accès (3) + +## Définition de règles d'accès pour les actions + +```php +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; + +class DemoController extends Controller +{ + /** + * @Route("/demo") + * @Security("has_role('ROLE_ADMIN')") + */ + public function demoAction() + { + // ... + } + +} +``` +--- + +## Méthode d'authentification personnalisée + +### Exercice + +Implémenter une classe `Guard` pour créer un firewall pour un serveur d'authentification "passwordless" basé sur JWT. + +**Ressources** +- Tutoriel Symfony3 sur l'utilisation de la classe Guard https://symfony.com/doc/3.4/security/guard_authentication.html +- Instance de démonstration du serveur d'authentification: https://forge.cadoles.com/wpetit/ciku +- Sources du serveur d'authentification: https://forge.cadoles.com/wpetit/ciku + +--- + +# Les vues et le moteur de templating Twig + +## Organisation des vues +## Syntaxe Twig +## Héritage et composition +## Étendre Twig + +--- + +## Organisation des vues dans le projet + +--- + +## Syntaxe Twig + +```twig + + +

{{ myVar }}

+ + + +``` + +--- + +## Héritage et composition (1) + +### Héritage + +```twig +// parent.html.twig + + + {% block body %} +
+ Default content +
+ {% endblock %} + + +``` + +```twig +// child.html.twig +{% extends 'parent.html.twig' %} +{% block body %} +
+ Child content +
+{% endblock %} +``` +--- + +## Héritage et composition (21) + +### Composition + +```twig +// layout.html.twig + + + {% for i in items %} + {{ include('_partial.html.twig', { 'item': i }) }} + {% endfor %} + + +``` +```twig +// _partial.html.twig +
+ Item #{{ item.id }} +
+``` +--- + +## Étendre Twig + + + +--- + +# Les formulaires + +## Création et traitement de formulaires +## Validation des données +## Les évènements + +--- + +# L'ORM Doctrine et le modèle de données + +## Concept d'ORM +## Entité et Dépôt +## Les évènements + +--- + +# Mise en production + +## Gestion des environnements +## Cache applicatif + +--- + +# Licence + +## CC BY-NC-SA 3.0 FR + +[Creative Commons - Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France](https://creativecommons.org/licenses/by-nc-sa/3.0/fr/) diff --git a/developpement/symfony3/ressources/planning.ods b/developpement/symfony3/ressources/planning.ods new file mode 100644 index 0000000..b36809e Binary files /dev/null and b/developpement/symfony3/ressources/planning.ods differ