Ein leichtes und einfach zu bedienendes PHP -Framework.
DejFramework ist ein einfaches und minimales PHP -MVC -Framework, das sich auf SUKTIVE, Einfachheit und Verständlichkeit konzentriert. Die Syntax ist hauptsächlich von Laravel inspiriert. Dejframework wurde von ATA Marzban für das letzte Projekt des Bachelor -Abschlusses entwickelt.
#Installation
composer install .Damit das Framework zu wissen ist, was zu tun ist, wenn eine Anfrage kommt, sollten Sie Routen für Ihre Anwendungen in /app/routes.php festlegen. Es ist leicht gemacht.
Eine Route besteht aus einer HTTP -Methode, einer URL und dem Ziel, das ausgeführt werden sollte, wenn eine Anforderung mit der angegebenen Methode zur angegebenen URL gestellt wird. Nichts wird ausgeführt, ohne Routen zu setzen. Sie können eine Schließung als Ziel bestehen:
[/app/routes.php]
Route:: set ( " GET " , " / " , function (){
return " Hello World! " ;
});Dieser Code gibt "Hello World" aus, wenn Sie Ihre Website auf Ihrer Site.com besuchen.
[/app/routes.php]
Route:: set ( " GET " , " /some/url " , function (){
return " This is some url! " ;
});Dieser Code gibt Ausgabe "Dies ist eine URL!" Wenn Sie Ihre Website unter Ihrer Site.com/some/url besuchen.
[/app/routes.php]
Route:: set ( " POST " , " /do/something " , function (){
return " Here you should write your own code to do the things you want. " ;
});Dieser Code wird ausgeführt, wenn Sie mit der Post -Methode Ihre Site.com/do/Something besuchen. (aus einem Formular oder einem API -Anruf)
Sie können Zeichenfolgen, Objekte, Arrays oder Ansichten (später besprochen) in Ihren Schließungen oder Controllern zurückgeben. Die String wird direkt ausgegeben, während Objekte oder Ansichten automatisch in JSON und Ausgabe konvertiert werden und Ansichten zur Ausgabe gerendert werden.
Im nächsten Teil lernen Sie, wie Sie Routen zu Controllern anstelle von Schließungen lenken.
Es wird als bewährte Verfahren im MVC -Muster angesehen, dass die Anwendungslogik in Controller eingesetzt werden sollte.
[/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! " ;
}
}Wichtig: Wie Sie im obigen Beispiel sehen können, sollten Sie die folgenden Konventionen befolgen, wenn der PSR-0-Autoloader korrekt funktioniert, wenn Sie Ihrer Anwendung eine Klasse hinzufügen:
Lassen Sie uns nun weiter lernen, wie man Controller zum Laufen bringt:
[/app/routes.php]
Route:: set ( " GET " , " / " , " YourController@YourAction " );Die angegebene Aktion auf den angegebenen Controller wird ausgeführt, wenn die Route ausgelöst wird.
Das ständige Instanziieren von Klassen und die Übergabe von Abhängigkeiten an sie kann zu einer sich wiederholenden Aufgabe bei der PHP -Entwicklung werden. Der dej App -Dienstanbieter soll diesen Prozess so trocken wie möglich machen. Mit diesem Dienstanbieter müssen Sie in jeder Datei keine Verwendungsanweisungen hinzufügen und Abhängigkeiten übergeben. Nehmen Sie dieses Beispiel:
/**
* 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 ;Und dies sollte jedes Mal wiederholt werden, wenn Sie den Query Builder verwenden möchten. Verwenden Sie nun den Dienstanbieter:
use dej App ;
return App:: Query ()-> select ()-> from ( ' some_table ' );Das war's! Schauen Sie sich dej/app.php an, um zu sehen, wie es funktioniert. Eine statische Methode namens "Query" wird in der App -Klasse aufgerufen. Es instanziiert die Abfrageklasse und übergibt eine Verbindungsinstanz als Konstruktorparameter an sie. Stück Kuchen!
#Request Die dejhttpRequest -Klasse macht die Interaktion mit der Anfrage einfach und sehen Sie sich die folgenden Beispiele an:
//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 Die dejhttpResponse macht die Einstellung der Antwortparameter einfach.
class IndexController extends dej mvc Controller
{
public static function index ()
{
return App:: Response ()-> code ( 404 )-> header ( ' HTTP/1.1 404 Not Found ' );
}
}Sie können leicht umleiten:
//in the controller
return App:: Response ()-> redirect ( ' /login ' );
//redirect with errors
App:: Response ()-> redirect ( ' / ' )-> withErrors ([ ' login ' => ' login unsuccessful! maybe password is wrong. ' ]);Das Umleiten mit Fehlern blitzt die Fehler in die Sitzung (später besprochen).
Konfiguration: Geben Sie zuerst die Datenbankkonfiguration in /config.json ein. DejFramework befasst sich mit Datenbanken in einer 3-Schicht-Architektur:
Layer 1 - Datenbankverbindungsobjekt: Dies erweitert die Singleton abstrakte Klasse. Das bedeutet, dass es nur einmal instanziiert wird, das erste Mal, dass es aufgerufen wird. Einige andere Dienste für Dejframework sind auch so. Um den Overhead zu verhindern, dass sich jedes Mal eine Anfrage an die DB anschließt. So können Sie es verwenden:
//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 " ]); Sie können dies überall tun, vorausgesetzt, Sie haben use dejApp; .
Layer 2 - Abfrage Builder: Diese Klasse erstellt Abfragen und verwendet die Verbindungsklasse, um sie mit sicheren vorbereiteten Anweisungen auszuführen. Es sollte für jede neue Abfrage instanziiert werden. Dies geschieht für Sie von /dej /App bei jedem Eingeben von App::Query() , genau wie wir im Service POVIDER -Abschnitt gesehen haben. Sie können Abfragen mit der Methodenverkettung erstellen. Schauen Sie sich die folgenden Beispiele an:
$ 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 (); Wie Sie sehen können, ist die Verwendung des Dej Query Builders einfach, verwenden Sie Call App :: Query () und gibt automatisch eine neue, abhängige Abfrageklasse an getOne() weiter, getAll() die Bedingungen für Ihren Geschmack hinzuzufügen. getJson() ) oder die konstruierte Abfrage ( getQuery() ). Die Ergebnisse sind im STD -Class -Format abgerufen, das Sie problemlos verwenden können. Es ist erwähnenswert, dass die Ergebnisse ohne eine der GET -Methoden am Ende Ihrer Abfrage nicht abgerufen werden. Außerdem können Sie Methoden in mehreren Linien und in mehreren Schritten ketten, um sie beispielsweise durch eine Bedingung zu ändern:
$ query = App:: Query ()-> select ();
if ( $ somecondition == true ) $ query -> from ( ' users ' );
else $ query -> from ( ' another_table ' );
$ result = $ query -> getAll ();Sehen wir uns in den folgenden Beispielen andere Methoden des Query Builders an:
//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 (); Beachten Sie, dass Abfragen, die die Ergebnisse nicht zurückgeben, mit php execute() ausgeführt werden müssen und die Anzahl der betroffenen Zeilen automatisch zurückgibt.
//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 ();Beachten Sie, dass Löschen oder Aktualisierungsabfragen zu Datenverlusten führen können, wenn keine Where -Klausel vorgesehen ist. Als Sicherheitsmaßnahme wird DejFramework eine Ausnahme ausgelöst, wenn sie auf eine solche Situation stößt. Bitte führen Sie solche Abfragen mit der Verbindungsklasse manuell aus.
Layer 3 - Objektrelationszuordnung: ORM wird im nächsten Abschnitt erörtert.
Nach Wikipedia:
Die Objektrelationszuordnung (ORM) ... ist eine Programmierungstechnik zum Konvertieren von Daten zwischen in nicht kompatiblen Typsystemen in objektorientierten Programmiersprachen. Dadurch wird tatsächlich eine "virtuelle Objektdatenbank" erstellt, die aus der Programmiersprache verwendet werden kann.
Da DejFramework in einer MVC -Architektur funktioniert, ist die Datenpersistenz in der Modellkomponente von MVC enthalten. Modelle beziehen sich auf die Entitäten in Ihrer Anwendung, z. B. einen Benutzer, einen Kauf, ein Produkt usw. in einem Einkaufssystem. Sie müssen gespeichert und aus der Datenbank abgerufen werden. Relationale Datenbanken funktionieren in der SQL-Sprache und DejFramework, wie die meisten Frameworks in einer objektorientierten Umgebung arbeiten. Und SQL-Code in der Mitte des PHP-Code gilt nicht als Best-Praction. So versucht Dejframework Sie von SQL Code in 3 Ebenen zu trennen. 2 davon wurden im vorherigen Abschnitt ausgearbeitet. Jetzt werden wir sehen, wie man mit Modellen funktioniert:
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 ;
.
.
.
} Beachten Sie, dass die id -Eigenschaft in der /dej/mvc/Model definiert ist, die Ihre Modelle erweitern. Wenn Sie also möchten, dass Ihr Modell eine ID hat, müssen Sie es nicht erneut definieren.
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 ;
.
.
.
}Das war es vorerst, vorausgesetzt, Sie haben diese Konfigurationen korrekt festgelegt, können Sie die ORM -Methoden für Ihre Modelle verwenden. Schauen Sie sich die folgenden Beispiele an:
//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 ();Der ORM verwendet den Dej -Query -Bauunternehmer darunter, um die erforderlichen Abfragen zu generieren.
Beachten Sie, dass create (), update () und delete () betroffene Zeilen zurückgeben, die Sie überprüfen können, um festzustellen, ob der Vorgang erfolgreich war.
//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 ();Beachten Sie, dass diese Funktionen mit dem Hauptschlüssel der Datensätze funktionieren.
//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. Die Datenvalidierung in Dejframework wird von der dejValidator -Klasse behandelt. Sie können es auf verschiedene Arten verwenden:
App::Validator() verwenden, wodurch Sie die Singleton -Instanz davon erhalten. Es akzeptiert 2 Parameter: ein zu validierter Wert . (String, Int, Array, Objekt) und eine Reihe von Regeln , um die Daten gegen zu validieren.Mal sehen, wie es funktioniert:
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 ' ); Die validate() -Methode gibt ein Array zurück. Wenn es keine Validierungsfehler gibt und die Daten gültig sind, ist es ein leeres Array. Sie können also überprüfen, ob die Daten mit empty() gültig sind. Wenn es irgendwelche Validierungsfehler gibt, sehen Sie sie im Array.
//The rules have changed
$ errors = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|email|min:5|max:10 " );
var_dump ( $ errors );Dies ist, was der obige Code ausgibt:
array
0 => 'This Field should be an email'
1 => 'This Field should be less than 10'
Nun mit einem Objekt:
$ errors = App:: Validator ()-> validate ( $ obj , [ ' email ' => ' required|string|email ' ,
' password ' => ' required|string ' ,
' age ' => ' int ' ]);
var_dump ( $ errors );Ausgabe:
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'
Wie Sie sehen können, werden die Fehler, die mit jedem Feld in einem assoziativen Array in Bezug auf jedes Feld in jedem Feld übergeben, in einem assoziativen Array, in dem die Schlüssel auf Feldnamen sind, und die Werte, die mit diesem Feld verbundene Fehler enthalten sind.
validate() -Methode im Anforderungsobjekt validieren. $ errors = App:: Request ()-> validate ([ ' email ' => ' required|string|email ' ,
' password ' => ' required|string|min:10|max:100 ' ]);
var_dump ( $ errors ); Besuchen Sie 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 " ];
.
.
.
}Jetzt können Sie Instanzen der Modelle validieren:
$ user = User:: getById ( 11 );
$ errors = $ user -> validate (); //returns errors in array like the previous examples.
$ isValid = $ user -> isValid (); //returns true or falseWenn Sie Ihre Fehler haben, können Sie sie an die Ansicht übergeben, um sie anzuzeigen oder mit ihnen irgendwohin umzuleiten:
//in the controller
$ errors = $ user -> validate ();
if (! empty ( $ errors )) return App:: Response ()-> redirect ( ' / ' )-> withErrors ( $ errors ); Die Validierungsmeldungen, die Sie in den vorherigen Beispielen gesehen haben, waren Standardnachrichten. Was ist, wenn Sie sie ändern oder Validierungsnachrichten in Ihrer eigenen Sprache haben möchten? Schauen Sie sich /app/locale/en/validation/messages.php an:
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 " ,
]; Sie können sehen, dass die Taste dem Validierungstyp entsprechen und die Werte Validierungsnachrichten sind. Variablen sind in den Nachrichten mit 's' enthalten. In /app/locale können Sie Ihr eigenes Verzeichnis für die Sprache Ihrer Wahl erstellen und in diesem Verzeichnis Ihre eigenen Validierungsnachrichten mit Variablen haben.
Sie können das Standard -Gebietsschema in /config.json festlegen.
Sie können es in Ihrer App durch App::Config()->locale = 'your_locale';
Um mit der PHP -Sitzung zu arbeiten, stellt DejFramework die dejSession bereit. Hier sind einige Beispiele, wie man es benutzt:
//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 ' );Wenn Sie möchten, dass eine Sitzungsvariable nur in der nächsten Anforderung verfügbar ist, z. B. einer bestimmten Fehlermeldung, können Sie sie auf die Sitzung wie folgt flashen:
App:: session ()-> flash ([ ' message ' => ' Registered Successfully! ' ]);Und in der nächsten Anfrage abrufen:
$ message = App:: session ()-> getFlash ( ' message ' ); Beachten Sie, dass Flash -Nachrichten nur in der nächsten Anforderung und nur mit ->getFlash() verfügbar sind.
Sie können die Sitzung so festlegen, dass sie nach einer definierten Zeit seit dem letzten Zugriff auf die Sitzung abläuft:
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())Manchmal möchten Sie möglicherweise, dass Ihre Bewerbung eine Instanz eines Modells für die nächsten Anfragen erinnert. Sie möchten beispielsweise, dass Ihre App an den Benutzer, der angemeldet ist, oder den Einkaufswagen, den Ihr Benutzer hat, oder irgendetwas anderes. Wenn Sie den Primärschlüssel des Modells in der Sitzung speichern und eine Abfrage ausführen, um es in jeder Anfrage abzurufen, kann dies mühsam werden. DejFramework löst dies, indem Sie Ihnen ein Merkmal zur Verfügung stellen, das Sie in Ihren Modellen verwenden können. Schauen Sie sich an:
class ShoppingCart extends dej mvc Model
{
use dej traits IsStateful;
.
.
.
}Jetzt haben Sie noch ein paar weitere Methoden in Ihrem Modell:
//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.Jetzt in der nächsten Anfrage:
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. Um Ihre Daten dem Benutzer zu präsentieren, benötigen Sie eine Benutzeroberfläche. Im Internet bedeutet dies die meiste Zeit HTML -Markup. In MVC muss die Logik von der Benutzeroberfläche getrennt werden, sodass Sie Ihre HTML in Ansichten einfügen und nur eine Präsentationslogik in sie einfügen, z echo Um eine Ansicht zu erstellen, sollten Sie:
/app/views . Standardmäßig ist eine Ansicht enthalten: 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!
}
}Sie können auch Fehlermeldungen angeben:
//in the controller
return App:: View ( ' user ' )-> withErrors ([ ' authorization ' => ' You are not allowed to view this user. ' ]);Das Framework wird die Ansicht auf die Ausgabe übertragen, und das Ergebnis wird:
<!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 >Lassen Sie uns nun ein anderes Beispiel sehen, was ist, wenn wir eine Tabelle aller Benutzer erstellen möchten? Bearbeiten Sie Ihre Ansicht:
<!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 >Und dann dein Controller:
class IndexController extends dej mvc Controller
{
public static function index ()
{
$ users = User:: getAll ();
return App:: View ( ' user ' , [ ' users ' => $ users ]);
}
}Und sehen Sie sich das Ergebnis selbst!
Sie können Ansichten ansehen und in anderen Ansichten einfügen (enthalten):
[/app/views/partials/header.phtml]
<!--begin header-->
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " >
< title > < ?= $data- > title ? > </ title >
</ head >
< body >
<!--end header--> und fügen Sie es in index.phtml ein:
[/app/views/index.phtml]
< ?php $this- > paste('partials/header'); ? >
< h2 > < ?= $data- > message ? > </ h2 >
.
.
.
</ html > Die Authentifizierung ist eine anwendungsbezogene Angelegenheit. Es kann in jeder Anwendung sehr unterschiedlich sein, daher implementiert DejFramework es nicht im Framework selbst. Stattdessen erhalten Sie das grundlegende Benutzermodell, die Auth-Routen und die Controller-Logik, die die Authentifizierung ermöglicht, und Sie können es IsStateful haben, sie zu ändern oder Ihre eigene Lösung zu implementieren, die Lösung, die im Rahmen implementiert ist, $user->remember() im Rahmen. Das einzige, was Sie tun müssen, ist, 'default_auth_model' in config.json festzulegen, um App::Request->user() to ::retrieve() den Benutzer aus der Sitzung mit dem IsStateful -Merkmal zu verwenden.
Schauen Sie sich den Controller, das Modell und die Ansichten an, die im Framework für die Authentifizierung bereitgestellt werden, um zu verstehen, dass es sich um Arbeiten handelt. und ändern/verbessern/entfernen Sie es, wie Sie möchten.
Hinweis: Damit das Benutzermodell korrekt funktioniert, müssen Sie eine Tabelle mit dem Namen users mit 2 Feldern erstellen:
TABLE: users
FIELD TYPE
id int, autoincrement
username varchar
password varchar(255) //password hashing system requires 255