Kerangka kerja PHP yang ringan dan mudah digunakan.
Dejframework adalah kerangka kerja MVC PHP yang sederhana dan minimal yang berfokus pada keringkasan, kesederhanaan, dan pemahaman. Sintaksnya terutama terinspirasi dari Laravel. Dejframework dikembangkan oleh ATA Marzban untuk proyek akhir gelar Sarjana.
#Instalasi
composer install di direktori root.Agar kerangka kerja mengetahui apa yang harus dilakukan ketika permintaan datang, Anda harus mengatur rute untuk aplikasi Anda di /app/routes.php. Itu dilakukan dengan mudah.
Rute terdiri dari metode HTTP, URL, dan tujuan yang harus dijalankan jika permintaan dibuat dengan metode yang ditentukan ke URL yang ditentukan. Tidak ada yang dieksekusi tanpa pengaturan rute. Anda dapat melewati penutupan sebagai tujuan:
[/app/routes.php]
Route:: set ( " GET " , " / " , function (){
return " Hello World! " ;
});Kode ini akan menghasilkan "Hello World" jika Anda mengunjungi situs Anda di yourite.com.
[/app/routes.php]
Route:: set ( " GET " , " /some/url " , function (){
return " This is some url! " ;
});Kode ini akan menghasilkan "Ini URL!" Jika Anda mengunjungi situs Anda di milik Anda.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. " ;
});Kode ini akan dieksekusi jika Anda mengunjungi milik Anda.com/do/something dengan metode postingan. (dari formulir atau panggilan API)
Anda dapat mengembalikan string, objek, array atau tampilan (dibahas nanti) di penutupan atau pengontrol Anda. String akan output secara langsung, sedangkan objek atau tampilan akan secara otomatis dikonversi ke JSON dan output, dan tampilan akan diberikan ke output.
Di bagian selanjutnya Anda akan belajar cara mengarahkan rute ke pengontrol alih -alih penutupan.
Ini dianggap sebagai praktik terbaik dalam pola MVC bahwa logika aplikasi harus dimasukkan ke dalam pengontrol.
[/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! " ;
}
}PENTING: Seperti yang dapat Anda lihat pada contoh di atas, agar Autoloader PSR-0 berfungsi dengan benar, Anda harus mengikuti konvensi berikut saat menambahkan kelas apa pun ke aplikasi Anda:
Sekarang mari kita lanjutkan belajar cara membuat pengontrol berfungsi:
[/app/routes.php]
Route:: set ( " GET " , " / " , " YourController@YourAction " );Tindakan yang ditentukan pada pengontrol yang ditentukan akan dieksekusi ketika rute memicu.
Kelas yang terus -menerus membuat kelas dan memberikan ketergantungan kepada mereka dapat menjadi tugas yang berulang dalam pengembangan PHP. Penyedia layanan dej aplikasi bertujuan untuk membuat proses ini kering mungkin. Menggunakan penyedia layanan ini, Anda tidak perlu menambahkan pernyataan penggunaan di setiap file dan meneruskan dependensi. Ambil contoh ini:
/**
* 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 ;Dan ini harus diulang setiap kali Anda ingin menggunakan pembangun kueri. Sekarang, menggunakan penyedia layanan:
use dej App ;
return App:: Query ()-> select ()-> from ( ' some_table ' );Itu saja! Lihatlah dej/app.php untuk melihat cara kerjanya. Metode statis bernama 'kueri' dipanggil pada kelas aplikasi. Ini membuat kelas kueri dan melewati instance koneksi sebagai parameter konstruktor untuk itu. Sepotong kue!
#Request the dejhttpRequest Class membuat berinteraksi dengan permintaan mudah, lihatlah AA pada contoh -contoh berikut:
//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 Kelas dejhttpResponse membuat parameter respons pengaturan, Anda harus mengembalikan respons di pengontrol Anda jika Anda ingin mengatur kode respons atau header http, lihat AA pada contoh -contoh berikut:
class IndexController extends dej mvc Controller
{
public static function index ()
{
return App:: Response ()-> code ( 404 )-> header ( ' HTTP/1.1 404 Not Found ' );
}
}Anda dapat mengarahkan ulang dengan mudah:
//in the controller
return App:: Response ()-> redirect ( ' /login ' );
//redirect with errors
App:: Response ()-> redirect ( ' / ' )-> withErrors ([ ' login ' => ' login unsuccessful! maybe password is wrong. ' ]);Redirecting dengan kesalahan memalsukan kesalahan ke sesi (dibahas nanti).
Konfigurasi: Pertama masukkan konfigurasi database di /config.json . Dejframework berurusan dengan database dalam arsitektur 3-lapis:
Layer 1 - Objek Koneksi Basis Data: Ini memperluas kelas abstrak singleton. Apa artinya itu hanya dipakai sekali, pertama kali disebut. Beberapa layanan lain di dejframework juga seperti ini. Untuk mencegah overhead menghubungkan ke DB setiap kali Anda ingin menjalankan kueri. Inilah cara Anda dapat menggunakannya:
//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 " ]); Anda dapat melakukan ini di mana saja, asalkan Anda telah menambahkan use dejApp; .
Layer 2 - Query Builder: Kelas ini membangun kueri dan menggunakan kelas koneksi untuk menjalankannya menggunakan pernyataan yang disiapkan aman. Ini harus dipakai untuk setiap kueri baru, ini dilakukan untuk Anda oleh /dej /aplikasi secara otomatis setiap kali Anda mengetik App::Query() , seperti yang kita lihat di contoh bagian povider layanan. Anda dapat membangun kueri dengan itu menggunakan rantai metode. Lihatlah contoh -contoh di bawah ini:
$ 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 (); As you can see, using the dej Query Builder is simple, use call App::Query() and it automatically passes a new, dependency injected Query class to you, and then you chain methods on it to add conditions of your liking to it, such as select(), from() and so on, then finally, you use one of the get methods to fetch either the top result ( getOne() ), All results ( getAll() ), All results as JSON ( getJson() ), atau kueri yang dibangun ( getQuery() ). Hasilnya diambil dalam format stdclass yang dapat Anda gunakan dengan mudah. Perlu dicatat bahwa tanpa menggunakan salah satu metode GET di akhir Anda permintaan, hasilnya tidak akan diambil. Juga, Anda dapat rantai metode pada beberapa baris dan dalam beberapa langkah, misalnya, untuk mengubahnya dengan beberapa kondisi:
$ query = App:: Query ()-> select ();
if ( $ somecondition == true ) $ query -> from ( ' users ' );
else $ query -> from ( ' another_table ' );
$ result = $ query -> getAll ();Mari kita lihat metode lain yang tersedia di pembangun kueri dalam contoh -contoh berikut:
//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 (); Perhatikan bahwa kueri yang tidak mengembalikan hasil, harus dieksekusi dengan php execute() dan secara otomatis akan mengembalikan jumlah baris yang terpengaruh.
//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 ();Perhatikan bahwa hapus atau perbarui kueri dapat mengakibatkan hilangnya data jika tidak ada klausa di mana diberikan, sebagai tindakan keamanan, dejframework akan melempar pengecualian jika mengalami situasi seperti itu. Harap jalankan pertanyaan seperti itu menggunakan kelas koneksi secara manual.
Layer 3 - Pemetaan Objek -Relasional: ORM akan dibahas di bagian selanjutnya.
Menurut Wikipedia:
Object-Relational Mapping (ORM) ... adalah teknik pemrograman untuk mengkonversi data antara sistem tipe yang tidak kompatibel dalam bahasa pemrograman yang berorientasi objek. Ini menciptakan, pada dasarnya, "database objek virtual" yang dapat digunakan dari dalam bahasa pemrograman.
Karena dejframework bekerja dalam arsitektur MVC, ketekunan data terkandung dalam komponen model MVC. Model terkait dengan entitas dalam aplikasi Anda, seperti pengguna, pembelian, produk, dll. Dalam sistem belanja. Mereka perlu disimpan dan diambil ke dan dari database. Basis data relasional bekerja dalam bahasa SQL, dan dejframework, seperti kebanyakan kerangka kerja beroperasi dalam lingkungan yang berorientasi objek. Dan kode SQL di tengah kode PHP dianggap tidak praktek terbaik. Dengan demikian, Dejframework mencoba memisahkan Anda dari kode SQL dalam 3 level, 2 di antaranya diuraikan di bagian sebelumnya, sekarang kita akan melihat bagaimana bekerja dengan model:
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 ;
.
.
.
} Perhatikan bahwa properti id didefinisikan dalam kelas /dej/mvc/Model yang diperluas oleh model Anda. Jadi, jika Anda ingin model Anda memiliki ID, tidak perlu mendefinisikannya lagi.
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 ;
.
.
.
}Itu saja untuk saat ini, asalkan Anda telah mengatur konfigurasi ini dengan benar, Anda akan dapat menggunakan metode ORM pada model Anda. Lihatlah contoh -contoh di bawah ini:
//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 ();ORM menggunakan pembangun kueri DEJ di bawahnya, untuk menghasilkan kueri yang diperlukan.
Perhatikan bahwa create (), update (), dan delete () Return ROW yang dapat Anda periksa untuk melihat apakah operasi berhasil.
//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 ();Perhatikan bahwa fungsi -fungsi ini berfungsi dengan kunci utama catatan.
//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. Validasi data dalam dejFramework ditangani oleh kelas dejValidator . Anda dapat menggunakannya dengan berbagai cara:
App::Validator() yang memberi Anda instance singleton. Ia menerima 2 parameter: nilai yang akan divalidasi. (String, int, array, objek) dan seperangkat aturan untuk memvalidasi data terhadap.Mari kita lihat cara kerjanya:
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 ' ); Metode validate() mengembalikan array. Jika tidak ada kesalahan validasi dan data valid, itu akan menjadi array kosong. Jadi Anda dapat memeriksa apakah data tersebut valid dengan empty() . Jika ada kesalahan validasi, Anda akan melihatnya di 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 );Inilah yang akan dikeluarkan oleh kode di atas:
array
0 => 'This Field should be an email'
1 => 'This Field should be less than 10'
Sekarang dengan objek:
$ errors = App:: Validator ()-> validate ( $ obj , [ ' email ' => ' required|string|email ' ,
' password ' => ' required|string ' ,
' age ' => ' int ' ]);
var_dump ( $ errors );Keluaran:
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'
Seperti yang Anda lihat, jika Anda meneruskan objek atau array ke validator, itu akan mengembalikan kesalahan yang terkait dengan masing -masing bidang dalam array asosiatif di mana tombolnya adalah nama lapangan dan nilainya adalah array yang berisi kesalahan yang terkait dengan bidang itu.
validate() pada objek permintaan. $ errors = App:: Request ()-> validate ([ ' email ' => ' required|string|email ' ,
' password ' => ' required|string|min:10|max:100 ' ]);
var_dump ( $ errors ); Mengunjungi yoursite.local/?email=notanemail&password=123 akan menghasilkan:
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 " ];
.
.
.
}Sekarang Anda dapat memvalidasi contoh model:
$ user = User:: getById ( 11 );
$ errors = $ user -> validate (); //returns errors in array like the previous examples.
$ isValid = $ user -> isValid (); //returns true or falseKetika Anda memiliki kesalahan, Anda dapat meneruskannya ke tampilan untuk ditampilkan, atau mengarahkan kembali ke suatu tempat dengan mereka:
//in the controller
$ errors = $ user -> validate ();
if (! empty ( $ errors )) return App:: Response ()-> redirect ( ' / ' )-> withErrors ( $ errors ); Pesan validasi yang Anda lihat dalam contoh sebelumnya adalah pesan default, bagaimana jika Anda ingin mengubahnya, atau, memiliki pesan validasi dalam bahasa Anda sendiri? Lihatlah /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 " ,
]; Anda dapat melihat bahwa kunci sesuai dengan jenis validasi, dan nilainya adalah pesan validasi. Variabel termasuk dalam pesan dengan 'S'. Di /app/locale , Anda dapat membuat direktori sendiri untuk bahasa pilihan Anda dan di direktori itu, memiliki pesan validasi Anda sendiri dengan variabel.
Anda dapat mengatur lokal default di /config.json .
Anda dapat mengubahnya di aplikasi Anda dengan App::Config()->locale = 'your_locale';
Untuk bekerja dengan sesi PHP, DejFramework menyediakan kelas dejSession . Berikut adalah beberapa contoh tentang cara menggunakannya:
//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 ' );Jika Anda ingin variabel sesi tersedia hanya dalam permintaan berikutnya, misalnya, pesan kesalahan tertentu, Anda dapat mem -flashnya ke sesi seperti ini:
App:: session ()-> flash ([ ' message ' => ' Registered Successfully! ' ]);Dan mengambilnya dalam permintaan berikutnya:
$ message = App:: session ()-> getFlash ( ' message ' ); Perhatikan bahwa pesan flash hanya tersedia dalam permintaan berikutnya dan hanya dengan ->getFlash() .
Anda dapat mengatur sesi untuk kedaluwarsa setelah waktu yang ditentukan sejak akses terakhir ke sesi:
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())Terkadang Anda mungkin ingin aplikasi Anda mengingat contoh model untuk permintaan berikutnya. Misalnya, Anda ingin aplikasi Anda mengingat pengguna yang masuk, atau keranjang belanja yang dimiliki pengguna Anda, atau apa pun. Jika Anda menyimpan kunci utama model yang Anda inginkan dalam sesi dan menjalankan kueri untuk mengambilnya di setiap permintaan, itu mungkin membosankan. Dejframework memecahkan ini dengan memberi Anda sifat yang dapat Anda gunakan dalam model Anda. Lihatlah:
class ShoppingCart extends dej mvc Model
{
use dej traits IsStateful;
.
.
.
}Sekarang Anda memiliki beberapa metode lagi yang tersedia dalam model Anda:
//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.Sekarang dalam permintaan berikutnya:
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. Untuk menyajikan data Anda kepada pengguna, Anda memerlukan antarmuka pengguna. Di web, sebagian besar waktu ini berarti markup HTML. Dalam MVC, logika harus dipisahkan dari UI, jadi Anda menempatkan HTML Anda dalam pandangan dan hanya menyertakan logika presentasi di dalamnya, seperti echo nilai atau menempatkan array ke dalam `` foreach`` untuk mengulanginya. Untuk membuat tampilan, Anda harus:
/app/views . Ada satu tampilan yang disertakan secara default: 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!
}
}Anda juga dapat memberikan pesan kesalahan:
//in the controller
return App:: View ( ' user ' )-> withErrors ([ ' authorization ' => ' You are not allowed to view this user. ' ]);Kerangka kerja akan membuat tampilan ke output dan hasilnya adalah:
<!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 >Sekarang mari kita lihat contoh lain, bagaimana jika kita ingin membuat tabel semua pengguna? Edit pandangan Anda:
<!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 >Dan kemudian pengontrol Anda:
class IndexController extends dej mvc Controller
{
public static function index ()
{
$ users = User:: getAll ();
return App:: View ( ' user ' , [ ' users ' => $ users ]);
}
}Dan lihat hasilnya sendiri!
Anda dapat membuat tampilan parsial dan pasta (termasuk) mereka dalam pandangan lain:
[/app/views/partials/header.phtml]
<!--begin header-->
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " >
< title > < ?= $data- > title ? > </ title >
</ head >
< body >
<!--end header--> dan menempelkannya di index.phtml :
[/app/views/index.phtml]
< ?php $this- > paste('partials/header'); ? >
< h2 > < ?= $data- > message ? > </ h2 >
.
.
.
</ html > Otentikasi adalah masalah terkait aplikasi. Ini bisa sangat berbeda dalam setiap aplikasi, sehingga dejframework tidak mengimplementasikannya dalam kerangka itu sendiri, sebaliknya, Anda diberikan dengan model pengguna dasar, rute auth dan logika pengontrol yang membuat otentikasi terjadi dan Anda bebas untuk mengubahnya, atau mengimplementasikan solusi Anda sendiri-solusi yang diimplementasikan dalam kerangka kerja) menggunakan IsStateful , menggunakan solusi Pengguna dan menggunakan $user->remember() . Satu-satunya hal yang perlu Anda lakukan adalah mengatur 'default_auth_model' di config.json untuk dapat menggunakan App::Request->user() ke ::retrieve() Pengguna dari sesi menggunakan sifat IsStateful .
Lihatlah pengontrol, model, dan pandangan yang disediakan dalam kerangka kerja untuk otentikasi untuk memahami cara kerja. dan ubah/tingkatkan/hapus sesuka Anda.
Catatan: Agar model pengguna berfungsi dengan benar, Anda perlu membuat tabel bernama users dengan 2 bidang:
TABLE: users
FIELD TYPE
id int, autoincrement
username varchar
password varchar(255) //password hashing system requires 255