Nouvelles caractéristiques dans CakePHP 2.0

Model

Le processus de construction du modèle a été allegé. Les associations des Modèles sont maintenant en lazy loaded, les applications avec beaucoup de modèles et d’associations vont voir une grande réduction de temps dans le processus de bootstrap.

Les modèles ne requièrent maintenant plus de connexion à la base de données dans le processus de construction. La base de données ne sera accédée pour la première fois seulement quand une opération de recherche est délivrée ou une information pour une des colonnes est requise.

View

View::$output

View n’aura pas toujours le dernier rendu de contenu (view ou layout) accessible avec $this->output. Dans les helpers, vous pouvez utiliser $this->_View->output. Modifier cette propriété changera le contenu qui sort de la vue rendue.

Helpers

HtmlHelper

  • getCrumbList() Créé un fil d’ariane de liens entourés d’éléments <li>.

  • loadConfig() a été déplacé de Helper vers la classe HtmlHelper. Cette méthode utilise maintenant les nouvelles classes de lecture (voir 2.0 Configure) pour charger votre fichier de config. En option vous pouvez passer le chemin en deuxième paramètre (app/Config par défaut). Pour simplifier, vous pouvez définir le fichier de configuration (et le lecteur) dans Controller::$helpers (exemple ci-dessous) pour charger le constructeur du helper. Dans le fichier de configuration, vous pouvez définir les clés ci-dessous:

  • tags Doit être un tableau avec une valeur clé;

  • minimizedAttributes Doit être une liste;

  • docTypes Doit être un tableau avec une valeur clé;

  • attributeFormat Doit être une chaîne de caractère;

  • minimizedAttributeFormat Doit être une chaîne de caractère.

Exemple sur la façon de définir le fichier de configuration sur les contrôleurs:

public $helpers = array(
    'Html' => array(
        'configFile' => array('config_file', 'php') // Option une: un tableau avec le nom du fichier et le nom de lecture
        'configFile' => 'config_file' // Option deux: une chaîne de caractère avec le nom du fichier. Le PhpReader sera utilisé
    )
);

FormHelper

  • FormHelper supporte maintenant tout type d’entrée HTML5 et tout type d’entrée personnalisé. Utilisez simplement le type d’entrée que vous souhaitez en méthode sur le helper. Par exemple range() créera une entrée avec type = range.

  • postLink() et postButton() Crée un lien/bouton permettant d’accéder à certaine pasge utilisant la méthode HTTP POST. Avec ceci dans votre controller vous pouvez empêcher certaines actions, comme delete, d’être accédées par la méthode GET.

  • select() avec multiple = checkbox, traite maintenant l’attribut 'id' en préfixe pour toutes les options générées.

Libs

CakeRequest

CakeRequest est une nouvelle classe introduite dans 2.0. Elle encapsule les méthodes d’introspection de requêtes utilisées couramment et remplace le tableau params avec un objet plus utile. Lisez en plus sur CakeRequest.

CakeResponse

CakeResponse est une nouvelle classe introduite dans 2.0. Elle encapsule les méthodes et propriétés utilisées couramment dans la réponse HTTP que votre application génère. Elle consolide plusieurs caractéristiques dans CakePHP. Lisez en plus sur CakeResponse.

CakeSession, SessionComponent

CakeSession et le SessionComponent ont connu un nombre de changements, regardez la section session pour plus d’informations.

Router

Routes peuvent retourner des URLs complètes

Les Objets Route peuvent maintenant retourner des URLs complètes, et Router ne les modifiera plus au-delà de l’ajout de la chaîne de requête et des éléments de fragments. Par exemple, ceci pouvait être utilisé pour créer des routes pour la gestion de sous-domaines, ou pour l’activation de flags https/http. Un exemple de classe de route qui supporte les sous-domaines serait:

class SubdomainRoute extends CakeRoute {

    public function match ($params) {
        $subdomain = isset($params['subdomain']) ? $params['subdomain'] : null;
        unset($params['subdomain']);
        $path = parent::match($params);
        if ($subdomain) {
            $path = 'http://' . $subdomain . '.localhost' . $path;
        }
        return $path;
    }
}

Quand vous créez des liens, vous pouvez faire ce qui suit pour faire pointer les liens vers d’autres sous-domaines.

echo $this->Html->link(
    'Autre domaine',
     array('subdomain' => 'test', 'controller' => 'posts', 'action' => 'add')
);

Ce qui est ci-dessus créera un lien avec l’url http://test.localhost/posts/add.

Xml

Xml a connu un certain nombre de changements. Lisez en plus sur la classe Xml.

Nouvelles caractéristiques de Lib

Configure readers

Configure peut maintenant être configuré pour le chargement de fichiers à partir d’une variété de sources et de formats. La section Configuration contient plus d’informations sur les changements faits à configure.

