Un marco PHP ligero y fácil de usar.
DeJFramework es un marco PHP MVC simple y mínimo centrado en la concisión, la simplicidad y la comprensión. Su sintaxis se inspira principalmente en Laravel. DeJFramework fue desarrollado por Ata Marzban para el proyecto final de la licenciatura.
#Instalación
composer install en el directorio raíz.Para que el marco sepa qué hacer cuando llegue una solicitud, debe establecer rutas para sus aplicaciones en /app/routes.php. Se hace fácilmente.
Una ruta consiste en un método HTTP, URL y el destino que debe ejecutarse si se realiza una solicitud con el método especificado a la URL especificada. Nada se ejecuta sin configurar rutas. Puede pasar un cierre como destino:
[/app/routes.php]
Route:: set ( " GET " , " / " , function (){
return " Hello World! " ;
});Este código generará "Hello World" si visite su sitio en su suyoite.com.
[/app/routes.php]
Route:: set ( " GET " , " /some/url " , function (){
return " This is some url! " ;
});Este código generará "¡Esta es una URL!" Si visite su sitio en suyo.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. " ;
});Este código se ejecutará si visita tuye.com/do/something con el método de publicación. (de un formulario o una llamada API)
Puede devolver cadenas, objetos, matrices o vistas (discutidos más adelante) en sus cierres o controladores. La cadena se emitirá directamente, mientras que los objetos o vistas se convertirán automáticamente a JSON y salida, y las vistas se presentarán a la salida.
En la siguiente parte, aprenderá a dirigir las rutas a los controladores en lugar de los cierres.
Se considera la mejor práctica en el patrón MVC que la lógica de la aplicación debe ponerse en controladores.
[/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! " ;
}
}IMPORTANTE: Como puede ver en el ejemplo anterior, para que el Autoloader de PSR-0 funcione correctamente, debe seguir las siguientes convenciones al agregar cualquier clase a su aplicación:
Ahora continuemos aprendiendo cómo hacer que los controladores funcionen:
[/app/routes.php]
Route:: set ( " GET " , " / " , " YourController@YourAction " );La acción especificada en el controlador especificado se ejecutará cuando la ruta se dispare.
Las clases constantemente instanciadas y las dependencias que pasan a ellas pueden convertirse en una tarea repetitiva en el desarrollo de PHP. El proveedor de servicios de aplicaciones deJ tiene como objetivo hacer que este proceso sea lo más seco posible. Usando este proveedor de servicios, no necesita agregar declaraciones de uso en cada archivo y aprobar dependencias. Tome este ejemplo:
/**
* 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 ;Y esto debe repetirse cada vez que desee usar el creador de consultas. Ahora, utilizando el proveedor de servicios:
use dej App ;
return App:: Query ()-> select ()-> from ( ' some_table ' );¡Eso es todo! Eche un vistazo a DeJ/App.php para ver cómo funciona. Se llama a un método estático llamado 'consulta' en la clase de aplicaciones. Instancia la clase de consulta y pasa una instancia de conexión como los parámetros del constructor. ¡Trozo de pastel!
#Request La clase dejhttpRequest hace que interactúe con la solicitud sea fácil, tome una mirada a los siguientes ejemplos:
//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 clase dejhttpResponse facilita la clase de respuesta de configuración, debe devolver una respuesta en su controlador si desea establecer códigos o encabezados de respuesta HTTP, tome una mirada a los siguientes ejemplos:
class IndexController extends dej mvc Controller
{
public static function index ()
{
return App:: Response ()-> code ( 404 )-> header ( ' HTTP/1.1 404 Not Found ' );
}
}Puedes redirigir fácilmente:
//in the controller
return App:: Response ()-> redirect ( ' /login ' );
//redirect with errors
App:: Response ()-> redirect ( ' / ' )-> withErrors ([ ' login ' => ' login unsuccessful! maybe password is wrong. ' ]);La redireccionamiento con errores muestra los errores a la sesión (discutido más adelante).
Configuración: primero ingrese la configuración de la base de datos en /config.json . DeJFramework se ocupa de bases de datos en una arquitectura de 3 capas:
Capa 1 - Objeto de conexión de la base de datos: esto extiende la clase abstracta singleton. Lo que eso significa es que se instancia solo una vez, la primera vez que se llama. Algunos otros servicios en DeJFramework también son así. Para evitar la sobrecarga de conectarse a la DB cada vez que desee ejecutar una consulta. Así es como puedes usarlo:
//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 " ]); Puede hacer esto en cualquier lugar, siempre que haya agregado use dejApp; .
Capa 2: creador de consultas: esta clase crea consultas y utiliza la clase de conexión para ejecutarlas utilizando declaraciones seguras preparadas. Debe instanciarse para cada nueva consulta, esto se hace por usted por /dej /App automáticamente cada vez que escribe App::Query() , al igual que vimos en el ejemplo de la sección de Povider de servicio. Puede construir consultas con ella utilizando el encadenamiento del método. Eche un vistazo a los ejemplos a continuación:
$ 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 (); Como puede ver, el uso del Builder DeJ Query es simple, use la aplicación de llamadas :: Query () y le pasa automáticamente una nueva clase de consulta inyectada de dependencia, y luego le encadena métodos para agregar las condiciones de su gusto a él, como select (), de () y así sucesivamente, finalmente, finalmente usa uno de los métodos a obtener los métodos, ya sea como el resultado ( getOne() ), todos los resultados ( getAll() (), finalmente, utiliza uno de los métodos. getJson() ), o la consulta construida ( getQuery() ). Los resultados se obtienen en formato STDClass que puede usar fácilmente. Vale la pena señalar que sin usar uno de los métodos GET al final de su consulta, los resultados no se obtienen. Además, puede encadenar métodos en múltiples líneas y en múltiples pasos, por ejemplo, para cambiarlo por alguna condición:
$ query = App:: Query ()-> select ();
if ( $ somecondition == true ) $ query -> from ( ' users ' );
else $ query -> from ( ' another_table ' );
$ result = $ query -> getAll ();Veamos otros métodos disponibles en el creador de consultas en los siguientes ejemplos:
//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 (); Tenga en cuenta que las consultas que no devuelven los resultados deben ejecutarse con php execute() y devolverá automáticamente el número de filas afectadas.
//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 ();Tenga en cuenta que las consultas de eliminación o actualización pueden dar lugar a la pérdida de datos si no hay una cláusula donde se proporcione, como medida de seguridad, DeJFramework lanzará una excepción si encuentra dicha situación. Ejecute tales consultas usando la clase de conexión manualmente.
Capa 3 - Mapeo de objetos relacionales: ORM se discutirá en la siguiente sección.
Según Wikipedia:
Mapeo de objetos-relacionales (ORM) ... es una técnica de programación para convertir datos entre sistemas de tipo incompatibles en lenguajes de programación orientados a objetos. Esto crea, en efecto, una "base de datos de objetos virtuales" que se puede usar desde el lenguaje de programación.
Dado que DeJFramework funciona en una arquitectura MVC, la persistencia de datos está contenida en el componente modelo de MVC. Los modelos se relacionan con las entidades de su aplicación, como un usuario, una compra, un producto, etc. en un sistema de compras. Necesitan ser guardados y recuperados hacia y desde la base de datos. Las bases de datos relacionales funcionan en el lenguaje SQL y el dejframework, como la mayoría de los marcos opera en un entorno orientado a objetos. Y el código SQL en el medio del código PHP se considera que no es la mejor práctica. Por lo tanto, DeJFramework intenta separarlo del código SQL en 3 niveles, 2 de ellos fueron elaborados en la sección anterior, ahora veremos cómo trabajar con modelos:
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 ;
.
.
.
} Tenga en cuenta que la propiedad id se define en la clase /dej/mvc/Model que extienden sus modelos. Por lo tanto, si desea que su modelo tenga una identificación, no hay necesidad de definirlo nuevamente.
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 ;
.
.
.
}Eso es todo por ahora, siempre que haya establecido estas configuraciones correctamente, podrá usar los métodos ORM en sus modelos. Eche un vistazo a los ejemplos a continuación:
//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 ();El ORM usa el constructor de consultas DeJ debajo, para generar consultas necesarias.
Tenga en cuenta que Create (), Update () y Delete () Devuelve filas afectadas que puede verificar para ver si la operación fue exitosa.
//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 ();Tenga en cuenta que estas funciones funcionan con la clave principal de los registros.
//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 validación de datos en DeJFramework es manejada por la clase dejValidator . Puedes usarlo de varias maneras:
App::Validator() que le brinda la instancia de Singleton. Acepta 2 parámetros: un valor a validar. (Cadena, int, matriz, objeto) y un conjunto de reglas para validar los datos.Veamos cómo funciona:
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 ' ); El método validate() devuelve una matriz. Si no hay errores de validación y los datos son válidos, será una matriz vacía. Por lo tanto, puede verificar si los datos son válidos con empty() . Si hay algún error de validación, los verá en la matriz.
//The rules have changed
$ errors = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|email|min:5|max:10 " );
var_dump ( $ errors );Esto es lo que emitirá el código anterior:
array
0 => 'This Field should be an email'
1 => 'This Field should be less than 10'
Ahora con un objeto:
$ errors = App:: Validator ()-> validate ( $ obj , [ ' email ' => ' required|string|email ' ,
' password ' => ' required|string ' ,
' age ' => ' int ' ]);
var_dump ( $ errors );Producción:
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'
Como puede ver, si pasa un objeto o matriz al validador, devolverá los errores relacionados con cada campo en una matriz asociativa donde las claves son nombres de campo y los valores son matrices que contienen errores relacionados con ese campo.
validate() en el objeto de solicitud. $ errors = App:: Request ()-> validate ([ ' email ' => ' required|string|email ' ,
' password ' => ' required|string|min:10|max:100 ' ]);
var_dump ( $ errors ); Visitar yoursite.local/?email=notanemail&password=123
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 " ];
.
.
.
}Ahora puede validar las instancias de los modelos:
$ user = User:: getById ( 11 );
$ errors = $ user -> validate (); //returns errors in array like the previous examples.
$ isValid = $ user -> isValid (); //returns true or falseCuando tenga sus errores, puede pasarlo a la vista para mostrar o redirigir a algún lugar con ellos:
//in the controller
$ errors = $ user -> validate ();
if (! empty ( $ errors )) return App:: Response ()-> redirect ( ' / ' )-> withErrors ( $ errors ); Los mensajes de validación que vio en los ejemplos anteriores fueron mensajes predeterminados, ¿qué pasaría si desea cambiarlos o tener mensajes de validación en su propio idioma? Eche un vistazo a /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 " ,
]; Puede ver que las clave corresponden al tipo de validación, y los valores son mensajes de validación. Las variables se incluyen en los mensajes con 'S'. En /app/locale , puede crear su propio directorio para el lenguaje de su elección y en ese directorio, tener sus propios mensajes de validación con variables.
Puede establecer la configuración nacional predeterminada en /config.json .
Puede cambiarlo en su aplicación por App::Config()->locale = 'your_locale';
Para trabajar con la sesión de PHP, DeJFramework proporciona la clase dejSession . Aquí hay algunos ejemplos sobre cómo usarlo:
//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 desea que una variable de sesión esté disponible solo en la siguiente solicitud, por ejemplo, un cierto mensaje de error, puede flotarlo en la sesión de así decirlo:
App:: session ()-> flash ([ ' message ' => ' Registered Successfully! ' ]);Y recuperarlo en la siguiente solicitud:
$ message = App:: session ()-> getFlash ( ' message ' ); Tenga en cuenta que los mensajes flash solo están disponibles en la siguiente solicitud y solo con ->getFlash() .
Puede establecer la sesión para expirar después de un tiempo definido desde el último acceso a la sesión:
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())A veces es posible que desee que su aplicación recuerde una instancia de un modelo para las próximas solicitudes. Por ejemplo, desea que su aplicación recuerde al usuario que ha iniciado sesión, o el carrito de compras que tiene su usuario, o cualquier otra cosa. Si almacena la clave principal del modelo que desea en la sesión y ejecuta una consulta para recuperarla en cada solicitud, podría ser tedioso. DeJFramework resuelve esto proporcionándole un rasgo que puede usar en sus modelos. Echa un vistazo:
class ShoppingCart extends dej mvc Model
{
use dej traits IsStateful;
.
.
.
}Ahora tiene un par de métodos más disponibles en su modelo:
//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.Ahora en la siguiente solicitud:
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. Para presentar sus datos al usuario, necesita una interfaz de usuario. En la web, la mayoría de las veces esto significa marcado HTML. En MVC, la lógica debe separarse de la interfaz de usuario, por lo que coloca su HTML en las vistas y solo incluye la lógica de presentación en ellos, como echo un valor o poner una matriz en una `` `` `` foreach '' para iterar sobre él. Para crear una vista, debe:
/app/views . Hay una vista incluida por defecto: 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!
}
}También puede proporcionar mensajes de error:
//in the controller
return App:: View ( ' user ' )-> withErrors ([ ' authorization ' => ' You are not allowed to view this user. ' ]);El marco representará la vista de salida y el resultado será:
<!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 >Ahora veamos otro ejemplo, ¿qué pasa si queremos crear una tabla de todos los usuarios? Edite su vista:
<!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 >Y luego tu controlador:
class IndexController extends dej mvc Controller
{
public static function index ()
{
$ users = User:: getAll ();
return App:: View ( ' user ' , [ ' users ' => $ users ]);
}
}¡Y vea el resultado por usted mismo!
Puede crear ver parciales y pegarlos (incluir) en otras vistas:
[/app/views/partials/header.phtml]
<!--begin header-->
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " >
< title > < ?= $data- > title ? > </ title >
</ head >
< body >
<!--end header--> y pegarlo en index.phtml :
[/app/views/index.phtml]
< ?php $this- > paste('partials/header'); ? >
< h2 > < ?= $data- > message ? > </ h2 >
.
.
.
</ html > La autenticación es un asunto relacionado con la aplicación. Puede ser muy diferente en cada aplicación, por lo que DeJFramework no lo implementa en el marco en sí, en su lugar, se le proporciona el modelo de usuario básico, las rutas de autenticación y la lógica del controlador que hace que la autenticación ocurra y sea libre de cambiarlo, o implementar su propia solución, la solución que se implementa en el marco utiliza el traje IsStateful en el modelo de usuario y usa $user->remember() para mantener el usuario en la sesión en la sesión. Lo único que debe hacer es establecer 'default_auth_model' en config.json para poder usar App::Request->user() a ::retrieve() El usuario de la sesión utilizando el rasgo IsStateful .
Eche un vistazo al controlador, modelo y vistas que se proporcionan en el marco para la autenticación para comprender sus funcionamientos. Y cambie/mejore/elimínelo como desee.
Nota: Para que el modelo de usuario funcione correctamente, debe crear una tabla llamada users con 2 campos:
TABLE: users
FIELD TYPE
id int, autoincrement
username varchar
password varchar(255) //password hashing system requires 255