Un cadre PHP léger et facile à utiliser.
Dejframework est un cadre MVC PHP simple et minimal axé sur la concision, la simplicité et la compréhension. Sa syntaxe est principalement inspirée de Laravel. Dejframework a été développé par Ata Marzban pour le projet final du baccalauréat.
#Installation
composer install dans le répertoire racine.Pour que le cadre sache quoi faire lorsqu'une demande arrive, vous devez définir des itinéraires pour vos applications dans /app/routes.php. Cela se fait facilement.
Un itinéraire se compose d'une méthode HTTP, d'une URL et d'une destination qui devrait exécuter si une demande est faite avec la méthode spécifiée à l'URL spécifiée. Rien n'est exécuté sans définir des routes. Vous pouvez passer une fermeture comme destination:
[/app/routes.php]
Route:: set ( " GET " , " / " , function (){
return " Hello World! " ;
});Ce code sortira "Hello World" si vous visitez votre site sur votre site.
[/app/routes.php]
Route:: set ( " GET " , " /some/url " , function (){
return " This is some url! " ;
});Ce code sortira "Ceci est une URL!" Si vous visitez votre site sur votre plante.com/some/url.
[/app/routes.php]
Route:: set ( " POST " , " /do/something " , function (){
return " Here you should write your own code to do the things you want. " ;
});Ce code sera exécuté si vous visitez le volet.com/do/something avec la méthode du post. (à partir d'un formulaire ou d'un appel API)
Vous pouvez retourner des chaînes, des objets, des tableaux ou des vues (discuté plus loin) dans vos fermetures ou contrôleurs. La chaîne sera sortie directement, tandis que les objets ou les vues seront automatiquement convertis en JSON et en sortie, et les vues seront rendues en sortie.
Dans la partie suivante, vous apprendrez à diriger les itinéraires vers les contrôleurs au lieu des fermetures.
Il est considéré comme la meilleure pratique dans le modèle MVC que la logique d'application doit être placée dans les contrôleurs.
[/app/controllers/YourController.php]
<?php
namespace app controllers;
class YourController extends dej mvc Controller
{
public static function yourAction ()
{
return " This is the right way to do it! " ;
}
}IMPORTANT: Comme vous pouvez le voir dans l'exemple ci-dessus, pour que l'autoader PSR-0 fonctionne correctement, vous devez suivre les conventions suivantes lorsque vous ajoutez une classe à votre application:
Continuons maintenant à apprendre à faire fonctionner les contrôleurs:
[/app/routes.php]
Route:: set ( " GET " , " / " , " YourController@YourAction " );L'action spécifiée sur le contrôleur spécifié sera exécutée lorsque l'itinéraire se déclenchera.
Instanciant constamment des classes et des dépendances de passage peut devenir une tâche répétitive dans le développement de PHP. Le fournisseur de services dej app vise à rendre ce processus aussi sec que possible. En utilisant ce fournisseur de services, vous n'avez pas besoin d'ajouter des instructions d'utilisation dans chaque fichier et de passer les dépendances. Prenez cet exemple:
/**
* Without a Service Provider
* when you want to build a query
*/
use dej db Connection ;
$ connection = Connection:: getInstance ();
use dej db Query ;
$ query = new Query ( $ connection );
$ result = $ query -> select ()-> from ( ' someTable ' )-> getAll ();
return $ result ;Et cela doit être répété à chaque fois que vous souhaitez utiliser le Builder Query. Maintenant, en utilisant le fournisseur de services:
use dej App ;
return App:: Query ()-> select ()-> from ( ' some_table ' );C'est ça! Jetez un œil à dej / app.php pour voir comment cela fonctionne. Une méthode statique nommée «Query» est appelée sur la classe d'application. Il instancie la classe de requête et transmet une instance de connexion comme paramètres du constructeur. Morceau de gâteau!
#Request La classe dejhttpRequest facilite l'interaction avec la demande, jetez un examen des exemples suivants:
//check if request is ajax or not
$ result = App:: Request ()-> isAjax ();
//returns $_GET['name'];
$ result = App:: Request ()-> get ( ' name ' );
//returns $_POST['name'];
$ result = App:: Request ()-> post ( ' name ' );
//returns $_REQUEST;
$ result = App:: Request ()-> all (); #Response La classe dejhttpResponse facilite les paramètres de réponse de la réponse, vous devez renvoyer une réponse dans votre contrôleur si vous souhaitez définir les codes de réponse HTTP ou les en-têtes, jetez un examen des exemples suivants:
class IndexController extends dej mvc Controller
{
public static function index ()
{
return App:: Response ()-> code ( 404 )-> header ( ' HTTP/1.1 404 Not Found ' );
}
}Vous pouvez rediriger facilement:
//in the controller
return App:: Response ()-> redirect ( ' /login ' );
//redirect with errors
App:: Response ()-> redirect ( ' / ' )-> withErrors ([ ' login ' => ' login unsuccessful! maybe password is wrong. ' ]);La redirection avec des erreurs clignote les erreurs vers la session (discutée plus loin).
Configuration: entrez d'abord la configuration de la base de données dans /config.json . Dejframework traite des bases de données dans une architecture à 3 couches:
Couche 1 - Objet de connexion de la base de données: Cela étend la classe abstraite singleton. Cela signifie qu'il n'est instancié qu'une seule fois, la première fois qu'il s'appelle. Certains autres services sur Dejframework sont aussi comme ça. Pour éviter les frais généraux de connexion à la base de données chaque fois que vous souhaitez exécuter une requête. Voici comment vous pouvez l'utiliser:
//simple query
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table " );
//NonQuery: a query that doesn't return rows, only the number of affected rows.
$ result = App:: Connection ()-> executeNonQuery ( " DELETE FROM some_table WHERE some_field = 'some_value' " );
//A Query using prepared statements, To protect against SQL Injection.
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table WHERE some_field = ? " , [ " some_value " ]);
//A Query using prepared statements, To protect against SQL Injection. With Multiple Parameters.
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table WHERE some_field = ? AND another_field = ? " , [ $ some_value , " another_value " ]);
//A Query using prepared statements, To protect against SQL Injection. With Named Parameters.
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table WHERE some_field = :some_value_name
AND another_field = :another_value_name " ,
[ " :some_value_name " => $ some_value ,
" another_value_name " => " another_value " ]); Vous pouvez le faire n'importe où, à condition que vous ayez ajouté use dejApp; .
Couche 2 - Builder de requête: cette classe construit des requêtes et utilise la classe de connexion pour les exécuter en utilisant des instructions préparées sécurisées. Il doit être instancié pour chaque nouvelle requête, cela est fait automatiquement pour vous par / dej / app sur chaque fois que vous tapez App::Query() , tout comme nous l'avons vu dans l'exemple de section Povider Service. Vous pouvez créer des requêtes avec lui en utilisant le chaînage de méthode. Jetez un œil aux exemples ci-dessous:
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> getOne ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> getJson ();
$ query = App:: Query ()-> select ()-> from ( ' users ' )-> getQuery (); Comme vous pouvez le voir, l'utilisation du Builder dejery Dej est simple, utilisez l'application d'appel :: query () et il vous transmet automatiquement une nouvelle classe de requête injectée de dépendance, puis vous faites une chaîne de méthodes pour y ajouter des conditions de votre goût, telles que Select getOne() ), getAll() () et ainsi getJson() ), ou la requête construite ( getQuery() ). Les résultats sont récupérés au format STDClass que vous pouvez utiliser facilement. Il convient de noter que sans utiliser l'une des méthodes GET à la fin de votre requête, les résultats ne seront pas récupérés. Vous pouvez également chaîner des méthodes sur plusieurs lignes et en plusieurs étapes, par exemple, pour la modifier par une condition:
$ query = App:: Query ()-> select ();
if ( $ somecondition == true ) $ query -> from ( ' users ' );
else $ query -> from ( ' another_table ' );
$ result = $ query -> getAll ();Voyons d'autres méthodes disponibles sur le constructeur de requête dans les exemples suivants:
//All queries will be executed using prepared statements and parameters will be handled automatically.
//SELECT Queries:
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' id ' , ' = ' , ' 22 ' )-> getAll ();
//you can omit the operator and it uses '=' by default
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' id ' , ' 22 ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' city ' , ' = ' , ' Berlin ' )
-> andWhere ( ' age ' , ' > ' , ' 20 ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' city ' , ' = ' , ' Berlin ' )
-> orWhere ( ' city ' , ' = ' , ' Paris ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> orderBy ( ' age ' , ' DESC ' )
-> limit ( 25 )
-> offset ( 50 )-> getAll ();
//INSERT Query:
$ affectedRows = App:: Query ()-> insertInto ( ' users ' )-> values ([ " username " => " jameshetfield " ,
" password " => " 19831983 " ,
" city " => " Downey " ])-> execute (); Notez que les requêtes qui ne renvoient pas les résultats doivent être exécutées avec php execute() et il renverra automatiquement le nombre de lignes affectées.
//UPDATE Query:
$ affectedRows = App:: Query ()-> update ( ' users ' )-> set ([ " age " => 53 ,
" band " => " Metallica " ])
-> where ( ' username ' , ' = ' , ' jameshetfield ' )-> execute ();
//DELETE Query:
$ affectedRows = App:: Query ()-> deleteFrom ( ' users ' )-> where ( ' username ' , ' = ' , ' someone ' )-> execute ();Notez que les requêtes de suppression ou de mise à jour peuvent entraîner une perte de données s'il n'y a pas de clause non fournie, en tant que mesure de sécurité, DejFramework lancera une exception si elle rencontre une telle situation. Veuillez exécuter ces requêtes en utilisant manuellement la classe de connexion.
Couche 3 - Mappage relationnel d'objet: ORM sera discuté dans la section suivante.
Selon Wikipedia:
Le mappage relationnel d'objet (ORM) ... est une technique de programmation pour convertir les données entre les systèmes de type incompatible dans les langages de programmation orientés objet. Cela crée, en fait, une "base de données d'objets virtuelle" qui peut être utilisée à partir du langage de programmation.
Étant donné que DeJFramework fonctionne dans une architecture MVC, la persistance des données est contenue dans le composant modèle de MVC. Les modèles sont liés aux entités de votre application, comme un utilisateur, un achat, un produit, etc. dans un système d'achat. Ils doivent être enregistrés et récupérés vers et depuis la base de données. Les bases de données relationnelles fonctionnent dans la langue SQL, et Dejframework, comme la plupart des cadres fonctionnent dans un environnement orienté objet. Et le code SQL au milieu du code PHP est considéré comme ne pas être la meilleure pratique. Ainsi, Dejframework essaie de vous séparer du code SQL en 3 niveaux, 2 d'entre eux ont été élaborés dans la section précédente, maintenant nous verrons comment travailler avec des modèles:
class User extends dej mvc Model
{
protected static $ dbTable = " users " ;
//Format: ["db_field_name" => "modelPropertyName"]
protected static $ primaryKey = [ " id " => " id " ];
//Model properties
public $ username ;
public $ password ;
public $ city ;
.
.
.
} class User extends dej mvc Model
{
protected static $ dbTable = " users " ;
//Format: ["db_field_name" => "modelPropertyName"]
protected static $ dbFields = [ " username " => " username " ,
" password " => " password " ,
" city " => " city " ,
" id " => " id " ];
public $ username ;
public $ password ;
public $ city ;
.
.
.
} Notez que la propriété id est définie dans la classe /dej/mvc/Model que vos modèles étendent. Ainsi, si vous voulez que votre modèle ait un ID, il n'est pas nécessaire de le définir à nouveau.
class User extends dej mvc Model
{
protected static $ dbTable = " users " ;
protected static $ dbFields = [ " username " => " username " ,
" password " => " password " ,
" city " => " city " ,
" id " => " id " ];
//Exactly the same as the class name
protected static $ modelName = " User " ;
public $ username ;
public $ password ;
public $ city ;
.
.
.
}C'est tout pour l'instant, à condition que vous ayez défini ces configurations correctement, vous pourrez utiliser les méthodes ORM sur vos modèles. Jetez un œil aux exemples ci-dessous:
//Creating a new record
use app models User ;
$ user = new User ();
$ user -> username = " jameshetfield " ;
$ user -> password = " 13831383 " ;
$ user -> city = " Downey " ;
$ user -> create (); //Saved into the database.
//or you can set the properties in the constructor
$ user = new User ([
' username ' => ' jameshetfield ' ,
' password ' => ' 13831383 ' ,
' city ' => ' Downey '
]);
$ user -> create ();L'ORM utilise le constructeur de requête DEJ en dessous, pour générer les requêtes nécessaires.
Remarquez que Create (), Update () et Delete () renvoient les lignes affectées que vous pouvez vérifier pour voir si l'opération a réussi.
//Finding a record by a field named 'id'
$ user = User:: findById ( 11 );
//changing it's properties
$ user -> password = " through_the_never " ;
$ user -> update (); //Updated in the database.
//deleting it.
$ user -> delete ();Notez que ces fonctions fonctionnent avec la clé principale des enregistrements.
//Finding records by some condition.
$ users = User:: find ()-> where ( ' city ' , ' = ' , ' Sari ' )-> getAll (); //Returns an array of User objects.
//A more complex one
$ users = User:: find ()-> where ( ' city ' , ' = ' , ' Sari ' )-> andWhere ( ' age ' , ' > ' , 20 )-> orderBy ( ' age ' , ' ASC ' )
-> limit ( 25 )
-> offset ( 100 )-> getAll ();
//Don't forget the get*() method!
//Retrieveing all records
$ users = User:: getAll (); //doesn't need a getAll() at the end because it knows what to do.
//The method for deleting by condition is named 'wipe'
$ users = User:: wipe ()-> where ( ' status ' , ' = ' , ' banned ' )-> orWhere ( ' email_confirmation ' , ' = ' , ' 0 ' )-> execute ();
//counting all records
$ userCount = User:: countAll ();
//counting records that have a certain condition
$ userCount = User:: count ()-> where ( ' city ' , ' = ' , ' Sari ' )-> getInt (); //getInt() returns the count of the results as an Integer. La validation des données dans DejFramework est gérée par la classe dejValidator . Vous pouvez l'utiliser de différentes manières:
App::Validator() qui vous donne l'instance singleton de celui-ci. Il accepte 2 paramètres: une valeur à valider. (String, int, array, objet) et un ensemble de règles pour valider les données contre.Voyons comment cela fonctionne:
use dej App ;
//Validate a single value according to a set of rules seperated by "|".
$ result = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|min:5|max:30 " );
//Validate an object or and array:
$ result = App:: Validator ()-> validate ( $ user , [ ' username ' => ' required|string|email|min:5|max:30 ' ,
' password ' => ' required|string|min:10|max:100 ' ],
' age ' => ' int|min:18|max:99 ' ); La méthode validate() renvoie un tableau. S'il n'y a pas d'erreurs de validation et que les données sont valides, ce sera un tableau vide. Vous pouvez donc vérifier si les données sont valides avec empty() . S'il y a des erreurs de validation, vous les verrez dans le tableau.
//The rules have changed
$ errors = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|email|min:5|max:10 " );
var_dump ( $ errors );C'est ce que le code ci-dessus sortira:
array
0 => 'This Field should be an email'
1 => 'This Field should be less than 10'
Maintenant avec un objet:
$ errors = App:: Validator ()-> validate ( $ obj , [ ' email ' => ' required|string|email ' ,
' password ' => ' required|string ' ,
' age ' => ' int ' ]);
var_dump ( $ errors );Sortir:
array (size=3)
'email' =>
array (size=1)
0 => string 'This Field should be an email'
'password' =>
array (size=2)
0 => string 'This Field is Required'
1 => string 'This Field should be more than 10'
'age' =>
array (size=1)
0 => string 'This Field should be a number'
Comme vous pouvez le voir, si vous passez un objet ou un tableau au validateur, il renvoie les erreurs liées à chaque champ dans un tableau associatif où les touches sont des noms de champ et les valeurs sont des tableaux contenant des erreurs liées à ce champ.
validate() sur l'objet de demande. $ errors = App:: Request ()-> validate ([ ' email ' => ' required|string|email ' ,
' password ' => ' required|string|min:10|max:100 ' ]);
var_dump ( $ errors ); Visiter yoursite.local/?email=notanemail&password=123 entraînera:
array (size=2)
'email' =>
array (size=1)
0 => string 'This Field should be an email'
'password' =>
array (size=1)
0 => string 'This Field should be more than 10'
/app/models/User.php : class User extends dej mvc Model
{
.
.
.
protected static $ validationRules = [ " username " => " required|string|min:5|max:20 " ,
" password " => " required|string|min:5|max:255 " ,
" city " => " string|max:10 " ];
.
.
.
}Vous pouvez maintenant valider les instances des modèles:
$ user = User:: getById ( 11 );
$ errors = $ user -> validate (); //returns errors in array like the previous examples.
$ isValid = $ user -> isValid (); //returns true or falseLorsque vous avez vos erreurs, vous pouvez la transmettre à la vue pour afficher, ou rediriger quelque part avec eux:
//in the controller
$ errors = $ user -> validate ();
if (! empty ( $ errors )) return App:: Response ()-> redirect ( ' / ' )-> withErrors ( $ errors ); Les messages de validation que vous avez vus dans les exemples précédents étaient des messages par défaut, que se passe-t-il si vous voulez les modifier ou avoir des messages de validation dans votre propre langue? Jetez un œil à /app/locale/en/validation/messages.php :
return [
" required " => " This Field is Required " ,
" string " => " This Field should be an string " ,
" int " => " This Field should be a number " ,
" min " => " This Field should be more than %s " ,
" max " => " This Field should be less than %s " ,
" email " => " This Field should be an email " ,
]; Vous pouvez voir que la clé correspond au type de validation et que les valeurs sont des messages de validation. Les variables sont incluses dans les messages avec «S». Dans /app/locale , vous pouvez créer votre propre répertoire pour la langue de votre choix et dans ce répertoire, avoir vos propres messages de validation avec des variables.
Vous pouvez définir les paramètres par défaut dans /config.json .
Vous pouvez le modifier dans votre application par App::Config()->locale = 'your_locale';
Afin de travailler avec la session PHP, DejFramework fournit la classe dejSession . Voici quelques exemples sur la façon de l'utiliser:
//to set session variables
App:: Session ()-> save ([
' key1 ' => ' value1 ' ,
' key2 ' => ' value2 '
]);
//to get session variables
$ value1 = App:: Session ()-> get ( ' key1 ' );
//to regenerate session id
App:: session ()-> regenerateId ();
//get all session variables as associative array
$ wholeSession = App:: session ()-> all ();
//destroy the session
App:: session ()-> destroy ();
//delete a variable
App:: session ()-> delete ( ' key1 ' );
//see if variable is set
$ trueOrFalse = App:: session ()-> isSaved ( ' key1 ' );Si vous souhaitez qu'une variable de session soit disponible uniquement dans la demande suivante, par exemple, un certain message d'erreur, vous pouvez le flasher à la session comme ceci:
App:: session ()-> flash ([ ' message ' => ' Registered Successfully! ' ]);Et le récupérer dans la demande suivante:
$ message = App:: session ()-> getFlash ( ' message ' ); Notez que les messages flash ne sont disponibles que dans la prochaine demande et uniquement avec ->getFlash() .
Vous pouvez définir la session pour expirer après une heure définie depuis le dernier accès à la session:
App:: Session ()-> save ([ ' key ' => ' value ' ]);
App:: Session ()-> lifeTime ( 60 ); //session will expire after 60 seconds since last access to the session. (last use of App::Session())Parfois, vous voudrez peut-être que votre application se souvienne d'une instance d'un modèle pour les demandes suivantes. Par exemple, vous souhaitez que votre application se souvienne de l'utilisateur qui est connecté, ou du panier d'achat de votre utilisateur, ou autre chose. Si vous stockez la clé principale du modèle que vous souhaitez dans la session et exécutez une requête pour la récupérer à chaque demande, cela pourrait devenir fastidieux. Dejframework résout cela en vous fournissant un trait que vous pouvez utiliser dans vos modèles. Jetez un œil:
class ShoppingCart extends dej mvc Model
{
use dej traits IsStateful;
.
.
.
}Vous avez maintenant quelques méthodes supplémentaires disponibles dans votre modèle:
//suppose you want to create a shopping cart for a guest user and add a product to it:
$ cart = new ShoppingCart ();
$ cart -> addProduct ( 2389 );
$ cart -> create (); //stored in the db
//if you want to save it to the session get it easily in the next request
$ cart -> remember ( ' guest_shopping_cart ' ); //provide a key to remember it by this key.Maintenant dans la prochaine demande:
if (ShoppingCart:: isRemembered ( ' guest_shopping_cart ' )) //see if theres any cart in the session
$ cart = ShoppingCart:: retrieve ( ' users_shopping_cart ' ); //get's fresh data from the db
if (ShoppingCart:: hasChanged ( ' guest_shopping_cart ' ))
{
//checks if the cart in the database has changed **since you saved the cart in the session**.
doSomeThing ();
}
ShoppingCart:: forget ( ' guest_shopping_cart ' ); //forgets the cart. Pour présenter vos données à l'utilisateur, vous avez besoin d'une interface utilisateur. Sur le Web, la plupart du temps, cela signifie un balisage HTML. Dans MVC, la logique doit être séparée de l'interface utilisateur, vous mettez donc votre HTML dans les vues et n'incluez que la logique de présentation, comme echo à une valeur ou mettre un tableau dans un `` foreach '' pour y itérer. Pour créer une vue, vous devez:
/app/views . Il y a une vue incluse par défaut: index.phtml <!DOCTYPE html >
< html >
< head >
< title > < ?= $data- > user- > username ? > 's profile </ title >
</ head >
< body >
< h2 > View < ?= $data- > user- > username ? > 's Profile </ h2 >
< p > Username: < ?= $data- > user- > username ? > </ p >
< p > Password: < ?= $data- > user- > password ? > </ p >
< p > City: < ?= $data- > user- > city ? > </ p >
</ body >
</ html > class IndexController extends dej mvc Controller
{
public static function index()
{
$ user = User:: find ()-> where ( ' username ' , ' = ' , ' jameshetfield ' )-> getOne ();
return App:: View ( ' user ' , [ ' user ' => $ user ]); //the first argument is the view name,
the second one is the data you want to pass to
the view, in this example, a variable called ' user '
will be available in the user.phtml view
which contains the instance of user we fetched.
Piece of cake!
}
}Vous pouvez également fournir des messages d'erreur:
//in the controller
return App:: View ( ' user ' )-> withErrors ([ ' authorization ' => ' You are not allowed to view this user. ' ]);Le cadre rendra la vue à la sortie et le résultat sera:
<!DOCTYPE html >
< html >
< head >
< title > jameshetfield's profile </ title >
</ head >
< body >
<!-- access the errors like this: -->
< span class =" error " > < ?= $this- > errors('authorization') ? > </ span >
< h2 > View jameshetfield's Profile </ h2 >
< p > Username: jameshetfield </ p >
< p > Password: 13831383 </ p >
< p > City: Downey </ p >
</ body >
</ html >Voyons maintenant un autre exemple, que se passe-t-il si nous voulons créer un tableau de tous les utilisateurs? Modifiez votre point de vue:
<!DOCTYPE html >
< html >
< head >
< title > All Users </ title >
</ head >
< body >
< table >
< tr >
< th > username </ th >
< th > password </ th >
< th > city </ th >
</ tr >
< ?php foreach ($data- > users as $user): ? >
< tr >
< th > < ?= $user- > username ? > </ th >
< th > < ?= $user- > password ? > </ th >
< th > < ?= $user- > city ? > </ th >
</ tr >
< ?php endforeach; ? >
</ table >
</ body >
</ html >Et puis votre contrôleur:
class IndexController extends dej mvc Controller
{
public static function index ()
{
$ users = User:: getAll ();
return App:: View ( ' user ' , [ ' users ' => $ users ]);
}
}Et voyez le résultat par vous-même!
Vous pouvez créer une vue partielle et coller (inclure) dans d'autres vues:
[/app/views/partials/header.phtml]
<!--begin header-->
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " >
< title > < ?= $data- > title ? > </ title >
</ head >
< body >
<!--end header--> et collez-le dans index.phtml :
[/app/views/index.phtml]
< ?php $this- > paste('partials/header'); ? >
< h2 > < ?= $data- > message ? > </ h2 >
.
.
.
</ html > L'authentification est une question liée à l'application. Il peut être très différent dans chaque application, de sorte que DeJFramework ne l'implémente pas dans le cadre lui-même, vous êtes plutôt fourni avec le modèle d'utilisateur de base, les itinéraires Auth et la logique du contrôleur qui réalise l'authentification et vous êtes libre de le modifier, ou implémentez votre propre solution, la solution qui est implémentée dans le cadre utilise le trait IsStateful sur le modèle d'utilisateur et utilise $user->remember() pour maintenir le STAGED dans la session. La seule chose que vous devez faire est de définir 'default_auth_model' dans config.json pour pouvoir utiliser App::Request->user() à ::retrieve() l'utilisateur de la session à l'aide du trait IsStateful .
Jetez un œil au contrôleur, au modèle et aux vues qui sont fournis dans le cadre d'authentification pour comprendre son fonctionnement. et modifiez / l'améliorez / supprimez-le comme vous le souhaitez.
Remarque: Pour que le modèle utilisateur fonctionne correctement, vous devez créer un tableau nommé users avec 2 champs:
TABLE: users
FIELD TYPE
id int, autoincrement
username varchar
password varchar(255) //password hashing system requires 255