Configure::read() sans autre argument vous permet de lire toutes les valeurs de configure, plutôt que uniquement la valeur du debug.

Error et gestion des exceptions

CakePHP 2.0 a reconstruit la gestion des Exceptions et des Gestion des Erreurs, pour être plus flexible et donner plus de puissance aux développeurs.

String::wrap()

String::wrap() a été ajouté pour faciliter les formatages de largeur fixe des textes. Il est utilisé dans les Shells quand vous utilisez Shell::wrapText().

debug()

debug() ne sort plus de HTML dans la console. A la place, elle donne des sorties comme ce qui suit:

########## DEBUG ##########
Array
(
    [0] => test
)
###########################

Ceci devrait améliorer la lecture de debug() dans les lignes de commande.

Components

Components reçoit un traitement identique aux helpers et aux behaviors, Component est maintenant la classe de base pour les components. Lisez en plus sur les changements sur les components.

RequestHandler

RequestHandler a été fortement remaniée du fait de l’introduction de CakeRequest. Ces changements permettent à certaines nouvelles fonctionnalités d’être aussi introduites.

Parsing automatique d’Acceptation des headers

Si un client envoie un unique mime type Accept qui correspond à l’une des extensions activées dans :php:class`Router`, RequestHandler le traitera de la même façon qu’une extension. Cela étendra le support de CakePHP pour les terminaux de type REST. Pour utiliser cette fonctionnalité, commencez par activer les extensions dans app/Config/routes.php

Router::parseExtensions('json', 'xml');

Une fois que vous avez créé les layouts et les vues pour vos extensions, vous pourrez visiter une url comme posts/view/1 et envoyer Accept: application/json dans les headers pour recevoir la version JSON de cette URL.

CookieComponent

CookieComponent supporte maintenant seulement les cookies HTTP. Vous pouvez les activer en utilisant $this->Cookie->httpOnly = true;. Avoir seulement les cookies HTTP les rendra inaccessible à partir du navigateur.

Security Component CSRF separation

CakePHP a une protection CSRF depuis 1.2. Pour 2.0, le CSRF existant a un nouveau mode plus paranoïaque, et est sa caractéristique propre autonome. Dans le passé, les fonctionnalités CSRF étaient couplées avec des gardes-fous de tampering de formulaires. Les développeurs désactivent souvent validatePost pour faire des formulaires dynamiques, en désactivant la protection CSRF en même temps. Pour 2.0, la vérification CSRF a été séparée du tampering des formulaires vous donnant plus de contrôle.

Pour plus d’informations, regardez protection CSRF

Controller

Les Controllers ont maintenant accès aux objets request et response. Vous pouvez en lire plus sur ces objets sur leurs pages spécifiques.

Console

La console pour CakePHP 2.0 a été preque entièrement reconstruite. De nombreuses nouvelles caractéristiques ainsi que quelques changements incompatibles avec antérieurement. Lisez en plus sur les changements sur la console.

Pagination

Pagination fournit maintenant un maxLimit par défaut à 100 pour la pagination.

Cette limite peut maintenant être dépassée avec la variable paginate dans le Controller.

$this->paginate = array('maxLimit' => 1000);

Cette valeur par défaut est fournie pour empêcher l’utilisateur de manipuler les URL provoquant une pression excessive sur la base de données pour les requêtes suivantes, où un utilisateur modifierait le paramètre “limit” pour une nombre très important.

Mettre un Alias

Vous pouvez maintenant mettre un alias les helpers, les components et les behaviors pour utiliser votre classe plutôt qu’une autre. Cela signifie que vous pouvez très facilement faire un helper MyHtml et n’avez pas besoin de remplacer chaque instance de $this->Html dans vos vues. Pour le faire, passez la clé “className” tout au long de votre classe, comme vous feriez avec les modèles.

public $helpers = array(
    'Html' => array(
        'className' => 'MyHtml'
    )
);

De même, vous pouvez mettre en alias les components pour l’utilisation dans vos controllers.

public $components = array(
    'Email' => array(
        'className' => 'QueueEmailer'
    )
);

Appeller le component Email appelle le component QueueEmailer à la place. Finalement, vous pouvez aussi mettre en alias les behaviors.

public $actsAs = array(
    'Containable' => array(
        'className' => 'SuperContainable'
    )
);

Du fait de la façon dont 2.0 utilise les collections et les partage dans toute l’application, toute classe que vous mettez en alias sera utilisée dans toute votre application. Quelque soit le moment où votre application essaie d’accéder à l’alias, elle aura accès à votre classe. Par exemple, quand vous mettez en alias le helper Html dans l’exemple ci-dessus, tous les helpers qui utilisent le helper Html ou les éléments qui chargent le helper Html, utiliseront MyHtml à la place.

ConnectionManager

Une nouvelle méthode ConnectionManager::drop() a été ajoutée pour permettre de retirer les connexions lors de l’éxecution.