Programmation PHP avec Symfony/API
Pour créer une (API) avec Symfony, il existe plusieurs bibliothèques :
API Platform.
Installation.
 composer require api
Utilisation.
API Platform se configure par des annotations dans les entités.
Annotations.
API\ApiResource().
Définit les noms et méthodes REST (get, post...) des routes de l'API.
MaxDepth().
Définit le niveau de sérialisation d'un élément lié. Par exemple, si un client a plusieurs contrats et que ses contrats ont plusieurs produits, un "MaxDepth(1)" sur l'attribut "client->contrat" fera que la liste des clients comprendra tous les contrats mais pas leurs produits.
Évènements.
API Platform ajoute plus d'une dizaine d'évènements donc les priorités sont définies dans EventPriorities.
Par exemple, pour modifier un JSON POST envoyé, utiliser EventPriorities::PRE_DESERIALIZE.
L'évènement suivant POST_DESERIALIZE contient les objets instanciés à partir du JSON.
Features hors CRUD.
Pour ajouter des fonctionnalités supplémentaires aux create/read/update/delete, il faut passer par des "data providers" ou des "data persisters".
Triplet de bibliothèques.
Installation.
FOS REST.
FOSRestBundle apporte des annotations pour créer des contrôleurs d'API. Installation :
 composer require "friendsofsymfony/rest-bundle"
Puis dans config/packages/fos_rest.yaml :
fos_rest:
 view:
 view_response_listener: true
 format_listener:
 rules:
Documentation.
Toute API doit exposer sa documentation avec ses routes et leurs paramètres. NelmioApiDocBundle est un de générateur de documentation automatique à partir du code, qui permet en plus de tester en ligne. En effet, pour éviter de tester les API en copiant-collant leurs chemins dans une commande ou dans des logiciels plus complets comme Postman, on peut installer une interface graphique ergonomique qui allie documentation et test en ligne :
 composer require "nelmio/api-doc-bundle"
Son URL se configure ensuite dans routes/nelmio_api_doc.yml :
app.swagger_ui:
 path: /api/doc
 methods: GET
À ce stade l'URL /api/doc affiche juste un lien "NelmioApiDocBundle". Mais si les contrôleurs d'API sont identifiés dans annotations.yaml (avec un préfixe "api"), on peut voir une liste automatique de toutes leurs routes.
nelmio_api_doc:
 areas:
 path_patterns:
 - ^/api/(?!/doc$)
Authentification.
Pour tester depuis la documentation des routes nécessitant un token JWT, ajouter dans packages/nelmio_api_doc.yaml :
nelmio_api_doc:
 documentation:
 securityDefinitions:
 Bearer:
 type: apiKey
 description: 'Value: Bearer {jwt}'
 name: Authorization
 in: header
 security:
 - Bearer: []
Il devient alors possible de renseigner le token avant de tester.
Sérialiseur.
Enfin pour la , on distingue plusieurs solutions :
symfony/serializer.
 composer require "symfony/serializer"
jms/serializer-bundle.
 composer require "jms/serializer-bundle"
Utilisation.
Maintenant /api/doc affiche les méthodes des différents contrôleurs API. Voici un exemple :
<?php
namespace App\Controller;
use FOS\RestBundle\Controller\AbstractFOSRestController;
use FOS\RestBundle\View\View;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class APIController extends AbstractFOSRestController
 #[Route('/api/test', methods: ['GET'])]
 public function testAction(Request $request): View
 return View::create('ok');
 * @Route("/api/test", methods={"GET"})
 public function testAction(Request $request): View
Maintenant dans /api/doc, cliquer sur /api/test, puis "Ty it out" pour exécuter la méthode de test.
Sécurité.
Une API étant "stateless", l'authentification est assurée à chaque requête, par l'envoi par le client d'un token (JWT) dans l'en-tête HTTP (clé "Authorization"). Côté serveur, on transforme ensuite le JWT reçu en objet utilisateur pour accéder à l'identité du client au sein du code. Ceci est fait en configurant security.yaml, pour qu'un évènement firewall appelle automatiquement un guard authenticator :
composer require "symfony/security-bundle"
security:
 firewalls:
 main:
 guard:
 authenticators:
 - App\Security\TokenAuthenticator
Test.
Pour tester en shell :
TOKEN=123
curl -H 'Accept: application/json' -H "Authorization: Bearer ${TOKEN}" http://localhost

Photographie/Sociétés et Organisations/Éditeurs de cartes postales/Bulteau

Bulteau étaitn un éditeur de cartes postales installé à Armentières (Nord).

Photographie/Sociétés et Organisations/Éditeurs de cartes postales/G. Borelly fils

G. Borelly fils était un libraire et éditeur de cartes postales installé à Uzès (Gard).

Livre de cuisine/Boissons/Cocktails/White russian

Programmation PowerShell/Les objets personnalisés

Les objets personnalisés.
L'usage de PowerShell (ci-après PS) devient intéressant et réellement efficace lorsqu'on commence à créer ses propres objets. C'est la réelle plus-value d'un shell objet vs shell texte ! 
Retenez qu'il existe un type d'objet nommé PSCustomObject permettant de créer vos objets comme vous le voulez ! 
Vous allez pouvoir stocker les informations structurée selon vos besoin dans des collections (voir ou revoir la partie des tableaux). 
Créer un objet.
L'exemple ci-dessous vous montre comment créer un objet correspondant à vos besoins : 
$myObject = New-Object -TypeName pscustomobject
$myObject | Add-Member -MemberType NoteProperty -Name 'ID' -Value '1' 
$myObject | Add-Member -MemberType NoteProperty -Name 'Inutile' -Value $true 
$myObject | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Alfonso' 
$myObject
Récupérer un objet ne contenant que ce dont on a besoin.
L'exemple ci-dessous vous montre comment obtenir les propriétés désirées d'un objet comportant des dizaines de propriétés : 
$obj = $myObject | Select-Object -Property Name, ID
$obj
Ajouter un objet à une collection.
L'exemple ci-dessous vous montre comment ajouter vos objets dans une collection : 
$obj2 = New-Object -TypeName pscustomobject
$obj2 | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Bertha' 
$obj2 | Add-Member -MemberType NoteProperty -Name 'ID' -Value 2 
$obj2
$maCollection = New-Object -TypeName System.Collections.ArrayList
$maCollection += $obj 
$maCollection += $obj2 
$maCollection
Boucler et enrichir la collection d'objets.
Il est important de savoir ajouter, petit à petit des informations dans vos objets : 
$maCollection | ForEach-Object { $_ | Add-Member -Type NoteProperty -Name 'NewThing' -Value 'NewValue' } 
$maCollection | ForEach-Object { $_ | Add-Member -Type NoteProperty 'NewThing2' 'NewValue2' } 
$maCollection | ForEach-Object { $_ | Add-Member 'NewThing3' 'NewValue3' } 
$maCollection
Il est utile de savoir ajouter des valeurs calculées dans vos objets : 
Aller plus loin avec les objets.
Il est possible d'ajouter des méthodes à vos objets, etc.

Journal d'une construction Chaux-Paille Wambrechie 20190413