Si vous vous souvenez de mon article Comment désactiver le mode strict de MySQL sur Laravel Forge (Ubuntu), vous vous souviendrez que MySQL 5.7 a introduit quelque chose que nous appelons avec désinvolture le “mode strict”, qui est en réalité une combinaison de nouveaux modes qui, en somme , faites en sorte que MySQL traite vos requêtes un peu plus strictement qu’auparavant.
Dans mon post précédent, j’ai montré comment le désactiver sur Ubuntu, mais depuis lors, Adam Wathan a ajouté une fonctionnalité à Laravel qui vous permet de définir si vous utilisez le mode “strict” et vous permet également de personnaliser exactement les modes que vous ‘ d comme activé – tout en code.
Si je peux définir une option de configuration dans le code plutôt que sur un serveur sans subir de baisse de performances, je la préférerai toujours – c’est une chose de moins que je dois faire à chaque fois que je déploie sur un nouveau serveur. Donc, je suis totalement heureux pour cette nouvelle fonctionnalité.
Il convient de noter que vous pouvez utiliser cette fonctionnalité non seulement pour désactiver le mode strict sur 5.7 ; vous pouvez également l’activer sur 5.6. Il peut être judicieux de l’activer sur n’importe quelle application fonctionnant sur 5.6 afin que vous puissiez vous préparer pour 5.7, en voyant si quelque chose se casse lorsque vous activez certains des modes les plus stricts.
MySQL 5.7 et mode “strict”
Avant de parler de la fonctionnalité, couvrons rapidement ce que signifie “mode strict”.
MySQL a des “modes”, dont chacun active ou désactive un certain comportement. Par exemple, ERROR_FOR_DIVISION_BY_ZERO
est un mode qui, vous l’avez deviné, génère une erreur lorsque vous divisez par zéro dans une opération de division SQL. Sans ce mode activé, vous obtiendrez juste un NULL
résultat en silence.
Le “mode strict”, qui n’est en fait que la liste des modes activés par défaut par 5.7, comprend les modes suivants :
ONLY_FULL_GROUP_BY
STRICT_TRANS_TABLES
NO_ZERO_IN_DATE
NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO
NO_AUTO_CREATE_USER
NO_ENGINE_SUBSTITUTION
Vous pouvez en savoir plus sur ces modes dans la documentation MySQL.
Avant la version 5.7, le seul mode activé était NO_ENGINE_SUBSTITUTION
.
Activer et désactiver le mode strict dans Laravel 5.2
Avec cette nouvelle fonctionnalité, Laravel a désormais la possibilité de faire trois choses : Désactiver le mode “strict”, en revenant au comportement <= 5.6 ; activer le mode "strict", en le réglant sur le comportement 5.7 ; ou personnaliser exactement quels modes sont activés.
Ces paramètres vivent dans config/database.php
dans le connections.mysql
section. Pour commencer, examinons comment activer et désactiver le mode “strict”:
'connections' => [
'mysql' => [
// Behave like MySQL 5.6
'strict' => false,
// Behave like MySQL 5.7
'strict' => true,
]
]
Personnalisation des modes activés
Mais que se passe-t-il si vous n’êtes pas satisfait des valeurs par défaut du mode 5.6 ou 5.7 ? Personnalisez-les simplement vous-même.
'connections' => [
'mysql' => [
// Ignore this key and rely on the strict key
'modes' => null,
// Explicitly disable all modes, overriding strict setting
'modes' => [],
// Explicitly enable specific modes, overriding strict setting
'modes' => [
'STRICT_TRANS_TABLES',
'ONLY_FULL_GROUP_BY',
],
]
]
C’est tout, les gens
Vous avez maintenant la possibilité de contrôler totalement les modes activés sur le serveur MySQL de votre application, dans le code, sans toucher à une ligne de configuration du serveur. Juste comme ça.
Par défaut, je vous recommande de les laisser tous activés. Mais il peut y avoir des cas d’utilisation particuliers ou d’anciens projets où vous devez personnaliser cette liste, et c’est maintenant possible – et même simple.