Kohana est un framework PHP 5 qui utilise le modèle architectural Model View Controller (MVC). Vous devez choisir Kohana pour plusieurs raisons, mais les principales sont la sécurité, l’apesanteur et la simplicité. Dans ce tutoriel, je présenterai ses principales fonctionnalités et, avec une démonstration simple, je vous montrerai combien de temps Kohana peut potentiellement vous faire gagner du temps..
Kohana est un framework PHP5 qui utilise le motif architectural Model View Controller. MVC conserve la logique de l'application
séparé de la présentation. Cela nous permet de créer un code plus propre et de gagner du temps pour la recherche de bogues..
Peu familier avec ce modèle:
Kohana était à l'origine un fork de CodeIgniter (CI), un produit open source d'EllisLab. Il existe de nombreuses similitudes entre CI et Kohana, mais tout le code est soit nouveau, soit complètement réécrit. Comme vous pouvez le lire sur le site Web officiel de Kohana, les principales caractéristiques sont les suivantes:
Commençons. Visitez le site Web officiel de Kohana http://kohanaphp.com et cliquez sur la case verte dans le coin droit pour télécharger la dernière version. Toutes les bibliothèques, aides et vues Kohana sont inclus dans le package de téléchargement par défaut, mais vous pouvez sélectionner des modules, des outils de fournisseur et des langues supplémentaires si vous le souhaitez. Pour les besoins de ce tutoriel, le package par défaut peut être suffisant. Cliquez sur "Télécharger Kohana!" pour commencer le téléchargement.
Une fois que vous avez fini de le télécharger:
$ config ['site_domain'] = 'localhost / kohana';
Kohana fonctionnera dans presque tous les environnements avec une configuration minimale. Il existe quelques exigences minimales concernant le serveur:
Il y a aussi des extensions requises.
Si votre installation se termine avec succès, vous serez redirigé vers cette page de test:
Si l'un des tests échoue, vous devez le corriger avant de poursuivre..
Si tous les tests ont réussi, accédez au répertoire Kohana et supprimez ou renommez le script install.php. Actualisez et vous verrez une page d'accueil comme celle-ci:
Kohana est prêt à partir. Aucune autre configuration n'est nécessaire. Ce cadre est incroyable. N'est-ce pas? Passons en revue du code. Suis moi.
Les didacticiels de programmation canoniques commencent par l'exemple "Hello world". Je pense plutôt qu'une simple application peut vous donner une idée claire du fonctionnement du framework. Nous allons donc créer un gestionnaire de collection de CD - juste pour une démonstration amusante. Avant de commencer à coder, une brève introduction au système de fichiers Kohana est nécessaire..
Notre application sera placée dans le application dossier. Ce dossier contient plusieurs sous-dossiers, mais nous avons besoin des éléments suivants pour notre projet:
Les sous-dossiers restants ne sont pas requis pour ce tutoriel, je vous invite donc à en savoir plus sur le site Web de Kohana..
le système dossier héberge le noyau Kohana et les outils Kohana tels que les bibliothèques, les helpers et les fichiers de configuration prédéfinis. Dans ce projet, nous utiliserons des bibliothèques et des aides - de bons outils pour accélérer votre travail..
le les atouts dossier n'est pas un dossier Kohana prédéfini. Je l'ai créé pour des fichiers multimédias tels que CSS, JS et des images. Je vais vous montrer comment inclure ces fichiers dans le projet..
le modules dossier est l'endroit où placer les collections réutilisables de fichiers associés qui, ensemble, ajoutent une fonctionnalité particulière à une application. Le module d’authentification, fourni par l’équipe Kohana, est un exemple de module.
Ceci est une très brève introduction au système de fichiers Kohana, mais cela suffit pour les besoins de ce tutoriel. Je ne veux pas vous ennuyer plus avec la théorie.
J'ai choisi MySQL comme mon SGBD, mais rappelez-vous que Kohana supporte également MsSQL, MySQLi, PostgreSQL, PDOSqlite. Créez une base de données appelée "cd_collection" ou choisissez le nom que vous préférez, puis exécutez le code SQL suivant via phpMyAdmin ou tout autre outil permettant de gérer l'administration de MySQL..
CREATE TABLE 'albums' ('id' int (11) NOT NULL auto_increment, 'nom' varchar (50) assemble utf8_bin NOT NULL, 'auteur' varchar (50) associe utf8_bin NON NULL, 'genre_id' int (11) NON NULL , PRIMARY KEY ('id'), KEY 'genre_id' ('genre_id')) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT = 19; INSERT INTO 'albums' ('id', 'nom', 'auteur', 'genre_id') VALEURS (2, 'Lines, Vines And Trying Times', 'Jonas Brothers', 16), (3, 'The END' , 'The Black Eyed Peas', 16), (4, 'Relapse', 'Eminem', 18), (5, 'Monuments And Melodies', 'Incubus', 1), (6, 'Thriller', 'Michael Jackson ', 16), (7,' Back in Black ',' AC / DC ', 4), (8,' Le côté obscur de la lune ',' Pink Floyd ', 4), (9,' Bat out of Hell ',' Meat Loaf ', 4), (10,' Backstreet Boys ',' Millennium ', 16 ans), (11,' Rumeurs ',' Fleetwood Mac ', 4), (12,' Come on Over ' , 'Shania Twain', 16), (13, 'Led Zeppelin IV', 'Led Zeppelin', 4), (14, 'Petite pilule déchiquetée', 'Alanis Morissette', 4), (15, 'Sgt. Pepper "s Lonely Hearts Club Band", "Les Beatles", 16), (16, "Tomber dans toi", "Céline Dion", 16), (17, "Boîte à musique", "Mariah Carey", 16 ), (18, 'Né aux États-Unis', 'Bruce Springsteen', 4); CREATE TABLE 'genres' ('id' int (11) NON NULL auto_increment, 'nom' varchar (50) collate utf8_bin NON NULL, PRIMARY KEY ('id'), UNIQUE KEY 'nom' ('nom')) ENGINE = I nnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT = 22; INSERT INTO 'genres' ('id', 'nom') VALEURS (1, 'Rock alternatif'), (2, 'Blues'), (3, 'Classique'), (4, 'Rock'), (5 , 'Country'), (6, 'Dance'), (7, 'Folk'), (8, 'Metal'), (9, 'Hawaiian'), (10, 'Importations'), (11, ' Musique indépendante '), (12,' Jazz '), (13,' Latin '), (14,' New Age '), (15,' Opéra '), (16,' Pop '), (17,' Soul '), (18,' Rap '), (20,' Bande originale '), (21,' Musique du monde '); ALTER TABLE 'albums' ADD CONSTRAINT 'genre_inter_relational_constraint' FOREIGN KEY ('genre_id') REFERENCES 'genres' ('id') ON DELETE CASCADE ON UPDATE CASCADE;
Comme vous pouvez le constater, le SQL crée deux tables, albums et genres, et les remplit avec certaines données. La dernière instruction SQL ajoute une contrainte pour la clé étrangère "genre_id".
La structure de la base de données est très simple et ne nécessite pas beaucoup d'explications.
Maintenant, vous devez dire à Kohana où se trouve votre base de données et comment y accéder. Editer le fichier de configuration global system / config / database.php comme suit
$ config ['default'] = array ('benchmark' => TRUE, 'persistent' => FALSE, 'connection' => array ('type' => 'mysql', 'user' => 'root', ' pass '=>' root ',' host '=>' localhost ',' port '=> FALSE,' socket '=> FALSE,' database '=>' cd_collection '),' character_set '=>' utf8 ', 'table_prefix' => ", 'object' => TRUE, 'cache' => FALSE, 'escape' => TRUE);
Ce code indique à Kohana de se connecter à une base de données MySQL appelée "cd_collection" sur localhost avec le nom d'utilisateur "root" et le mot de passe "root". Vous devez modifier ces paramètres en fonction de la configuration de votre serveur de base de données..
Créons maintenant notre premier contrôleur. Rappelez-vous ces conventions.
Rappelez-vous également comment Kohana structure ses URL et comment appeler une méthode de contrôleur. par exemple, http: //hostname/kohana_directory/index.php/controller/function.
Jetons un coup d'oeil à ce contrôleur simple.
PHP5 OOP est une condition préalable. Donc, si vous n'êtes pas bien versé, vous pouvez en apprendre plus ici.
La fonction constructeur, appelée __construct, initialise la classe et appelle le constructeur parent..
La fonction index est la fonction par défaut, elle sera donc appelée si nous appelons le contrôleur sans
en spécifiant une fonction (par exemple, http: //localhost/index.php/kohana/album. Après le contrôleur de noms
il n'y a pas de fonction, la fonction d'index par défaut sera appelée.)Compte tenu de ces règles de base, concentrons-nous sur notre application. Le contrôleur d'album implémente toutes les actions pour
la gestion de la collection d'albums. Ce contrôleur nous permet de créer un nouvel album, d'afficher les albums stockés dans notre base de données.,
mettre à jour un album et supprimer un album.Alors, changeons la classe comme suit.
Créez un fichier appelé album.php dans application / contrôleurs / et collez ce qui suit.
album_model = new Album_Model; $ this-> genre_model = new Genre_Model; $ this-> list_view = new View ('list'); $ this-> update_view = new View ('update'); $ this-> create_view = new View ('create'); public function index () $ this-> show_albums_list (); fonction privée show_albums_list () $ albums_list = $ this-> album_model-> get_list (); $ this-> list_view-> set ('albums_list', $ albums_list); $ this-> list_view-> render (TRUE); fonction publique show_create_editor () $ this-> create_view-> set ('genres_list', $ this-> get_genres_list ()); $ this-> create_view-> render (TRUE); fonction publique show_update_editor ($ id) $ album_data = $ this-> album_model-> read ($ id); $ this-> update_view-> set ('album_id', $ album_data [0] -> id); $ this-> update_view-> set ('name', $ album_data [0] -> name); $ this-> update_view-> set ('author', $ album_data [0] -> author); $ this-> update_view-> set ('genre_id', $ album_data [0] -> genre_id); $ this-> update_view-> set ('genres_list', $ this-> get_genres_list ()); $ this-> update_view-> render (TRUE); fonction publique create () $ album_data = array ('name' => $ this-> input-> post ('name'), 'author' => $ this-> input-> post ('author'), 'genre_id' => $ this-> input-> post ('genre_id')); $ this-> album_model-> create ($ album_data); url :: redirect ('album'); public function update () $ album_data = array ('name' => $ this-> input-> post ('name'), 'author' => $ this-> input-> post ('author'), 'genre_id' => $ this-> input-> post ('genre_id')); $ this-> album_model-> update ($ this-> input-> post ('album_id'), $ album_data); url :: redirect ('album'); fonction publique delete ($ id) $ this-> album_model-> delete ($ id); url :: redirect ('album'); fonction privée get_genres_list () $ db_genres_list = $ this-> genre_model-> get_list (); $ genres_list = array (); if (sizeof ($ db_genres_list)> = 1) foreach ($ db_genres_list as $ item) $ genres_list [$ item-> id] = $ item-> nom; return $ genres_list;Laissez-moi vous expliquer ce que fait ce code.
Cinq variables membres sont déclarées en haut de la classe:
private $ album_model; private $ genre_model; private $ list_view; private $ create_view; private $ update_view;Ces membres sont privés car je veux limiter la visibilité à cette classe..
Dans la méthode de construction, les objets modèle et vue sont créés à l'aide des cinq membres suivants:
$ this-> album_model = new Album_Model; $ this-> genre_model = new Genre_Model; $ this-> list_view = new View ('list'); $ this-> update_view = new View ('update'); $ this-> create_view = new View ('create');Pour créer un objet de modèle, utilisez cette syntaxe:
$ obj_name = new Name_Model;Pour créer un objet de vue, utilisez cette syntaxe:
$ obj_name = new View ('view_filename_without_extension');Il existe maintenant deux objets pour accéder à l'album et au modèle de genre, et trois autres pour accéder aux vues nécessaires au rendu de la présentation..
La méthode d'index appelle la méthode show_albums_list qui répertorie tous les albums stockés dans la base de données..
$ albums_list = $ this-> album_model-> get_list (); $ this-> list_view-> set ('albums_list', $ albums_list); $ this-> list_view-> render (TRUE);Dans cette méthode, vous pouvez voir comment les objets model et view sont utilisés pour accéder aux méthodes relatives. "get_list" est une méthode de modèle (nous le verrons plus tard) qui renvoie tous les albums stockés dans la base de données. Le résultat est enregistré dans le tableau "$ album_list". Pour transmettre le tableau de résultats du contrôleur à la vue, la méthode "set" est appelée sur l'objet de vue. Cette méthode nécessite deux paramètres: une nouvelle variable vide (liste_album) devant contenir les données d'une variable existante ($ liste_album). La nouvelle variable "album_list" contient maintenant le tableau $ album_list (nous verrons plus tard comment afficher le contenu dans la vue). La méthode "render", avec le paramètre TRUE, est nécessaire pour exporter les données vers le navigateur..
La méthode show_create_editor montre l'interface utilisateur pour insérer un nouvel album.
$ this-> create_view-> set ('genres_list', $ this-> get_genres_list ()); $ this-> create_view-> render (TRUE);La liste des genres est passée à la vue.
La méthode show_update_editor montre l'interface utilisateur pour mettre à jour un album existant.
$ album_data = $ this-> album_model-> read ($ id); $ this-> update_view-> set ('album_id', $ album_data [0] -> id); $ this-> update_view-> set ('name', $ album_data [0] -> name); $ this-> update_view-> set ('author', $ album_data [0] -> author); $ this-> update_view-> set ('genre_id', $ album_data [0] -> genre_id); $ this-> update_view-> set ('genres_list', $ this-> get_genres_list ()); $ this-> update_view-> render (TRUE);"read" est une méthode modèle (nous le verrons plus tard) qui renvoie les données ($ album_data) de l'album avec un identifiant égal à $ id. Ensuite, chaque élément de l'album de données renvoyé est transmis à la vue..
La méthode create reçoit les données, pour un nouvel album, de la vue et les données sont stockées dans la base de données..
$ album_data = array ('name' => $ this-> input-> post ('name'), 'author' => $ this-> input-> post ('author'), 'genre_id' => $ this -> input-> post ('genre_id')); $ this-> album_model-> create ($ album_data); url :: redirect ('album');$ album_data est un tableau contenant les données POST de la vue. Pour enregistrer l'album, le tableau est transmis à la méthode create model. La dernière ligne est un appel à une méthode d'assistance. Les aides sont simplement des fonctions qui vous aident avec le développement. Les classes auxiliaires sont automatiquement chargées par le framework. Les helpers sont déclarés comme des méthodes statiques d'une classe. Il n'est donc pas nécessaire d'instancier la classe. Dans ce cas, la méthode "redirection" de l'aide "url" est appelée et demande à Kohana de rediriger le navigateur vers le contrôleur d'album. Cela évite une nouvelle insertion (par exemple en appuyant sur F5).
"Les aides sont simplement des fonctions qui vous aident avec le développement."
Les méthodes update et delete fonctionnent de la même manière que la méthode create ci-dessus.
La dernière méthode, get_genres_list, extrait la liste des genres du modèle ($ db_genres_list) et crée un nouveau tableau ($ genres_list) pour la zone de sélection dans les vues..
$ db_genres_list = $ this-> genre_model-> get_list (); $ genres_list = array (); if (sizeof ($ db_genres_list)> = 1) foreach ($ db_genres_list as $ item) $ genres_list [$ item-> id] = $ item-> nom; return $ genres_list;Étape 8: Créer un modèle de projet
Créons maintenant des modèles pour notre application Web. Rappelez-vous ces conventions.
Voici le code de modèle de l'album. Créez un fichier appelé album.php dans application / modèles / et collez le code ci-dessous dessus.
album_table = 'albums'; $ this-> genre_table = 'genres'; fonction publique read ($ id) $ this-> db-> where ('id', $ id); $ query = $ this-> db-> get ($ this-> album_table); return $ query-> result_array (); fonction publique delete ($ id) $ this-> db-> delete ($ this-> album_table, array ('id' => $ id)); mise à jour de la fonction publique ($ id, $ data) $ this-> db-> update ($ this-> album_table, $ data, array ('id' => $ id)); fonction publique create ($ data) $ this-> db-> insert ($ this-> album_table, $ data); fonction publique get_list () $ this-> db-> select ('albums.id comme id, albums.nom comme nom, albums.author comme auteur, genres.nom comme genre'); $ this-> db-> from ($ this-> album_table); $ this-> db-> join ($ this-> genre_table, 'genres.id', 'albums.genre_id'); $ query = $ this-> db-> get (); return $ query-> result_array ();
Toutes les méthodes des modèles utilisent la syntaxe du générateur de requête. Cet outil Kohana accélère les temps de développement de la base de données et simplifie la création de requêtes..
Deux variables membres sont déclarées en haut de la classe:
private $ album_table; private $ genre_table;
Ces membres sont privés car je souhaite limiter la visibilité à cette classe. Ils sont les conteneurs pour les noms de tables de base de données.
La première ligne de la méthode constructeur charge la bibliothèque de bases de données Kohana dans $ this-> db. Aux deuxième et troisième lignes, les deux membres de la classe sont initialisés..
parent :: __ construct (); $ this-> album_table = 'albums'; $ this-> genre_table = 'genres';
La requête dans la méthode de lecture récupère les enregistrements d’album ayant un certain identifiant ("$ id").
$ this-> db-> where ('id', $ id); $ query = $ this-> db-> get ($ this-> album_table); return $ query-> result_array ();
La requête de la méthode delete supprime la ligne du tableau des albums ayant un identifiant donné ("$ id").
$ this-> db-> delete ($ this-> album_table, array ('id' => $ id));
La requête dans la méthode de mise à jour met à jour la ligne du tableau des albums qui a un certain identifiant ("$ id") avec les nouvelles valeurs du tableau "$ data".
$ this-> db-> update ($ this-> album_table, $ data, array ('id' => $ id));
Le tableau "$ data" doit contenir des noms d'enregistrement en tant que clés du tableau et une valeur en tant que valeurs du tableau. Le tableau "$ data" doit avoir cette forme:
$ data = array ('name' => 'album_name', 'author' => 'author_name', 'genre_id' => 'genre_id');
La requête dans la méthode create insère un nouvel enregistrement avec les valeurs du tableau "$ data".
$ this-> db-> insert ($ this-> album_table, $ data);
Le tableau "$ data" doit avoir cette forme:
$ data = array ('id' => 'album_id', 'name' => 'album_name', 'author' => 'author_name', 'genre_id' => 'genre_id');
La requête dans la méthode get_list récupère toutes les lignes d'albums.
$ this-> db-> select ('albums.id en tant qu'id, albums.name en tant que nom, albums.author en tant qu'auteur, genres.name en tant que genre'); $ this-> db-> from ($ this-> album_table); $ this-> db-> join ($ this-> genre_table, 'genres.id', 'albums.genre_id'); $ query = $ this-> db-> get (); return $ query-> result_array ();
Maintenant, le modèle de genre. Créez un fichier appelé genre.php dans application / modèles / et collez le code ci-dessous:
genre_table = 'genres'; function get_list () $ query = $ this-> db-> get ($ this-> genre_table); return $ query-> result_array ();
Ce modèle est très simple, je ne perds donc plus de temps à le commenter. Les modèles et le contrôleur sont prêts à fonctionner. Travaillons maintenant sur les vues.
Les vues sont des fichiers contenant la couche de présentation de votre application. Le but est de garder ces informations séparées de la logique de votre application pour une réutilisation facile et un code plus propre. Pour ce projet, trois vues sont requises: une vue pour répertorier la collection d'albums, une vue pour créer un nouvel album et une vue pour modifier un album existant..
Créez un fichier appelé list.php dans application / vues / et collez le code suivant dans:
COLLECTION DE CD
Collection de CD | ||||
Nom de l'album | Auteur | Genre | ". $ item-> name." | "; écho "". $ item-> author." | "; écho "". $ item-> genre." | "; écho "".html :: anchor ('album / delete /'.$ item-> id, html :: image (' assets / images / delete.png '))." | "; écho "".html :: anchor ('album / show_update_editor /'.$ item-> id, html :: image (' assets / images / edit.png '))." | "; écho "";?>
Cette vue affiche une page HTML contenant une liste de tous les albums. Cette liste a été créée à l’aide de la boucle foreach qui affiche les informations dans un tableau html. Pour chaque ligne d'album, il y a deux images: une "croix rouge" et un "portefeuille". Ils relient respectivement la méthode de suppression du contrôleur et la méthode de mise à jour. Les deux transmettent l’identifiant d’album au contrôleur d’album à l’aide d’une requête d’obtention. Au-dessus de la liste, un bouton permet de créer de nouveaux albums. Dans ce code, nous utilisons également un assistant HTML fourni par Kohana qui accélère les opérations pour écrire des pages HTML..
Créons maintenant un fichier appelé create.php dans application / vues /.
COLLECTION DE CD
Créer un nouvel album | ".form :: label ('name', 'Name:')." | "; écho "".form :: input ('name',"). " | "; écho ""; écho "
".form :: label ('auteur', 'Auteur:')." | "; écho "".form :: input ('author',"). " | "; écho "
".form :: label ('genre', 'Genre:')." | "; écho "".form :: dropdown ('genre_id', $ genres_list)." | "; écho "
".form :: submit ('submit', 'Créer un album')." | "; écho "
Le dernier mais non le moindre est la vue mise à jour. Créons un fichier appelé update.php dans application / vues /.
COLLECTION DE CD
Mettre à jour l'album | ".form :: label ('name', 'Name:')." | "; écho "".form :: input ('name', $ name)." | "; écho ""; écho "
".form :: label ('auteur', 'Auteur:')." | "; écho "".form :: input ('auteur', $ auteur)." | "; écho "
".form :: label ('genre', 'Genre:')." | "; écho "".form :: dropdown ('genre_id', $ genres_list, $ genre_id)." | "; écho "
".form :: submit ('submit', 'Mettre à jour l'album')." | "; écho "
Le premier est un éditeur simple qui permet à l'utilisateur d'insérer des informations sur un nouvel album..
Les champs tels que l'auteur et le nom seront insérés à l'aide d'une entrée html et d'un genre à l'aide d'un
boîte combo. Une fois que l'utilisateur a cliqué sur le bouton de création, toutes les informations sont transmises.,
en tant que demande POST, à la méthode create / update dans le contrôleur d'album. Lorsque le contrôleur reçoit ces messages
variables, il appelle le modèle qui insère un nouvel album dans la base de données. Les formes, dans les deux vues, utilisent Kohana form helper.
Pour donner un peu de style à notre application, créez le les atouts dossier dans la racine Kohana au même niveau que le dossier de l'application. Maintenant, ouvrez-le et créez deux nouveaux dossiers: css et images.
dans le css dossier créer un nouveau fichier appelé style.css et coller ceci:
une famille de polices: Verdana, Genève, Arial, Helvetica, sans serif; poids de police: normal; taille de police: 12px; couleur: # 00F; vertical-align: text-top; img border: 0; label font-family: Verdana, Genève, Arial, Helvetica, sans-serif; poids de police: normal; taille de police: 12px; input border: 1px solid # 000; sélectionnez width: 185px; table.editor text-align: center; font-family: Verdana, Genève, Arial, Helvetica, sans-serif; poids de police: normal; taille de police: 11px; couleur: #fff; largeur: 280px; couleur de fond: # 666; bordure: 0px; effondrement de la bordure: effondrement; espacement des bordures: 0px; table.editor td.editor_title background-color: # 666; couleur: #fff; rembourrage: 4px; text-align: left; poids de police: gras; taille de police: 16px; table.editor td padding: 4px; table.list text-align: center; font-family: Verdana, Genève, Arial, Helvetica, sans-serif; poids de police: normal; taille de police: 11px; couleur: #fff; largeur: 280px; couleur de fond: # 666; bordure: 0px; effondrement de la bordure: effondrement; espacement des bordures: 0px; table.list td.item background-color: #CCC; couleur: # 000; rembourrage: 4px; text-align: left; bordure: 1px #fff solide; table.list td.list_title, table.list td.headers background-color: # 666; couleur: #fff; rembourrage: 4px; text-align: left; border-bottom: 2px #fff solide; poids de police: gras; table.list td.list_title taille de la police: 16px; table.list td.headers font-size: 12px;
Maintenant, copiez les images suivantes sur le images dossier:
C'est tout. Pointez votre navigateur sur http: //localhost/kohana/index.php/album et vous devriez voir quelque chose de semblable à ceci:
Si vous essayez de créer un nouvel album ou d'en modifier un existant, vous devriez voir quelque chose de similaire à ceci:
Bien sûr, cette application nécessite quelques améliorations, mais avec une petite quantité de code, vous avez créé une petite application Web..
Maintenant, vous savez comment utiliser le modèle MVC avec Kohana et comment utiliser les bibliothèques de bases de données et les aides. Pour en savoir plus, lisez la documentation officielle.
Grâce à Kohana, la maintenance du code est une tâche facile et l'ajout de nouvelles fonctionnalités est un jeu