3.0 Guide de Migration
Cette page résume les changements de CakePHP 2.x qui aidera à la migration d’un
projet vers la version 3.0, ainsi qu’une référence pour être à jour des
changements faits dans le cœur depuis la branche CakePHP 2.x. Assurez-vous de
bien lire les autres pages de ce guide pour toutes les nouvelles
fonctionnalités et les changements de l’API.
Prérequis
CakePHP 3.x a besoin de la Version 5.4.16 ou supérieur de PHP.
CakePHP 3.x a besoin de l’extension mbstring.
CakePHP 3.x a besoin de l’extension intl.
Avertissement
CakePHP 3.0 ne fonctionnera pas si vous n’avez pas les prérequis ci-dessus.
Outil d’Upgrade
Alors que ce document couvre tous les changements non rétro-compatibles et les
évolutions faites dans CakePHP 3.0, nous avons également créé une application
de console pour vous aider à réaliser quelques changements qui consomment du
temps. Vous pouvez Récupérer l’outil d’upgrade depuis Github.
Organisation des Répertoires de l’Application
L’organisation des répertoires de l’application a changé et suit maintenant
PSR-4. Vous devez utiliser le projet de
squelette d’application comme
point de référence lors de la mise à jour de votre application.
CakePHP doit être installé avec Composer
Puisque CakePHP ne peut plus être installé via PEAR, ou dans un répertoire
partagé, ces options ne sont plus supportées. A la place, vous devez utiliser
Composer pour installer CakePHP dans votre
application.
Namespaces (Espaces de Noms)
Toutes les classes du cœur de CakePHP sont maintenant dans des namespaces et
suivent les spécifications du chargement PSR-4. Par exemple
src/Cache/Cache.php est dans le namespace Cake\Cache\Cache
. Les
constantes globales et les méthodes de helper comme __()
et
debug()
ne sont pas mis dans un namespace pour des raisons de
commodité.
Constantes retirées
Les constantes dépréciées suivantes ont été retirées:
IMAGES
CSS
JS
IMAGES_URL
JS_URL
CSS_URL
DEFAULT_LANGUAGE
Configuration
La configuration dans CakePHP 3.0 est significativement différente des
versions précédentes. Vous devriez lire la documentation
Configuration sur la façon dont la configuration est faite
dans la version 3.0.
Vous ne pouvez plus utiliser App::build()
pour configurer les chemins de
classe supplémentaires. A la place, vous devez mapper les chemins
supplémentaires en utilisant l’autoloader de votre application. Regardez la
section sur Chemins de Classe Supplémentaires pour plus d’informations.
Trois nouvelles variables de configuration fournissent la configuration
de chemin pour les plugins, les views et les fichiers de locales. Vous pouvez
ajouter plusieurs chemins à App.paths.templates
, App.paths.plugins
et
App.paths.locales
pour configurer des chemins multiples pour respectivement
les templates, les plugins et les fichiers de locales.
La clé de configuration www_root
a été renommée wwwRoot
par cohérence.
Merci d’ajuster votre fichier de configuration app.php ainsi que chaque
utilisation de``Configure::read(“App.wwwRoot”)``.
Nouvel ORM
CakePHP 3.0 dispose d’un nouvel ORM qui a été reconstruit de zéro. Le nouvel ORM
est significativement différent et incompatible avec la version précédente.
Mettre à jour vers le nouvel ORM nécessite des changements importants dans toute
application qui souhaite être mise à jour. Regardez la nouvelle documentation
Accès Base de Données & ORM pour des informations sur la façon d’utiliser le nouvel ORM.
Notions de base
LogError()
a été retirée, elle ne fournissait aucun bénéfice
et n’était rarement/jamais utilisée.
Les fonctions globales suivantes ont été retirées: config()
, cache()
,
clearCache()
, convertSlashes()
, am()
, fileExistsInPath()
,
sortByKey()
.
Paramétrage/Configuration des Objets
Cache
Le moteur Memcache
a été retiré, utilisez
Cake\Cache\Cache\Engine\Memcached
à la place.
Les moteurs de Cache sont maintenant chargés automatiquement à la première
utilisation.
Cake\Cache\Cache::engine()
a été ajoutée.
Cake\Cache\Cache::enabled()
a été ajoutée. celle-ci remplace
l’option de configuration Cache.disable
.
Cake\Cache\Cache::enable()
a été ajoutée.
Cake\Cache\Cache::disable()
a été ajoutée.
Les configurations de Cache sont maintenant immutables. Si vous avez besoin de
changer la configuration, vous devez d’abord retirer la configuration et la
recréer. Cela évite les problèmes de synchronisation avec les options de
configuration.
Cache::set()
a été retirée. Il est recommandé que vous créiez des
configurations de cache multiples pour remplacer les réglages de configuration
d’exécution, ce qui était auparavant possible avec Cache::set()
.
Toutes les sous-classes CacheEngine
intègrent maintenant une méthode
config()
.
Cake\Cache\Cache::readMany()
,
Cake\Cache\Cache::deleteMany()
, et
Cake\Cache\Cache::writeMany()
ont été ajoutées.
Toutes les méthodes de Cake\Cache\Cache\CacheEngine
sont
maintenant responsables de la gestion du préfix de clé configuré.
Cake\Cache\CacheEngine::write()
ne permet plus de définir la
durée d’écriture - la durée est prise par la configuration d’exécution du
moteur de cache. Appeler une méthode de cache avec une clé vide va maintenant
lancer InvalidArgumentException
, au lieu de retourner false
.
Core
App
App::pluginPath()
a été retirée. Utilisez CakePlugin::path()
à la place.
App::build()
a été retirée.
App::location()
a été retirée.
App::paths()
a été retirée.
App::load()
a été retirée.
App::objects()
a été retirée.
App::RESET
a été retirée.
App::APPEND
a été retirée.
App::PREPEND
a été retirée.
App::REGISTER
a été retirée.
Plugin
Cake\Core\Plugin::load()
ne configure pas d’autoloader à moins
que vous définissiez l’option autoload
à true
.
Lors du chargement des plugins, vous ne pouvez plus fournir de callable.
Lors du chargement des plugins, vous ne pouvez plus fournir un tableau de
fichiers de configuration à charger.
Object
La classe Object
a été retirée. Elle contenait au début un tas de méthodes
qui étaient utilisées dans plusieurs endroits à travers le framework. Les
méthodes les plus utiles qui étaient utilisées ont été extraites dans des
traits. Vous pouvez utiliser Cake\Log\LogTrait
pour accéder à la
méthode log()
. Cake\Routing\RequestActionTrait
fournit
requestAction()
.
Console
L’exécutable cake
a été déplacé du répertoire app/Console
vers le
répertoire bin
dans le squelette de l’application. Vous pouvez maintenant
lancer la console de CakePHP avec bin/cake
.
TaskCollection Remplacée
Cette classe a été renommée en Cake\Console\TaskRegistry
.
Regardez la section sur Objets Registry pour plus
d’informations sur les fonctionnalités fournies par la nouvelle classe. Vous
pouvez utiliser cake upgrade rename_collections
pour vous aider à mettre
à niveau votre code. Les Tasks n’ont plus accès aux callbacks, puisqu’il
n’y avait jamais de callbacks à utiliser.
Shell
De plus, toutes les méthodes du shell vont être transformées en camel case lors
de leur appel. Par exemple, si vous avez une méthode hello_world()
dans un
shell et que vous l’appelez avec bin/cake my_shell hello_world
, vous devez
renommer la méthode en helloWorld
. Il n’y a pas de changements nécessaires
dans la façon d’appeler les commandes.
Shell / Task
Shells et Tasks ont été déplacés de Console/Command
et
Console/Command/Task
vers Shell
et Shell/Task
.
ApiShell Retiré
ApiShell a été retiré puisqu’il ne fournit aucun bénéfice sur le fichier
source lui-même et sur la documentation/l’API
en-ligne.
SchemaShell Removed
SchemaShell a été retiré puisqu’il n’a jamais été une implémentation
de migrations de base de données complète et de meilleurs outils comme
Phinx ont émergé. Il a été remplacé par
le Plugin de Migrations pour CakePHP
qui permet l’utilisation de Phinx avec CakePHP.
BakeShell / TemplateTask
Bake ne fait plus partie du code source du core et est remplacé par le
Plugin CakePHP Bake
Les templates de bake ont été déplacés vers src/Template/Bake.
La syntaxe des templates Bake utilise maintenant des balises de type erb
(<% %>
) pour désigner le templating.
La commande bake view
a été renommée bake template
.
Event
La méthode getEventManager()
a été retirée pour tous les objets qui
l’avaient. Une méthode eventManager()
est maintenant fournie par
EventManagerTrait
. EventManagerTrait
contient la logique pour instancier
et garder une référence d’un gestionnaire d’évènement local.
Le sous-système d’Event s’est vu retiré un certain nombre de fonctionnalités
Lors du dispatching des événements, vous ne pouvez plus utiliser les options
suivantes:
passParams
Cette option est maintenant toujours activée implicitement.
Vous ne pouvez pas l’arrêter.
break
Cette option a été retirée. Vous devez maintenant arrêter les
events.
breakOn
Cette option a été retirée. Vous devez maintenant arrêter les
events.
Log
Les configurations des logs sont maintenant immutables. Si vous devez changer
la configuration, vous devez d’abord supprimer la configuration et la récréer.
Cela évite les problèmes de synchronisation avec les options de configuration.
Les moteurs de Log se chargent maintenant automatiquement à la première
écriture dans les logs.
Cake\Log\Log::engine()
a été ajoutée.
Les méthodes suivantes ont été retirées de Cake\Log\Log
::
defaultLevels()
, enabled()
, enable()
, disable()
.
Vous ne pouvez plus créer de niveaux personnalisés en utilisant
Log::levels()
.
Lors de la configuration des loggers, vous devez utiliser 'levels'
au
lieu de 'types'
.
Vous ne pouvez plus spécifier de niveaux de log personnalisé. Vous devez
utiliser les niveaux de log définis par défaut. Pour créer des fichiers de
log personnalisés ou spécifiques à la gestion de différentes sections de
votre application, vous devez utiliser les logging scopes. L’utilisation
d’un niveau de log non-standard lancera maintenant une exception.
Cake\Log\LogTrait
a été ajoutée. Vous pouvez utiliser ce trait
dans vos classes pour ajouter la méthode log()
.
Le logging scope passé à Cake\Log\Log::write()
est maintenant
transmis à la méthode write()
du moteur de log afin de fournir un meilleur
contexte aux moteurs.
Les moteurs de Log sont maintenant nécessaires pour intégrer
Psr\Log\LogInterface
plutôt que la propre LogInterface
de CakePHP. En
général, si vous étendez Cake\Log\Engine\BaseEngine
vous devez juste renommer la méthode write()
en log()
.
Cake\Log\Engine\FileLog
écrit maintenant les fichiers dans
ROOT/logs
au lieu de ROOT/tmp/logs
.
Routing
Paramètres Nommés
Les paramètres nommés ont été retirés dans 3.0. Les paramètres nommés ont été
ajoutés dans 1.2.0 comme un “belle” version des paramètres query strings. Alors
que le bénéfice visuel est discutable, les problèmes engendrés par les
paramètres nommés ne le sont pas.
Les paramètres nommés nécessitaient une gestion spéciale dans CakePHP ainsi
que toute librairie PHP ou JavaScript qui avaient besoin d’interagir avec eux,
puisque les paramètres nommés ne sont implémentés ou compris par aucune
librairie exceptée CakePHP. La complexité supplémentaire et le code nécessaire
pour supporter les paramètres nommés ne justifiaient pas leur existence, et
elles ont été retirées. A la place, vous devrez utiliser les paramètres
standards de query string, ou les arguments passés. Par défaut Router
traitera tous les paramètres supplémentaires de Router::url()
comme des
arguments de query string.
Puisque beaucoup d’applications auront toujours besoin de parser des URLs
entrantes contenant des paramètres nommés,
Cake\Routing\Router::parseNamedParams()
a été ajoutée
pour permettre une rétrocompatibilité avec les URLs existantes.
Router
Les paramètres nommés ont été retirés, regardez ci-dessus pour plus
d’informations.
L’option full_base
a été remplacée par l’options _full
.
L’option ext
a été remplacée par l’option _ext
.
Les options _scheme
, _port
, _host
, _base
, _full
et
_ext
ont été ajoutées.
Les chaînes URLs ne sont plus modifiées en ajoutant les noms de
plugin/controller/prefix.
La gestion de route fallback par défaut a été retirée. Si aucune route ne
correspond à un paramètre défini, /
sera retourné.
Les classes de route sont responsables pour toutes les générations d’URL
incluant les paramètres de query string. Cela rend les routes bien plus
puissantes et flexibles.
Les paramètres persistants ont été retirés. Ils ont été remplacés par
Cake\Routing\Router::urlFilter()
qui est une meilleur façon
plus flexible pour changer les URLs étant routées inversement.
La signature de Cake\Routing\Router::parseExtensions()
a changé
en parseExtensions(string|array $extensions = null, $merge = true)
. Elle
ne prend plus d’arguments variables pour la spécification des extensions.
Aussi, vous ne pouvez plus l’appeler sans paramètre pour parser toutes les
extensions (en faisant cela, cela va retourner des extensions existantes qui
sont définies). Vous avez besoin de faire une liste blanche des extensions
que votre application accepte.
Router::parseExtensions()
doit être appelée avant que les routes ne
soient connectées. Il ne modifie plus les routes existantes lors de son appel.
Router::setExtensions()
a été retirée. Utilisez
Cake\Routing\Router::parseExtensions()
à la place.
Router::resourceMap()
a été retirée.
L’option [method]
a été renommée en _method
.
La capacité pour faire correspondre les en-têtes arbitraires avec les
paramètres de style []
a été retirée. Si vous avez besoin de parser/faire
correspondre sur les conditions arbitraires, pensez à utiliser les classes de
route personnalisées.
Router::promote()
a été retirée.
Router::parse()
va maintenant lancer une exception quand une URL ne peut
pas être gérée par aucune route.
Router::url()
va maintenant lancer une exception quand aucune route ne
matche un ensemble de paramètres.
Les scopes de Routing ont été introduits. Les scopes de Routing vous
permettent de garder votre fichier de routes DRY et donne au Router des
indices sur la façon d’optimiser le parsing et le routing inversé des URLs.
Route
CakeRoute
a été renommée en Route
.
La signature de match()
a changé en match($url, $context = [])
Consultez Cake\Routing\Route::match()
pour plus d’informations
sur la nouvelle signature.
La Configuration des Filtres de Dispatcher a Changé
Les filtres de Dispatcher ne sont plus ajoutés à votre application en utilisant
Configure
. Vous les ajoutez maintenant avec
Cake\Routing\DispatcherFactory
. Cela signifie que si votre
application utilisait Dispatcher.filters
, vous devrez maintenant utiliser
Cake\Routing\DispatcherFactory::add()
.
En plus des changements de configuration, les filtres du dispatcher ont vu
leurs conventions mises à jour, et des fonctionnalités ont été ajoutées.
Consultez la documentation Filtres du Dispatcher pour plus
d’informations.
FilterAssetFilter
Les assets des Plugin & theme gérés par AssetFilter ne sont plus lus via
include
, à la place ils sont traités comme de simples fichiers texte. Cela
règle un certain nombre de problèmes avec les librairies JavaScript comme
TinyMCE et les environnements avec short_tags activé.
Le support pour la configuration de Asset.filter
et les hooks ont été
retirés. Cette fonctionnalité peut être remplacée par un plugin ou un filtre
dispatcher.
Network
Request
CakeRequest
a été renommé en Cake\Network\Request
.
Cake\Network\Request::port()
a été ajoutée.
Cake\Network\Request::scheme()
a été ajoutée.
Cake\Network\Request::cookie()
a été ajoutée.
Cake\Network\Request::$trustProxy
a été ajoutée. Cela rend
la chose plus facile pour mettre les applications CakePHP derrière les
load balancers.
Cake\Network\Request::$data
n’est plus fusionnée avec la clé
de données préfixés, puisque ce préfixe a été retiré.
Cake\Network\Request::env()
a été ajoutée.
Cake\Network\Request::acceptLanguage()
a été changée d’une
méthode static en non static.
Le détecteur de Request pour « mobile » a été retiré du cœur. A la place
le template de app ajoute des détecteurs pour « mobile » et « tablet » en
utilisant la lib MobileDetect
.
La méthode onlyAllow()
a été renommée en allowMethod()
et n’accepte
plus « var args ». Tous les noms de méthode doivent être passés en premier
argument, soit en chaîne de caractère, soit en tableau de chaînes.
Response
Le mapping du mimetype text/plain
en extension csv
a été retiré.
En conséquence, Cake\Controller\Component\RequestHandlerComponent
ne définit pas l’extension en csv
si l’en-tête Accept
contient le
mimetype text/plain
ce qui était une nuisance habituelle lors de la
réception d’une requête jQuery XHR.
Sessions
La classe session n’est plus statique, à la place, la session est accessible
à travers l’objet request. Consultez la documentation
Sessions sur l’utilisation de l’objet session.
Cake\Network\Session
et les classes de session liées ont été
déplacées dans le namespace Cake\Network
.
SessionHandlerInterface
a été retirée en faveur de celui fourni par PHP.
La propriété Session::$requestCountdown
a été retirée.
La fonctionnalité de session checkAgent a été retirée. Elle entrainait un
certain nombre de bugs quand le chrome frame, et flash player sont impliqués.
Le nom de la table de la base de données des sessions est maintenant
sessions
plutôt que cake_sessions
.
Le timeout du cookie de session est automatiquement mis à jour en tandem avec
le timeout dans les données de session.
Le chemin pour le cookie de session est maintenant par défaut le chemin de
l’application plutôt que « / ».
De plus, une nouvelle variable de configuration Session.cookiePath
a été
ajoutée pour personnaliser le chemin du cookie.
Une nouvelle méthode Cake\Network\Session::consume()
a été ajoutée
pour permettre de lire et supprimer les données de session en une seule étape.
Network\Http
HttpSocket
est maintenant Cake\Network\Http\Client
.
HttpClient a été réécrit de zéro. Il a une API plus simple/facile à utiliser,
le support pour les nouveaux systèmes d’authentification comme OAuth, et les
uploads de fichier.
Il utilise les APIs de PHP en flux donc il n’est pas nécessaire d’avoir cURL.
Regardez la documentation Client Http pour plus
d’informations.
Network\Email
Cake\Network\Email\Email::config()
est utilisée maintenant pour
définir les profiles de configuration. Ceci remplace les classes
EmailConfig
des précédentes versions.
versions.
Cake\Network\Email\Email::profile()
remplace config()
comme
façon de modifier les options de configuration par instance.
Cake\Network\Email\Email::drop()
a été ajoutée pour permettre
le retrait de la configuration d’email.
Cake\Network\Email\Email::configTransport()
a été ajoutée pour
permettre la définition de configurations de transport. Ce changement retire
les options de transport des profiles de livraison et vous permet de
réutiliser les transports à travers les profiles d’email.
Cake\Network\Email\Email::dropTransport()
a été ajoutée pour
permettre le retrait de la configuration du transport.
Controller
Controller
Les propriétés $helpers
, $components
sont maintenant
fusionnées avec toutes les classes parentes, pas seulement
AppController
et le app controller du plugin. Les propriétés sont
fusionnées de manière différente par rapport à aujourd’hui. Plutôt que
d’avoir comme actuellement les configurations de toutes les classes
fusionnées, la configuration définie dans la classe enfante sera utilisée.
Cela signifie que si vous avez une configuration définie dans votre
AppController, et quelques configurations définies dans une sous-classe,
seule la configuration de la sous-classe sera utilisée.
Controller::httpCodes()
a été retirée, utilisez
Cake\Network\Response::httpCodes()
à la place.
Controller::disableCache()
a été retirée, utilisez
Cake\Network\Response::disableCache()
à la place.
Controller::flash()
a été retirée. Cette méthode était rarement utilisée
dans les vraies applications et ne n’avait plus aucun intérêt.
Controller::validate()
et Controller::validationErrors()
ont été
retirées. Il y avait d’autres méthodes laissées depuis l’époque de 1.x,
où les préoccupations des models + controllers étaient bien plus étroitement
liées.
Controller::loadModel()
charge maintenant les objets table.
La propriété Controller::$scaffold
a été retirée. Le scaffolding dynamique
a été retiré du cœur de CakePHP. Un plugin de scaffolding appelé CRUD se
trouve ici: https://github.com/FriendsOfCake/crud
La propriété Controller::$ext
a été retirée. Vous devez maintenant étendre
et surcharger la propriété View::$_ext
si vous voulez utiliser une
extension de fichier de view autre que celle par défaut.
La propriété Controller::$Components
a été retirée et remplacée par
_components
. Si vous avez besoin de charger les components à la volée,
vous devez utiliser $this->loadComponent()
dans votre controller.
La signature de Cake\Controller\Controller::redirect()
a été
changée en Controller::redirect(string|array $url, int $status = null)
.
Le 3ème argument $exit
a été retiré. La méthode ne peut plus envoyer
la réponse et sortir du script, à la place elle retourne une instance de
Response
avec les en-têtes appropriés définis.
Les propriétés magiques base
, webroot
, here
, data
,
action
et params
ont été retirées. Vous pouvez accéder à toutes ces
propriétés dans $this->request
à la place.
Les méthodes préfixées avec underscore des controllers comme _someMethod()
ne sont plus considérées comme des méthodes privées. Utilisez les bons mots
clés de visibilité à la place. Seules les méthodes publiques peuvent être
utilisées comme action de controller.
Scaffold retiré
Le scaffolding dynamique dans CakePHP a été retiré du cœur de CakePHP. Il
était peu fréquemment utilisé, et n’avait jamais pour intention d’être
utilisé en mode production. Un plugin de scaffolding appelé CRUD se trouve ici:
https://github.com/FriendsOfCake/crud
ComponentCollection remplacée
Cette classe a été remplacée en Cake\Controller\ComponentRegistry
.
Regardez la section sur Objets Registry pour plus
d’informations sur les fonctionnalités fournies par cette nouvelle classe. Vous
pouvez utiliser cake upgrade rename_collections
pour vous aider à mettre
à niveau votre code.
Component
La propriété _Collection
est maintenant _registry
. Elle contient
maintenant une instance de Cake\Controller\ComponentRegistry
.
Tous les components doivent maintenant utiliser la méthode config()
pour
récupérer/définir la configuration.
La configuration par défaut pour les components doit être définie dans la
propriété $_defaultConfig
. Cette propriété est automatiquement fusionnée
avec toute configuration fournie au constructeur.
Les options de configuration ne sont plus définies en propriété public.
La méthode Component::initialize()
n’est plus un listener d’event.
A la place, c’est un hook post-constructeur comme Table::initialize()
et
Controller::initialize()
. La nouvelle méthode
Component::beforeFilter()
est liée au même évènement que
Component::initialize()
. La méthode initialize devrait avoir la signature
suivante initialize(array $config)
.
Controller\Components
CookieComponent
Utilise Cake\Network\Request::cookie()
pour lire les données de
cookie, ceci facilite les tests, et permet de définir les cookies pour
ControllerTestCase.
Les Cookies chiffrés dans les versions précédentes de CakePHP utilisant la
méthode cipher()
sont maintenant illisible parce que Security::cipher()
a été retirée. Vous aurez besoin de re-chiffrer les cookies avec la méthode
rijndael()
ou aes()
avant mise à jour.
CookieComponent::type()
a été retirée et remplacée par la donnée de
configuration accessible avec config()
.
write()
ne prend plus de paramètres encryption
ou expires
. Ces
deux-là sont maintenant gérés avec des données de config. Consultez
CookieComponent pour plus d’informations.
Le chemin pour les cookies sont maintenant par défaut le chemin de l’app
plutôt que « / ».
AuthComponent
Default
est maintenant le hasher de mot de passe par défaut utilisé par
les classes d’authentification.
Si vous voulez continuer à utiliser le hashage SHA1 utilisé dans 2.x utilisez
'passwordHasher' => 'Weak'
dans votre configuration d’authenticator.
Un nouveau FallbackPasswordHasher
a été ajouté pour aider les utilisateurs
à migrer des vieux mots de passe d’un algorithm à un autre. Consultez la
documentation d’AuthComponent pour plus d’informations.
La classe BlowfishAuthenticate
a été retirée. Utilisez juste
FormAuthenticate
.
La classe BlowfishPasswordHasher
a été retirée. Utilisez
DefaultPasswordHasher
à la place.
La méthode loggedIn()
a été retirée. Utilisez user()
à la place.
Les options de configuration ne sont plus définies en propriété public.
Les méthodes allow()
et deny()
n’acceptent plus « var args ». Tous les
noms de méthode ont besoin d’être passés en premier argument, soit en chaîne,
soit en tableau de chaînes.
La méthode login()
a été retirée et remplacée par setUser()
.
Pour connecter un utilisateur, vous devez maintenant appeler identify()
qui retourne les informations d’utilisateur en cas de succès d’identification
et utiliser ensuite setUser()
pour sauvegarder les informations de session
pour la persistance au cours des différentes requêtes.
BaseAuthenticate::_password()
a été retirée. Utilisez PasswordHasher
à la place.
BaseAuthenticate::logout()
a été retirée.
AuthComponent
lance maintenant deux événements``Auth.afterIdentify`` et
Auth.logout
respectivement après qu’un utilisateur a été identifié et
avant qu’un utilisateur ne soit déconnecté. Vous pouvez définir une fonction
de callback pour ces événements en retournant un tableau de mapping depuis la
méthode implementedEvents()
de votre classe d’authentification.
Les classes liées à ACL ont été déplacées dans un plugin séparé. Les hashers
de mot de passe, l’Authentification et les fournisseurs d’Authorisation ont
été déplacés vers le namespace \Cake\Auth
. Vous devez aussi déplacer vos
providers et les hashers dans le namespace App\Auth
.
RequestHandlerComponent
Les méthodes suivantes ont été retirées du component RequestHandler::
isAjax()
, isFlash()
, isSSL()
, isPut()
, isPost()
,
isGet()
, isDelete()
. Utilisez la méthode
Cake\Network\Request::is()
à la place avec l’argument pertinent.
RequestHandler::setContent()
a été retirée, utilisez
Cake\Network\Response::type()
à la place.
RequestHandler::getReferer()
a été retirée, utilisez
Cake\Network\Request::referer()
à la place.
RequestHandler::getClientIP()
a été retirée, utilisez
Cake\Network\Request::clientIp()
à la place.
RequestHandler::mapType()
a été retirée, utilisez
Cake\Network\Response::mapType()
à la place.
Les options de configuration ne sont plus définies en propriété public.
SecurityComponent
Les méthodes suivantes et leurs propriétés liées ont été retirées du
component Security:
requirePost()
, requireGet()
, requirePut()
, requireDelete()
.
Utilisez Cake\Network\Request::onlyAllow()
à la place.
SecurityComponent::$disabledFields()
a été retirée, utilisez
SecurityComponent::$unlockedFields()
.
Les fonctionnalités liées au CSRF dans SecurityComponent ont été extraites et
déplacées dans un CsrfComponent séparé. Ceci vous permet d’utiliser une
protection CSRF sans avoir à utiliser la prévention de falsification de
formulaire.
Les options de Configuration ne sont plus définies comme des propriétés
publiques.
Les méthodes requireAuth()
et requireSecure()
n’acceptent plus
« var args ». Tous les noms de méthode ont besoin d’être passés en premier
argument, soit en chaîne, soit en tableau de chaînes.
Error
Les ExceptionRenderers personnalisées doivent maintenant soit retourner un objet
Cake\\Network\\Response
, soit une chaîne de caractère lors du rendu des
erreurs. Cela signifie que toutes les méthodes gérant des exceptions spécifiques
doivent retourner une réponse ou une valeur.
Model
La couche Model de 2.x a été entièrement réécrite et remplacée. Vous devriez
regarder le Guide de Migration du Nouvel ORM
pour plus d’informations sur la façon d’utiliser le nouvel ORM.
La classe Model
a été retirée.
La classe BehaviorCollection
a été retirée.
La classe DboSource
a été retirée.
La classe Datasource
a été retirée.
Les différentes sources de données des classes ont été retirées.
ConnectionManager
ConnectionManager a été déplacée dans le namespace Cake\\Datasource
.
ConnectionManager a eu les méthodes suivantes retirées:
sourceList
getSourceName
loadDataSource
enumConnectionObjects
config()
a été ajoutée et est
maintenant la seule façon de configurer les connections.
get()
a été ajoutée. Elle
remplace getDataSource()
.
configured()
a été ajoutée.
Celle-ci avec config()
remplace sourceList()
&
enumConnectionObjects()
avec une API plus standard et cohérente.
ConnectionManager::create()
a été retirée.
Il peut être remplacé par config($name, $config)
et get($name)
.
TreeBehavior
TreeBehavior a été complètement réécrit pour utiliser le nouvel ORM. Bien qu’il
fonctionne de la même manière que dans 2.x, certaines méthodes ont été renommées
ou retirées:
TreeBehavior::children()
est maintenant un finder personnalisé find('children')
.
TreeBehavior::generateTreeList()
est maintenant un finder personnalisé find('treeList')
.
TreeBehavior::getParentNode()
a été retirée.
TreeBehavior::getPath()
est maintenant un finder personnalisé find('path')
.
TreeBehavior::reorder()
a été retirée.
TreeBehavior::verify()
a été retirée.
TestSuite
TestCase
Les méthodes d’assertion suivantes ont été retirées puisque cela faisait
longtemps qu’elles étaient dépréciées et remplacées par leurs nouvelles
homologues de PHPUnit:
assertEqual()
en faveur de assertEquals()
assertNotEqual()
en faveur de assertNotEquals()
assertIdentical()
en faveur de assertSame()
assertNotIdentical()
en faveur de assertNotSame()
assertPattern()
en faveur de assertRegExp()
assertNoPattern()
en faveur de assertNotRegExp()
assertReference()
if favor of assertSame()
assertIsA()
en faveur de assertInstanceOf()
Notez que l’ordre des paramètres de certaines méthodes a été changé, par ex:
assertEqual($is, $expected)
devra maintenant être
assertEquals($expected, $is)
.
Les méthodes d’assertion suivantes ont été dépréciées et seront retirées dans
le futur:
Les deux méthodes de remplacement changent aussi l’ordre des arguments pour
avoir une méthode d’API assert cohérente avec $expected
en premier argument.
Les méthodes d’assertion suivantes ont été ajoutées:
View
Les Themes sont maintenant purement des Plugins
Avoir des themes et des plugins comme façon de créer des composants
d’applications modulaires nous semblait limité et cela apportait de la
confusion. Dans CakePHP 3.0, les themes ne se trouvent plus dans
l’application. A la place, ce sont des plugins autonomes. Cela résout certains
problèmes liés aux themes:
Vous ne pouviez pas mettre les themes dans les plugins.
Les Themes ne pouvaient pas fournir de helpers, ou de classes de vue
personnalisée.
Ces deux problèmes sont résolus en convertissant les themes en plugins.
Les Dossiers de View Renommés
Les dossiers contenant les fichiers de vue vont maintenant dans src/Template
à la place de src/View.
Ceci a été fait pour séparer les fichiers de vue des fichiers contenant des
classes php (par ex les classes Helpers et View).
Les dossiers de View suivants ont été renommés pour éviter les collisions
avec les noms de controller:
Layouts
est maintenant Layout
Elements
est maintenant Element
Errors
est maintenant Error
Emails
est maintenant Email
(idem pour Email
dans Layout
)
HelperCollection remplacée
Cette classe a été renommée en Cake\View\HelperRegistry
.
Regardez la section sur Objets Registry pour plus
d’informations sur les fonctionnalités fournies par la nouvelle classe.
Vous pouvez utiliser cake upgrade rename_collections
pour vous aider
à mettre à niveau votre code.
View Class
La clé plugin
a été retirée de l’argument $options
de
Cake\View\View::element()
. Spécifiez le nom de l’element
comme SomePlugin.element_name
à la place.
View::getVar()
a été retirée, utilisez Cake\View\View::get()
à la place.
View::$ext
a été retirée et à la place une propriété protected
View::$_ext
a été ajoutée.
View::addScript()
a été retirée. Utilisez Utiliser les Blocks de Vues à la place.
Les propriétés magiques base
, webroot
, here
, data
,
action
et params
ont été retirées. Vous pouvez accéder à toutes ces
propriétés dans $this->request
à la place.
View::start()
n’ajoute plus à un block existant. A la place, il va
écraser le contenu du block quand end est appelé. Si vous avez besoin de
combiner les contenus de block, vous devrez récupérer le contenu du block lors
de l’appel de start une deuxième fois ou utiliser le mode de capture
append()
.
View::prepend()
n’a plus de mode de capture.
View::startIfEmpty()
a été retirée. maintenant que start() écrase toujours
startIfEmpty n’a plus d’utilité.
La propriété View::$Helpers
a été retirée et remplacée par
_helpers
. Si vous avez besoin de charger les helpers à la volée, vous
devrez utiliser $this->addHelper()
dans vos fichiers de view.
View
lancera des Cake\View\Exception\MissingTemplateException
lorsque
des templates sont au lieu de MissingViewException
.
JsonView
Par défaut les données JSON vont maintenant avoir des entités HTML encodées.
Ceci empêche les problèmes possible de XSS quand le contenu de la view
JSON est intégrée dans les fichiers HTML.
Cake\View\JsonView
supporte maintenant la variable de view
_jsonOptions
. Ceci vous permet de configurer le masque utilisé lors de la
génération de JSON.
View\Helper
La propriété $settings
est maintenant appelée $_config
et peut être
accessible via la méthode config()
.
Les options de configuration ne sont plus définies en propriété public.
Helper::clean()
a été retirée. Il n’était jamais assez
robuste pour complètement empêcher XSS. A la place, vous devez échapper
le contenu avec h
ou utiliser une librairie dédiée comme
HTMLPurifier.
Helper::output()
a été retirée. Cette méthode a été
dépréciée dans 2.x.
Les méthodes Helper::webroot()
, Helper::url()
, Helper::assetUrl()
,
Helper::assetTimestamp()
ont été déplacées vers le nouveau
helper Cake\View\Helper\UrlHelper
. Helper::url()
est
maintenant disponible dans Cake\View\Helper\UrlHelper::build()
.
Les accesseurs magiques pour les propriétés dépréciées ont été retirés. Les
propriétés suivantes ont maintenant besoin d’être accédées à partir de l’objet
request:
base
here
webroot
data
action
params
Helper
Les méthodes suivantes de Helper ont été retirées:
Ces méthodes étaient des parties uniquement utilisées par FormHelper, et
faisaient partie des continuelles fonctionnalités des champs qui devenaient
problématiques au fil du temps. FormHelper ne s’appuie plus sur ces méthodes
et leur complexité n’est plus nécessaire.
Les méthodes suivantes ont été retirées:
Ces méthodes se trouvent dans la classe StringTemplate
que les helpers
utilisent fréquemment. Regardez StringTemplateTrait
pour intégrer les
templates de chaîne dans vos propres helpers.
HtmlHelper
HtmlHelper::useTag()
a été retirée, utilisez tag()
à la place.
HtmlHelper::loadConfig()
a été retirée. La personnalisation des tags peut
être faîte en utilisant templates()
ou la configuration templates
.
Le deuxième paramètre $options
pour HtmlHelper::css()
doit maintenant
toujours être un tableau comme c’est écrit dans la documentation.
Le premier paramètre $data
pour HtmlHelper::style()
doit maintenant
toujours être un tableau comme c’est écrit dans la documentation.
Le paramètre inline
a été retiré des méthodes meta(), css(), script(),
scriptBlock(). Vous devrez utiliser l’option block
à la place. Définir
block => true
va émuler le comportement précédent.
HtmlHelper::meta()
nécessite maintenant que $type
soit une chaîne de
caractère. Les options supplémentaires peuvent en outre être passées dans
$options
.
HtmlHelper::nestedList()
nécessite maintenant que $options
soit un
tableau. Le quatrième argument pour le niveau de tag a été retiré et il a été
inclus dans le tableau $options
.
L’argument $confirmMessage
de
Cake\View\Helper\HtmlHelper::link()
a été retiré. Vous devez
maintenant utiliser la clé confirm
dans $options
pour spécifier
le message.
PaginatorHelper
link()
a été retirée. Il n’était plus utilisé par le helper en interne.
Il était peu utilisé dans le monde des utilisateurs de code, et ne
correspondait plus aux objectifs du helper.
next()
n’a plus les options “class”, ou “tag”. Il n’a plus d’arguments
désactivés. A la place, les templates sont utilisés.
prev()
n’a plus les options “class”, ou “tag”. Il n’a plus d’arguments
désactivés. A la place, les templates sont utilisés.
first()
n’a plus les options “after”, “ellipsis”, “separator”, “class”,
ou “tag”.
last()
n’a plus les options “after”, “ellipsis”, “separator”, “class”, ou
“tag”.
numbers()
n’a plus les options “separator”, “tag”, “currentTag”,
“currentClass”, “class”, “tag”, “ellipsis”. Ces options sont maintenant
accessibles à travers des templates. Le paramètre $options
doit maintenant
être un tableau.
Les placeholders de style %page%
ont été retirés de
Cake\View\Helper\PaginatorHelper::counter()
.
Utilisez les placeholders de style {{page}}
à la place.
url()
a été renommée en generateUrl()
pour éviter des clashes de
déclaration de méthode avec Helper::url()
.
Par défaut, tous les liens et le texte inactif sont entourés d’elements <li>
.
Ceci aide à écrire plus facilement du CSS, et améliore la compatibilité avec
des frameworks populaires.
A la place de ces diverses options dans chaque méthode, vous devez utiliser
la fonctionnalité des templates. Regardez les informations de la
documentation Templates de PaginatorHelper sur la façon d’utiliser les templates.
TimeHelper
TimeHelper::__set()
, TimeHelper::__get()
, et
TimeHelper::__isset()
ont été retirées. Celles-ci étaient des
méthodes magiques pour des attributs dépréciés.
TimeHelper::serverOffset()
a été retirée. Elle entraînait de mauvaises
utilisations mathématiques de time.
TimeHelper::niceShort()
a été retirée.
CacheHelper Retiré
CacheHelper a été retiré. La fonctionnalité de cache quelle fournissait n’était
pas standard, limitée et incompatible avec les mises en page non-HTML et les
vues de données. Ces limitations signifiaient qu’une réécriture complète était
nécessaire. Edge Side Includes est devenu un moyen standard d’implémenter les
fonctionnalités que CacheHelper fournissait. Cependant, implémenter Edge Side
Includes en PHP présente un
grand nombre de limitations. Au lieu de construire une solution de qualité
inférieure, nous recommandons aux développeurs ayant besoin d’un cache global
d’utiliser Varnish ou
Squid à la place.
I18n
Le sous-système I18n a été complètement réécrit. En général, vous pouvez vous
attendre au même comportement que dans les versions précédentes, spécialement
si vous utilisez la famille de fonctions __()
.
En interne, la classe I18n
utilise Aura\Intl
, et les méthodes
appropriées sont exposées pour accéder aux fonctionnalités spécifiques de cette
librairie. Pour cette raison, la plupart des méthodes dans I18n
a été
retirée ou renommée.
Grâce à l’utilisation de ext/intl
, la classe L10n a été complètement
retirée. Elle fournissait des données dépassées et incomplètes en comparaison
avec les données disponibles dans la classe Locale
de PHP.
La langue de l’application par défaut ne sera plus changée automatiquement
par la langue du navigateur ou en ayant la valeur Config.language
définie
dans la session du navigateur. Vous pouvez cependant utiliser un filtre
du dispatcher pour récupérer automatiquement la langue depuis l’en-tête
Accept-Language
envoyé dans par le navigateur:
// Dans config/bootstrap.php
DispatcherFactory::addFilter('LocaleSelector');
Il n’y a pas de remplacement intégré en ce qui concerne la sélection de la
langue en définissant une valeur dans la session de l’utilisateur.
La fonction de formatage par défaut pour les messages traduits n’est plus
sprintf
, mais la classe MessageFormatter
la plus avancée et aux
fonctionnalités riches.
En général, vous pouvez réécrire les placeholders dans les messages comme suit:
// Avant:
__('Today is a %s day in %s', 'Sunny', 'Spain');
// Après:
__('Today is a {0} day in {1}', 'Sunny', 'Spain');
Vous pouvez éviter la réécriture de vos messages en utilisant l’ancien
formateur sprintf
:
I18n::defaultFormatter('sprintf');
De plus, la valeur Config.language
a été retirée et elle ne peut plus être
utilisée pour contrôler la langue courante de l’application. A la place, vous
pouvez utiliser la classe I18n
:
// Avant
Configure::write('Config.language', 'fr_FR');
// Maintenant
I18n::setLocale('en_US');
Les méthodes ci-dessous ont été déplacées:
De Cake\I18n\Multibyte::utf8()
vers Cake\Utility\Text::utf8()
De Cake\I18n\Multibyte::ascii()
vers Cake\Utility\Text::ascii()
De Cake\I18n\Multibyte::checkMultibyte()
vers
Cake\Utility\Text::isMultibyte()
Puisque l’extension mbstring est maintenant nécessaire, la classe
Multibyte
a été retirée.
Les messages d’Error dans CakePHP ne passent plus à travers les fonctions de
I18n. Ceci a été fait pour simplifier les entrailles de CakePHP et réduire
la charge. Les messages auxquels font face les développeurs sont rarement,
voire jamais traduits donc la charge supplémentaire n’apporte que peu de
bénéfices.
Testing
TestShell
a été retiré. CakePHP, le squelette d’application et les plugins
nouvellement créés utilisent tous phpunit
pour exécuter les tests.
L’exécuteur via le navigateur (webroot/test.php) a été retiré. L’adoption
de CLI a beaucoup augmenté depuis les premières versions de 2.x. De plus,
les exécuteurs CLI ont une meilleure intégration avec les outils des IDE et
autres outils automatisés.
Si vous cherchez un moyen de lancer les tests à partir d’un navigateur, vous
devriez allez voir
VisualPHPUnit. Il dispose de
plusieurs fonctionnalités supplémentaires par rapport au vieil exécuteur via
le navigateur.
ControllerTestCase
est dépréciée et sera supprimée de CAKEPHP 3.0.0.
Vous devez utiliser les nouvelles fonctionnalités de
Test d’Intégrations des Controllers à la place.
Les fixtures doivent maintenant être référencées sous leur forme plurielle:
// Au lieu de
$fixtures = ['app.article'];
// Vous devrez utiliser
$fixtures = ['app.articles'];
Utility
Classe Set Retirée
La classe Set a été retirée, vous devriez maintenant utiliser la classe Hash
à la place.
Folder & File
Les classes folder et file ont été renommées:
Inflector
la valeur par défaut pour l’argument $replacement
de la méthode
Cake\Utility\Inflector::slug()
a été modifiée de underscore
(_
) au tiret (-
). utiliser des tirets pour séparer les mots dans les
url est le choix le plus courant et également celui recommandé par Google.
Les translitérations pour Cake\Utility\Inflector::slug()
ont
changé. Si vous utilisez des translitérations personnalisées, vous devrez
mettre à jour votre code. A la place des expressions régulières, les
translitérations utilisent le remplacement par chaîne simple. Cela a donné
des améliorations de performances significatives:
// Au lieu de
Inflector::rules('transliteration', [
'/ä|æ/' => 'ae',
'/å/' => 'aa'
]);
// Vous devrez utiliser
Inflector::rules('transliteration', [
'ä' => 'ae',
'æ' => 'ae',
'å' => 'aa'
]);
Des ensembles de règles non inflectées et irrégulières séparés pour la
pluralization et la singularization ont été retirés. Plutôt que d’avoir
une liste commune pour chacun. Quand on utilise
Cake\Utility\Inflector::rules()
avec un type “singular”
et “plural” vous ne pouvez plus utiliser les clés comme “uninflected”,
“irregular” dans le tableau d’argument $rules
.
Vous pouvez ajouter / écraser la liste de règles non inflectées et
irrégulières en utilisant Cake\Utility\Inflector::rules()
en
utilisant les valeurs “non inflectées” et “irrégulières” pour un argument
$type
.
Security
Security::cipher()
a été retirée. Elle est peu sûre et favorise de
mauvaises pratiques en cryptographie. Vous devrez utiliser
Security::encrypt()
à la place.
La valeur de configuration Security.cipherSeed
n’est plus nécessaire.
Avec le retrait de Security::cipher()
elle n’est plus utilisée.
La rétrocompatibilité de Cake\Utility\Security::rijndael()
pour
les valeurs cryptées avant CakePHP 2.3.1 a été retirée. Vous devrez rechiffrer
les valeurs en utilisant Security::encrypt()
et une version plus récente
de CakePHP 2.x avant migration.
La capacité de générer blowfish a été retirée. Vous ne pouvez plus utiliser le
type « blowfish » pour Security::hash()
. Vous devrez utiliser uniquement
le password_hash() de PHP et password_verify() pour générer et vérifier
les hashs de blowfish. La librairie compatible
ircmaxell/password-compat
qui est installée avec CakePHP fournit ces fonctions pour PHP < 5.5.
OpenSSL est maintenant utilisé à la place de mcrypt pour le
chiffrement/déchiffrement des données. Ce changement fournit de meilleurs
performances et une avancée dans la supression du support de mcrypt.
Security::rijndael()
est dépréciée et elle est seulement disponible quand
vous utilisez mcrypt.
Avertissement
Les données chiffrées avec Security::encrypt()
dans les versions
précédentes sont compatibles avec l’implémentation de openssl. Vous devez
définir l’implémentation pour mcrypt lors de la mise
à jour.
Time
CakeTime
a été renommée en Cake\I18n\Time
.
Time::__set()
et - Time::__get()
ont été retirées. Celles-ci étaient
des méthodes magiques setter/getter pour une rétrocompatibilité.
CakeTime::serverOffset()
a été retirée. Il incitait à des pratiques de
correspondance de time incorrects.
CakeTime::niceShort()
a été retirée.
CakeTime::convert()
a été retirée.
CakeTime::convertSpecifiers()
a été retirée.
CakeTime::dayAsSql()
a été retirée.
CakeTime::daysAsSql()
a été retirée.
CakeTime::fromString()
a été retirée.
CakeTime::gmt()
a été retirée.
CakeTime::toATOM()
a été renommée en toAtomString
.
CakeTime::toRSS()
a été renommée en toRssString
.
CakeTime::toUnix()
a été renommée en toUnixString
.
CakeTime::wasYesterday()
a été renommée en isYesterday
pour
correspondre aux autres noms de méthode.
CakeTime::format()
N’utilise plus les chaînes de format sprintf`, vous
pouvez utiliser ``i18nFormat
à la place.
Time::timeAgoInWords()
a maintenant besoin que $options
soit
un tableau.
Time n’est plus une collection de méthodes statiques, il étend DateTime
pour
hériter de ses méthodes et ajoute la localisation des fonctions de formatage
avec l’aide de l’extension intl
.
En général, les expressions ressemblent à ceci:
CakeTime::aMethod($date);
Peut être migré en réécrivant ceci en:
(new Time($date))->aMethod();
Number
Number a été réécrite pour utiliser en interne la classe NumberFormatter
.
CakeNumber
a été renommée en Cake\I18n\Number
.
Number::format()
nécessite maintenant que $options
soit un
tableau.
Number::addFormat()
a été retirée.
Number::fromReadableSize()
a été déplacée
vers Cake\Utility\Text:parseFileSize()
.
Xml
Xml::build()
a maintenant besoin que $options
soit un
tableau.
Xml::build()
n’accepte plus d’URL. Si vous avez besoin de créer un
document XML à partir d’une URL, utilisez
Http\Client.