AFSY
Association Française des utilisateurs de Symfony
Derrière ce titre accrocheur se cache en réalité l'introduction de notre calendrier de l'avent. Il s'agit d'un projet communautaire qui a pour but de publier un article par jour sur notre site jusqu'au 24 décembre ! Bienvenue donc dans notre petite aventure, ou plutôt cette course aux articles de 24 jours qui fera suer plus d'un de nos membres. Nous espérons que notre travail intéressera, fera découvrir des subtilités et/ou outils.
Mais avant de commencer, connaissez-vous vraiment l'AFSY ? C'est l'occasion de poser sur papier qui nous sommes et quelle est notre démarche.
#entraide
pour éviter la dépression quand on a des bugs ou des questions d'architecture#boire-manger-paris
pour être au courant des petits apéros à l'improviste#my-little-opensource
pour présenter un projet open source sur lequel vous travaillez#javascript
, #trolling
ou #niort
pour l'humourTout cela ne raconte pas toute l'histoire de l'AFSY mais vous en donne une belle perspective. Rentrons maintenant dans le vif du sujet. Chose promise, chose due. Voici vos 10 astuces « incroyables ».
Ajoutez le package symfony/thanks pour ajouter la commande thanks
à Composer et ajouter des étoiles aux dépôts des
projets que vous utilisez. La commande composer fund
permet de facilement trouver le moyen de financer les projets
que vous utilisez.
composer require --dev symfony/thanks
composer thanks
composer fund
La commande suivante vous permet d'avoir vos dumps en ligne de commande dans un terminal séparé. Pratique si vous avez une architecture un peu complexe, ou simplement une API où vous ne voyez pas l'output. Sachez que vous pouvez également retrouver ces dumps dans l'interface du web profiler (si vous ne l'utilisez pas dans une commande).
bin/console server:dump
Vous pouvez utiliser l'outil symfony
(le même qui sert à démarrer un projet!) pour servir votre projet en local.
Peut-être que la plupart d'entre vous utilise Docker, mais sachez que grâce à cet outil vous allez gagner significativement
en performances. Et rien ne vous empêche d'utiliser Docker en même temps pour vos services tiers (type BDD).
Voici une liste non exhaustive des fonctionnalités de l'outil:
.php-version
) avec une configuration donnée (php.ini)Lisez la documentation pour en apprendre plus à ce sujet !
Votre site contient des liens vers des sites externes ? Vous utilisez des assets stockés sur un CDN ? Rien ne vous empêche
d’utiliser quand même les composants Symfony ! Vous pouvez par exemple ajouter à votre routes.yaml
la route suivante :
google_search:
path: /search
host: www.google.com
Puis dans votre Twig par exemple, ajouter ce lien:
<a href="{{ url('google_search', {q: 'Symfony'}) }}">Symfony</a>
Vous pouvez ainsi profiter pleinement des fonctionnalités du générateur d’URL, ajouter facilement des paramètres, utiliser la configuration pour pointer sur un domaine différent en dev et en prod, etc. De la même manière, vous pouvez utiliser Symfony pour pointer sur des assets en dehors de votre projet. Par exemple avec la configuration suivante :
framework:
assets:
packages:
symfony:
version: ~
base_urls: 'https://symfony.com/images'
Vous pourrez ensuite intégrer les images du site Symfony dans vos vues, en utilisant le 2è argument de asset()
:
<img src="{{ asset('opengraph/symfony.png', 'symfony') }}">
La documentation de Doctrine a été mise à jour afin d'être plus claire sur ce fait: l'utilisation de DQL, c'est plus simple. Ne vous complexifiez pas la vie avec l'utilisation de QueryBuilder lorsque vous n'en avez pas besoin. Le QueryBuilder génère de toute façon du DQL.
N'hésitez pas à utiliser les nowdoc qui ont été réellement améliorées dans PHP 7.3 ! (vous pouvez maintenant les indenter !)
Si vous avez décidé d'utiliser Messenger, vous allez probablement modifier des données dans vos messages handlers. Et si ceux-ci sont asynchrones vous pouvez avoir plusieurs erreurs:
A chaque problème sa solution, le DoctrineBridge vous propose plusieurs middlewares disponibles que vous pouvez ajouter facilement dans la configuration de votre application.
# config/packages/messenger.yaml
framework:
messenger:
buses:
command_bus:
middleware:
# A chaque fois qu'un message est traité, la connexion est "pinguée"
# en cas d'erreur une nouvelle connexion est ouverte
- doctrine_ping_connection
# La connexion est ouverte avant votre handler, et fermée
# tout de suite après au lieu de la conserver ouverte pour toujours
- doctrine_close_connection
# Enveloppe votre handler dans une seule transaction Doctrine
# votre handler n'a pas besoin d'appeler flush et une erreur
# provoquera un rollback automatiquement.
- doctrine_transaction
# Nettoie l'entity manager avant de l'envoyer à votre handler
- doctrine_clear_entity_manager
Le Serializer de Symfony vous propose de spécifier un contexte. Vous l'utilisez probablement pour définir des groupes de sérialisation. Mais saviez-vous que l'on peut également spécifier beaucoup d'autres options ? En voici quelques unes :
circular_reference_limit
est le nombre de fois qu'un objet peut être trouvé recursivement avant de lancer une erreur.
Par défaut, sa valeur est de 1;default_constructor_arguments
permet de définir les paramètres par défaut pour un objet à construire. Si ceux-ci
ne sont pas fournis dans les données en entrée, cela évitera au deserializer de lancer une exception disant qu'il
ne peut pas construire votre objet;callbacks
pour une petite sérialisation rapide qui n'est pas globale à toute l'application, au lieu de définir un
normalizer global, il peut être pratique d'utiliser une simple callback.Depuis Symfony 4.4 nous avons la possibilité de faire un chargement de variables d'environment custom. Pour cela il suffit
d'implémenter l'interface EnvVarLoaderInterface
dans un service.
Cela permet par exemple d'implémenter très facilement une configuration avec Consul:
# config/services.yaml
bind:
string $name: '%env(name)%'
namespace App\Env;
use Symfony\Component\DependencyInjection\EnvVarLoaderInterface;
class ConsulEnvVarLoader implements EnvVarLoaderInterface
{
public function loadEnvVars(): array
{
$response = file_get_contents('http://127.0.0.1:8500/v1/kv/website-config');
$consulValue = json_decode($response, true)[0]['Value'];
$decoded = json_decode(base64_decode($consulValue), true);
// Shape:
// array:1 [▼
// "name" => "my super website"
// ]
return $decoded;
}
}
./consul kv put website-config '{"name": "Symfony read this var from consul"}'
Un des changements récents qui peut vous impacter dans Doctrine est le choix de déprécier useResultCache
au profit des
méthodes enableResultCache
et disableResultCache
qui simplifient légèrement l'écriture de votre code. Pensez à
changer dès aujourd'hui pour vous préparer aux futures versions de Doctrine !
// 👌 Simple et clair dans Doctrine 2:
$res = $entityManager
->createQuery($dql)
->useResultCache($cache_enabled, $ttl)
->getResult();
#####
// ✨👌✨ Plus simple et plus clair avec Doctrine 2 et 3 :
// la bonne pratique est de remplacer le système de cache
// de manière globale
$res = $entityManager
->createQuery($dql)
->enableResultCache($ttl)
->getResult();
Le saviez vous, la plupart des systèmes d'exploitation ont une commande uuidgen
, pratique pour écrire un test qui utilise
des uuids.
Et si vous voulez utiliser les uuids mais que vous n'avez pas l'extension PHP activée, pas d'inquiétude. Utilisez le polyfill disponible dans Symfony:
composer require symfony/polyfill-uuid
$uuid = uuid_create(UUID_TYPE_RANDOM);
// $uuid = '79a0f84a-2f15-4ea9-bb2c-49e645845100'
$isValid = uuid_is_valid($uuid);
// $isValid = true
Si l'extension PECL est installée, alors elle sera utilisée.