CakePHP 4.3 est une mise à jour de l’API compatible à partir de la version 4.0. Cette page présente les dépréciations et fonctionnalités ajoutées dans la version 4.3.
Vous pouvez utiliser composer pour mettre à jour vers CakePHP 4.3.0:
php composer.phar require --update-with-dependencies "cakephp/cakephp:^4.3"
4.3 introduit quelques dépréciations. Toutes ces fonctionnalités continueront d’exister dans les versions 4.x mais seront supprimées dans la version 5.0. Vous pouvez utiliser l”outil de mise à niveau pour automatiser la mise à jour des fonctionnalités obsolètes:
bin/cake upgrade rector --rules cakephp43 <path/to/app/src>
Note
Cela ne met à jour que les changements de CakePHP 4.3. Assurez-vous d’appliquer d’abord les modifications de CakePHP 4.2.
Une nouvelle option de configuration a été ajoutée pour désactiver les dépréciations chemin par chemin. Cf. Avertissements de dépréciation pour plus d’informations.
Connection::supportsDynamicConstraints()
a été dépréciée car les fixtures
ne tentent plus de supprimer ou créer des contraintes dynamiquement.
Le callback de l’événement Controller.shutdown
des controllers a été
renommé de shutdown
à afterFilter
pour correspondre à celui du
controller. Cela rend les callbacks plus cohérents.
L’utilisation de classes de date et heure mutables avec DateTimeType
et
les autres classes de types relatifs aux heures est déprécié.
De ce fait, les méthodes DateTimeType::useMutable()
,
DateTimeType::useImmutable()
et les méthodes similaires dans d’autres
classes de types sont dépréciées.
DriverInterface::supportsQuoting()
et
DriverInterface::supportSavepoints()
sont maintenant dépréciées au profit
de DriverInterface::supports()
qui accepte des constantes de feature
définies dans DriverInterface
.
DriverInterface::supportsDynamicConstraints()
a été dépréciée dès lors que
les fixtures ne tentent plus de supprimer ou créer des contraintes
dynamiquement.
Les classes de date et heure Time
et Date
sont dépréciées.
À la place, utilisez leurs alternatives immutables FrozenTime
et
FrozenDate
.
Dans FileLog
l’option de configuration dateFormat
a été déplacée vers
DefaultFormatter
.
Dans ConsoleLog
l’option de configuration dateFormat
a été déplacée
vers DefaultFormatter
.
Dans SyslogLog
l’option de configuration format
a été déplacée vers
LegacySyslogFormatter
.
Par défaut, c’est maintenant DefaultFormatter
qui est utilisé.
Les middlewares « double pass », c’est-à-dire les classes avec une méthode
__invoke($request, $response, $next)
, sont dépréciés. À la place, utilisez
Closure
avec la signature function($request, $handler)
o des classes
qui implémentent Psr\Http\Server\MiddlewareInterface
.
Socket::$connected
est déprécié. Utilisez isConnected()
à la place.
Socket::$description
est déprécié.
Socket::$encrypted
est déprécié. Utilisez isEncrypted()
à la place.
Socket::$lastError
est déprécié. Utilisez lastError()
à la place.
ModelAwareTrait::loadModel()
est dépréciée. Utilisez la nouvelle méthode
LocatorAwareTrait::fetchTable()
à la place. Par exemple, dans les
controllers vous pouvez faire $this->fetchTable()
pour obtenir l’instance
de la table par défaut, ou utiliser $this->fetchTable('Foos')
pour une
table autre que celle par défaut. Vous pouvez définir la propriété
LocatorAwareTrait::$defaultTable
pour spécifier l’alias de la table par
défaut pour fetchTable()
.
L’usage de requêtes pour intercepter toutes les méthodes de
ResultSetInterface
(y compris `CollectionInterface`
), forcer la
récupération des résultats et appeler la méthode sous-jacente sur ces
résultats est maintenant déprécié. Un exemple de cet usage est
$query->combine('id', 'title');
. Ceci doit être remplacé par
$query->all()->combine('id', 'title');
.
Passer un object validator à Table::save()
via l’option validate
est
déprécié. Définissez le validator dans la classe de table ou utilisez
setValidator()
à la place.
Association::setName()
est dépréciée. Les noms d’associations doivent être
définis en même temps que l’association.
QueryExpression::addCase()
est dépréciée. Utilisez case()
à la place.
Les syntaxes ['value' => 'literal']
et ['column' => 'identifier']
ne
sont pas supportées dans le nouveau case builder. L’insertion de SQL brut ou
d’identifiants nécessite d’utiliser des expressions explicitement. Vous pouvez
définir la propriété LocatorAwareTrait::$defaultTable
pour spécifier
l’alias de la table par défaut.
Les placeholders de routes préfixés par des doubles points tels que
:controller
sont dépréciés. Remplacez-les par des placeholders entre
accolades tels que {controller}
.
TestFixture::$fields
et TestFixture::$import
sont dépréciés. Il est
conseillé de convertir votre application vers le
nouveau système de fixture.
TestCase::$dropTables
est déprécié. La suppression de tables pendant
l’exécution d’un test est incompatible avec les nouvelles fixtures basées sur
le dump d’une migration/schéma. La fonctionnalité sera supprimée dans 5.0.
Les options non associatives des méthodes de FormHelper (par exemple
['disabled']
) sont maintenant dépréciées.
Le second argument $merge
de ViewBuilder::setHelpers()
a été déprécié
au profit de la méthode dédiée ViewBuilder::addHelpers()
qui sépare
proprement l’ajout et le remplacement de helpers.
Bien que les changements qui suivent ne changent la signature d’aucune méthode, ils en changent la sémantique ou le comportement.
Le paramètre $preserveKeys
a été renommé en $keepKeys
avec la même
implémentation.
cake i18n extract
n’a plus d’option --relative-paths
. Cette option est
maintenant activée par défaut.
Configure::load()
soulèvera désormais une exception en cas d’utilisation
d’un moteur de configuration invalide.
ComparisonExpression `` n'entoure plus le SQL de ``IdentifierExpression
entre des parenthèses. Cela affecte Query::where()
et tous les autres
endroits où une ComparisonExpression
est générée.
L’implémentation SQLite de listTables()
renvoie maintenant les tables
et les vues. Ce changement aligne SQLite avec les autres dialectes de
bases de données.
Les noms des paramètres $alias
et $source
de
ConnectionManager::alias()
ont été modifiés pour correspondre à ce qu’ils
sont. Cela affecte uniquement la documentation et les paramètres nommés.
Http\Client
utilise maintenant ini_get('user_agent')
avec “CakePHP” en
tant que valeur de repli pour son user-agent.
Entity::isEmpty()
et Entity::hasValue()
ont été alignées pour traiter
“0” comme une valeur non-empty.
Cela aligne le behavior avec la documentation et l’intention originelle.
Les erreurs de validation d’entity de TranslateBehavior
sont maintenant
définies dans le chemin _translations.{lang}
au lieu de {lang}
. Cela
normalise le chemin des erruers d’entities pour les données de la requête. Si
vous avez des formulaires qui modifient plusieurs tranductions à la fois, vous
aurez vraisemblablement besoin de mettre à jour la façon dont sont rendues les
erreurs de validation.
Les types spécifiés dans des expressions de fonctions ont maintenant la
préséance sur les ensembles de types par défaut pour les colonnes, quand des
colonnes sont sélectionnées. Par exemple, pour utiliser
$query->select(['id' => $query->func()->min('id')])
la valeur pour id
dans l’entity récupérée sera un float au lieu d’un integer.
Router::connect()
, Router::prefix()
, Router::plugin()
et
Router::scope()
sont dépréciées. Utilisez les méthodes non statiques
correspondantes de RouteBuilder
à la place.
RouteBuilder::resources()
génère maintenant des routes qui utilisent des
placeholders entre accolades.
TestCase::deprecated()
vérifie (asserts) maintenant qu’au moins un
avertissement de dépréciation ait été déclenché par le callback.
Validator::setProvider()
lève maintenant une exception quand un nom de
provider fourni n’est ni un objet ni une chaîne de caractères. Auparavant cela
n’était pas une erreur, mais le provider ne fonctionnait pas.
Le paramètre $vars
de ViewBuilder::build()
est déprécié. Utilisez
setVar()
à la place.
HtmlHelper::script()
et HtmlHelper::css()
échappent désormais les URLs
absolues qui incluent un scheme.
Derrière l’API, certains changements sont nécessaires pour avancer. Ils n’affectent généralement pas les tests.
Les configurations de BaseLog::_getFormattedDate()
et dateFormat
ont
été supprimées puisque la logique de formatage du message a été déplacée vers
les formatters de logs.
TimeHelper::fromString()
renvoie maintenant une instance de FrozenTime
au lieu de Time
.
Controller::middleware()
a été ajoutée. Elle vous permet de définir un
middleware pour un seul contrôleur. Reportez-vous à Middleware de Controller
pour plus d’informations.
Les controllers supportent maintenant des paramètres d’actions avec des types
déclarés float
, int
, bool
ou array
. Les booléens passés
doivent être soit 0
soit 1
.
deprecationWarning()
n’émet plus de notices en doublon. Au lieu de cela,
seule la permière instance de dépréciation sera affichée. Cela améliore la
lisibilité de la sortie de test, et le bruit visuel dans un contexte HTML.
Vous pouvez restaurer la sortie de notices en doublon en définissant
Error.allowDuplicateDeprecations
à true
dans votre app_local.php
.
La dépendance de CakePHP envers league/container
a été mise à niveau à
^4.1.1
. Le conteneur DI étant marqué comme expérimental, cette mise à
niveau peut nécessiter que vous mettiez à niveau les définitions de vos
service providers.
Les types de mappage de bases de données peuvent maintenant implémenter
Cake\Database\Type\ColumnSchemaAwareInterface
pour spécifier la génération
de colonne SQL et la réflexivité du schéma de colonne. Cela permet au types
personnalisés de prendre en charge des colonnes non standard.
Les queries loguées utilisent maintenant TRUE
et FALSE
pour les
pilotes postgres, sqlite et mysql. Cela facilite la copie de queries et leur
exécution dans un prompt interactif.
Le DateTimeType
peut maintenant convertir les données de la requête du
fuseau horaire de l’utilisateur vers le fuseau horaire de l’application.
Reportez-vous à Convertir des Données de Requêtes du Fuseau Horaire de l’Utilisateur pour plus
d’informations.
Ajout de DriverInterface::supports()
qui consolide toutes les
vérifications de feature en une seule fonction. Les pilotes peuvent supporter
les nommages personnalisés de feature ou n’importe quelle constante de
feature:
FEATURE_CTE
FEATURE_JSON
FEATURE_QUOTE
FEATURE_SAVEPOINT
FEATURE_WINDOW
Ajout de DriverInterface::inTransaction()
qui reflète le statut renvoyé
par PDO::inTranaction()
.
Ajout d’un builder fluide pour les instructions CASE, WHEN, THEN
.
La méthode listTablesWithoutViews()
a été ajoutée à SchemaCollection
et aux dialectes des pilotes. Elle renvoie la liste des tables en excluant les
vues. Ceci est principalement utilisé pour tronquer les tables dans les tests.
Form::execute()
now accepts an $options
parameter. This parameter can
be used to choose which validator is applied or disable validation.
Form::validate()
now accepts a $validator
parameter which chooses the
validation set to be applied.
Le CspMiddleware
définit maintenant les attributs de la requête
cspScriptNonce
et cspStyleNonce
qui rationalise l’adoption de
content-security-policy strict.
Client::addMockResponse()
et clearMockResponses()
ont été ajoutées.
Les moteurs de log utilisent maintenant des formatters pour formater le texte
du message avant de l’écrire.
Cela peut être configuré avec l’option de configuration formatter
.
Consultez la section logging-formatters pour plus de détails.
JsonFormatter
a été ajouté et peut être défini comme option formatter
pour n’importe quel moteur de log.
Les queries qui font appel à des associations HasMany et BelongsToMany par
contain()
propagent le statut de cast du résultat. Cela assure que les
résultats de toutes les associations sont soit castés avec des objets de types
de mappage, soit pas du tout.
Table
inclut maintenant label
dans la liste des champs qui peuvent
candidater comme champs par défaut dans displayField
.
Query::whereNotInListOrNull()
et QueryExpression::notInOrNull()
ont
été ajoutés pour les colonnes nullable puisque null != value
est toujours
false et le test NOT IN
échoue toujours quand la colonne est null.
LocatorAwareTrait::fetchTable()
a été ajoutée. Elle vous permet d’utiliser
$this->fetchTable()
pour obtenir une instance de table depuis les classes
qui utilisent ce trait, telles que les controllers, les commands, mailers et
cells.
IntegrationTestTrait::enableCsrfToken()
permet maintenant l’utilisation de
noms de clés personnalisés pour les cookies/sessions CSRF.
HttpClientTrait
a été ajouté pour faciliter l’écriture de mocks HTTP.
Cf. Tests pour plus d’information.
Un nouveau système de fixture a été introduit. Ce système de fixture sépare le schéma et les données, ce qui vous permet de réutiliser vos migrations existantes pour définir un schéma de test. Le guide Mise à Niveau des Fixtures explique comment mettre à niveau.
HtmlHelper::script()
et HtmlHelper::css()
ajoutent maintenant
l’attribut nonce
pour générer des balises quand les attributs de requête
cspScriptNonce
et cspStyleNonce
sont présents.
FormHelper::control()
complète maintenant les attributs aria-invalid
,
aria-required
et aria-describedby
à partir des métadonnées depuis le
validator. L’attribut aria-label
sera défini si vous désactivez l’élement
automatique label et fournissez un placeholder.
ViewBuilder::addHelpers()
a été ajoutée pour séparer proprement les
opérations d’ajout et de redéfinition de helpers.