@SurferIX
Marrant, y a 30 secondes j'écrivais ma réponse à la question de base, entre temps tu rédiges ton argumentaire pour le couple Python/Django.
Le truc (et c'est là que c'est terrible), c'est que Cake fait mieux (au pire aussi bien) sur quasiment tous les points que tu viens d'évoquer.
Si je les reprends un par un :
L'avantage des modèles extrèmement rapide à écrire : Cake fait la même chose sauf... que tu n'as même pas à prendre la peine d'écrire une seule ligne. En effet, Cake se sert directement des types en base pour déterminer le type des attributs dans classes : Un datetime, sera un objet de type Time (qui hérite de DateTime avec en plus la gestion de l'i18n), un tinyint sur un seul caractère (sous mysql) sera un booléen, un varchar, un champ text etc...
En gros, tu créer ta table "personnes" en base et tu pourras te servir d'un entité "Personne" dans ton code avec tous les attributs prédéterminés par leur type en base sans que tu n'ai à écrire la moindre ligne de code et donc de créer la moindre classe.
Mieux encore, il détecte les clefs étrangères en base en fonction de leur écriture : si ta table "articles" possède un champ "journal_id", Cake comprend que chaque article est lié à un et un seul journal qui sera représenté par une classe "Journal" dans ton code.
Le deuxième avantage, gestion des migrations : là comme tu l'auras compris je pense, Cake fonctionne uniquement dans l'autre sens, c'est à dire, je créé la base et ensuite je génère le code. C'est idem, en deux lignes de commandes on génère l'ensemble des modèles de l'application (et un CRUD entier sur toutes les cmême si on veut).
Le troisième avantage, la gestion des utilisateurs : très simple aussi dans Cake, quelques lignes suffisent, de base possibilité d'utiliser Basic et Digest en plus du classique formulaire d'authentification.
Quatrième avantage, les vues génériques : ça marche un peu différement sous Cake mais tout aussi bien avec toujours aussi peu de ligne que dans ce cas là. Il faudrait passer ce qu'on appelle un helper qui sert à 'générer' des bouts de vues.
Cinquième avantage, le templating : sous Cake, c'est du templating php à la base comme ça au moins chacun fait ce qu'il veut et c'est pas plus mal (on peut intégrer twig très facilement), perso je préfère rester sur du templating php, surtout depuis que l' balise "<?=" est toujours dispo maintenant et ne dépend plus de l'environnement.
Sixième point, doc en français : idem, à quelques rares exceptions près.
Septième point l'internationalisation : point fort de Cake pour le coup, utilise la méthode gettext et intl, extension native de php lui-même (et ça, c'est quand même vachement bien). Voici un exemple de fichier de routing commenté qui gère l'internationalisation des urls :
L'internationalisation de champs en bdd est aussi prévue et très facile à exploiter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 <?php Router::defaultRouteClass('Route'); $scopes = function ($routes) { /** Parse les extensions json, c-a-d, dans une url qui se termine par .json, un résultat json sera renvoyé (et non un fichier html) */ $routes->extensions(['json']); /** Je dirige vers ma page d'accueil **/ $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']); /** Gestion de toutes les pages statiques, qui ne passent pas par un controlleur **/ $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']); /** Indique que je veux utiliser les ""dashed_routes"" **/ $routes->fallbacks('DashedRoute'); }; /** Gestion du multilingue**// $languages = Configure::read('Language.list'); $languageDefault = Configure::read('Language.default'); unset($languages[$languageDefault]); /** On indique que si c'est la langue par défaut, elle n'apparait pas dans l'url **/ Router::scope("/", ['lang' => $languageDefault], $scopes); /** Pour chaque langue (sauf celle par défaut), j'indique que le langue sera indiquée au début de l'url comme telle : /es, /en... **/ foreach ($languages as $lang => $intl) { Router::scope("/$lang", ['lang' => $lang], $scopes); } /** Le parmètre de la langue doit être garder lors de la création des liens **/ Router::addUrlFilter(function ($params, $request) { if (empty($params['lang'])) { $params['lang'] = $request->param('lang'); } return $params; }); Plugin::routes();
8ème point, les arguments dynamiques : pas trop compris, ça m'a l'air très complexe au lieu d'être simple. Pourquoi ne pas passer par la query string ? TU peux donner un exemple d'url qui utilise les arguments dynamiques, je visualise pas trop ?
9ème point, l'interface admin : Comme je l'ai déjà dit, Cake permet de générer entièrement un CRUD en fonction de la base de données. Ce qu'il est recommandé de faire c'est de générer les modèles à partie de la base, de repasser sur ces modèles pour corriger les éventuelles modifications, rajouter ce qui ne peut être deviner, puis générer ensuite les controlleurs et vues à partir de ces modèles.
Partager