ضوء وسهل الاستخدام PHP.
Dejframework هو إطار بسيط وأقل الحد الأدنى من PHP MVC يركز على الوصول والبساطة والفهم. بناء الجملة مستوحى بشكل أساسي من لارافيل. تم تطوير Dejframework بواسطة Ata Marzban لمشروع درجة البكالوريوس النهائي.
#تثبيت
composer install في دليل الجذر.لكي يعرف الإطار ما يجب القيام به عندما يأتي الطلب ، يجب عليك تعيين طرق لتطبيقاتك في /app/routes.php. يتم ذلك بسهولة.
يتكون المسار من طريقة HTTP وعنوان URL والوجهة التي يجب تنفيذها إذا تم تقديم طلب باستخدام الطريقة المحددة إلى عنوان URL المحدد. لا يتم تنفيذ أي شيء بدون تعيين طرق. يمكنك تمرير الإغلاق كوجهة:
[/app/routes.php]
Route:: set ( " GET " , " / " , function (){
return " Hello World! " ;
});سيتم إخراج هذا الرمز "Hello World" إذا قمت بزيارة موقعك على موقعك.
[/app/routes.php]
Route:: set ( " GET " , " /some/url " , function (){
return " This is some url! " ;
});سيؤدي هذا الرمز إلى إخراج "هذا بعض عنوان URL!" إذا قمت بزيارة موقعك على موقعك الخاص
[/app/routes.php]
Route:: set ( " POST " , " /do/something " , function (){
return " Here you should write your own code to do the things you want. " ;
});سيتم تنفيذ هذا الرمز إذا قمت بزيارة موقعك الخاص (من نموذج أو مكالمة API)
يمكنك إرجاع السلاسل أو الكائنات أو المصفوفات أو المشاهدات (تمت مناقشتها لاحقًا) في عمليات الإغلاق أو وحدات التحكم. سيتم إخراج السلسلة مباشرة ، في حين سيتم تحويل الكائنات أو المشاهدات تلقائيًا إلى JSON والإخراج ، وسيتم تقديم طرق العرض إلى الإخراج.
في الجزء التالي ، ستتعلم كيفية توجيه الطرق إلى وحدات التحكم بدلاً من الإغلاق.
يعتبر أفضل الممارسات في نمط MVC ، يجب وضع منطق التطبيق في وحدات التحكم.
[/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! " ;
}
}هام: كما ترون في المثال أعلاه ، لكي يعمل جهاز PSR-0 Autoloader بشكل صحيح ، يجب عليك اتباع الاتفاقيات التالية عند إضافة أي فصل إلى تطبيقك:
الآن دعنا نستمر في تعلم كيفية جعل وحدات التحكم تعمل:
[/app/routes.php]
Route:: set ( " GET " , " / " , " YourController@YourAction " );سيتم تنفيذ الإجراء المحدد على وحدة التحكم المحددة عند تشغيل المسار.
يمكن أن تصبح الطبقات المستمرة في إنشاء فصول وتبعيات لها مهمة متكررة في تطوير PHP. يهدف مزود خدمة dej إلى جعل هذه العملية جافة قدر الإمكان. باستخدام مزود الخدمة هذا ، لا تحتاج إلى إضافة عبارات استخدام في كل ملف وتمرير التبعيات. خذ هذا المثال:
/**
* 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 ;ويجب تكرار ذلك في كل مرة تريد استخدام منشئ الاستعلام. الآن ، باستخدام مزود الخدمة:
use dej App ;
return App:: Query ()-> select ()-> from ( ' some_table ' );هذا كل شيء! ألقِ نظرة على DEJ/APP.PHP لمعرفة كيفية عملها. يتم استدعاء طريقة ثابتة تسمى "الاستعلام" على فئة التطبيق. يقوم بتثبيت فئة الاستعلام ويمرر مثيل اتصال كمعلمات مُنشئ لها. قطعة من الكعكة!
#Request يجعل فئة dejhttpRequest التفاعل مع الطلب سهلاً ، وإلقاء نظرة على الأمثلة التالية:
//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 dejhttpResponse فئة إعداد معلمات الاستجابة سهلة ، يجب عليك إرجاع استجابة في وحدة التحكم الخاصة بك إذا كنت ترغب في تعيين رموز استجابة HTTP أو رؤوسها ، قم بإلقاء نظرة على الأمثلة التالية:
class IndexController extends dej mvc Controller
{
public static function index ()
{
return App:: Response ()-> code ( 404 )-> header ( ' HTTP/1.1 404 Not Found ' );
}
}يمكنك إعادة توجيه بسهولة:
//in the controller
return App:: Response ()-> redirect ( ' /login ' );
//redirect with errors
App:: Response ()-> redirect ( ' / ' )-> withErrors ([ ' login ' => ' login unsuccessful! maybe password is wrong. ' ]);إعادة التوجيه مع الأخطاء تومض الأخطاء في الجلسة (تمت مناقشتها لاحقًا).
التكوين: أولاً أدخل تكوين قاعدة البيانات في /config.json . يتعامل Dejframework مع قواعد البيانات في بنية 3 طبقات:
الطبقة 1 - كائن اتصال قاعدة البيانات: هذا يمتد فئة Singleton Abstract. ما يعنيه ذلك هو أنه يتم إنشاء مثيل له مرة واحدة فقط ، في المرة الأولى التي يطلق عليها. بعض الخدمات الأخرى على dejframework مثل هذا أيضا. لمنع النفقات العامة للاتصال بالـ DB في كل مرة تريد فيها تشغيل استعلام. إليكم كيف يمكنك استخدامه:
//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 " ]); يمكنك القيام بذلك في أي مكان ، شريطة أن تكون قد أضفت use dejApp; .
Layer 2 - Builder Query: تقوم هذه الفئة بإنشاء استعلامات وتستخدم فئة الاتصال لتشغيلها باستخدام عبارات آمنة. يجب إنشاء مثيله لكل استعلام جديد ، يتم ذلك من أجلك بواسطة /DEJ /APP تلقائيًا في كل مرة تكتب فيها App::Query() ، تمامًا كما رأينا في مثال قسم POVIDER للخدمة. يمكنك بناء استفسارات معها باستخدام Method Caining. ألق نظرة على الأمثلة أدناه:
$ 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 (); كما ترون ، فإن استخدام منشئ استعلام DEJ بسيط ، استخدم تطبيق الاتصال :: QUERY () ويمرر تلقائيًا فئة استعلام جديدة تم حقنها لك ، ثم تقوم بسلسلة طرق لإضافة شروط من رغبتك في ذلك ، مثل SELECT () ، من getOne() ) ، وأخيراً ، يمكنك استخدام إحدى الطرق لإحضارها إما النتيجة ( getAll() . getJson() ) ، أو الاستعلام المبني ( getQuery() ). يتم جلب النتائج بتنسيق stdClass الذي يمكنك استخدامه بسهولة. تجدر الإشارة إلى أنه دون استخدام إحدى أساليب GET في نهاية الاستعلام ، لن يتم إحضار النتائج. أيضًا ، يمكنك سلسلة من الطرق على خطوط متعددة وفي خطوات متعددة ، على سبيل المثال ، لتغييرها حسب بعض الحالة:
$ query = App:: Query ()-> select ();
if ( $ somecondition == true ) $ query -> from ( ' users ' );
else $ query -> from ( ' another_table ' );
$ result = $ query -> getAll ();دعونا نرى طرقًا أخرى متوفرة على منشئ الاستعلام في الأمثلة التالية:
//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 (); لاحظ أن الاستعلامات التي لا تُرجع نتائجها ، يجب تنفيذها باستخدام php execute() وستعود تلقائيًا إلى عدد الصفوف المتأثرة.
//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 ();لاحظ أن استفسارات الحذف أو التحديث يمكن أن يؤدي إلى فقدان البيانات إذا لم يكن هناك شرط يتم توفيره ، كتدبير أمني ، سوف يلقي Dejframework استثناء إذا واجه مثل هذا الموقف. يرجى تشغيل مثل هذه الاستعلامات باستخدام فئة الاتصال يدويًا.
الطبقة 3 - رسم خرائط للكائنات: ستتم مناقشة ORM في القسم التالي.
حسب ويكيبيديا:
تعيين الكائنات العلمية (ORM) ... هي تقنية برمجة لتحويل البيانات بين أنظمة النوع غير المتوافقة في لغات البرمجة الموجهة للكائنات. هذا يخلق ، في الواقع ، "قاعدة بيانات كائن افتراضية" يمكن استخدامها من داخل لغة البرمجة.
نظرًا لأن Dejframework يعمل في بنية MVC ، فإن ثبات البيانات موجود في مكون النموذج في MVC. تتعلق النماذج بالكيانات الموجودة في التطبيق الخاص بك ، مثل المستخدم ، والشراء ، والمنتج ، وما إلى ذلك في نظام التسوق. يجب أن يتم حفظها واستعادتها من وإلى قاعدة البيانات. تعمل قواعد البيانات العلائقية في لغة SQL ، و Dejframework ، مثل معظم الأطر تعمل في بيئة موجهة نحو الكائن. ويعتبر رمز SQL في منتصف رمز PHP ليس أفضل ممارسة. وبالتالي ، يحاول Dejframework أن يفصلك عن رمز SQL في 3 مستويات ، تم وضع 2 منهم في القسم السابق ، والآن سنرى كيفية العمل مع النماذج:
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 ;
.
.
.
} لاحظ أن خاصية id محددة في فئة /dej/mvc/Model التي تمتد النماذج الخاصة بك. وبالتالي ، إذا كنت تريد أن يحتوي النموذج الخاص بك على معرف ، فلا داعي لتحديده مرة أخرى.
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 ;
.
.
.
}هذا كل شيء في الوقت الحالي ، شريطة أن تكون قد قمت بتعيين هذه التكوينات بشكل صحيح ، فستتمكن من استخدام طرق ORM في النماذج الخاصة بك. ألق نظرة على الأمثلة أدناه:
//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 منشئ استعلام DEJ أسفله ، لإنشاء الاستعلامات اللازمة.
لاحظ أن Create () و update () و delete () الإرجاع تتأثر بالصفوف التي يمكنك التحقق منها لمعرفة ما إذا كانت العملية ناجحة.
//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 ();لاحظ أن هذه الوظائف تعمل مع المفتاح الأساسي للسجلات.
//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. تتم معالجة التحقق من صحة البيانات في Dejframework بواسطة فئة dejValidator . يمكنك استخدامه بطرق مختلفة:
App::Validator() يقبل 2 معلمات: قيمة يجب التحقق منها. (سلسلة ، int ، صفيف ، كائن) ومجموعة من القواعد للتحقق من صحة البيانات ضد.دعونا نرى كيف يعمل:
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 ' ); طريقة validate() إرجاع صفيف. إذا لم تكن هناك أخطاء التحقق من الصحة وكانت البيانات صالحة ، فستكون مجموعة فارغة. لذلك يمكنك التحقق مما إذا كانت البيانات صالحة مع empty() . إذا كان هناك أي أخطاء في التحقق من الصحة ، فستراها في الصفيف.
//The rules have changed
$ errors = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|email|min:5|max:10 " );
var_dump ( $ errors );هذا ما سوف يخرجه الرمز أعلاه:
array
0 => 'This Field should be an email'
1 => 'This Field should be less than 10'
الآن مع كائن:
$ errors = App:: Validator ()-> validate ( $ obj , [ ' email ' => ' required|string|email ' ,
' password ' => ' required|string ' ,
' age ' => ' int ' ]);
var_dump ( $ errors );الإخراج:
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'
كما ترون ، إذا قمت بتمرير كائن أو صفيف إلى المدقق ، فسيقوم بإرجاع الأخطاء المتعلقة بكل حقل في صفيف نقابي حيث تكون المفاتيح أسماء الحقول والقيم التي تحتوي على أخطاء تتعلق بهذا الحقل.
validate() على كائن الطلب. $ errors = App:: Request ()-> validate ([ ' email ' => ' required|string|email ' ,
' password ' => ' required|string|min:10|max:100 ' ]);
var_dump ( $ errors ); زيارة 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 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 " ];
.
.
.
}الآن يمكنك التحقق من مثيلات النماذج:
$ user = User:: getById ( 11 );
$ errors = $ user -> validate (); //returns errors in array like the previous examples.
$ isValid = $ user -> isValid (); //returns true or falseعندما يكون لديك أخطاءك ، يمكنك تمريرها إلى العرض لعرضها ، أو إعادة التوجيه إلى مكان ما معهم:
//in the controller
$ errors = $ user -> validate ();
if (! empty ( $ errors )) return App:: Response ()-> redirect ( ' / ' )-> withErrors ( $ errors ); كانت رسائل التحقق التي رأيتها في الأمثلة السابقة هي الرسائل الافتراضية ، ماذا لو كنت تريد تغييرها ، أو لديك رسائل التحقق من الصحة في لغتك؟ ألق نظرة على /app/locale/en/validation/messages.php 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 " ,
]; يمكنك أن ترى أن المفتاح يتوافق مع نوع التحقق من الصحة ، والقيم هي رسائل التحقق من الصحة. يتم تضمين المتغيرات في الرسائل مع 's'. في /app/locale ، يمكنك إنشاء الدليل الخاص بك للغة التي تختارها وفي هذا الدليل ، لديك رسائل التحقق الخاصة بك مع المتغيرات.
يمكنك تعيين اللغة الافتراضية في /config.json .
يمكنك تغييره في التطبيق الخاص بك بواسطة App::Config()->locale = 'your_locale';
من أجل العمل مع جلسة PHP ، يوفر Dejframework فئة dejSession . فيما يلي بعض الأمثلة حول كيفية استخدامه:
//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 ' );إذا كنت تريد أن يكون متغير جلسة متاحًا فقط في الطلب التالي ، على سبيل المثال ، رسالة خطأ معينة ، يمكنك وميضها في الجلسة مثل هذه:
App:: session ()-> flash ([ ' message ' => ' Registered Successfully! ' ]);واسترداده في الطلب التالي:
$ message = App:: session ()-> getFlash ( ' message ' ); لاحظ أن رسائل الفلاش متوفرة فقط في الطلب التالي وفقط مع ->getFlash() .
يمكنك تعيين الجلسة لتنتهي صلاحيتها بعد وقت محدد منذ آخر وصول إلى الجلسة:
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())في بعض الأحيان ، قد ترغب في أن يتذكر تطبيقك مثيلًا لنموذج للطلبات التالية. على سبيل المثال ، تريد أن تتذكر التطبيق المستخدم الذي تم تسجيل الدخول ، أو عربة التسوق التي لدى المستخدم الخاص بك ، أو أي شيء آخر. إذا قمت بتخزين المفتاح الأساسي للنموذج الذي تريده في الجلسة وقمت بتشغيل استعلام لاسترداده في كل طلب ، فقد يصبح الأمر مملاً. يحل Dejframework هذا من خلال تزويدك بسمات يمكنك استخدامها في النماذج الخاصة بك. ألقِ نظرة:
class ShoppingCart extends dej mvc Model
{
use dej traits IsStateful;
.
.
.
}الآن لديك بضعة طرق أخرى متوفرة في النموذج الخاص بك:
//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.الآن في الطلب التالي:
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. لتقديم بياناتك إلى المستخدم ، تحتاج إلى واجهة مستخدم. في الويب ، معظم الوقت يعني هذا العلامات HTML. في MVC ، يجب فصل المنطق عن واجهة المستخدم ، لذلك تضع HTML في طرق العرض وتتضمن فقط منطق العرض التقديمي ، مثل echo القيمة أو وضع صفيف في "foreach" للتكرار فوقه. لإنشاء طريقة عرض يجب عليك:
/app/views . هناك عرض واحد مدرج افتراضيًا: 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!
}
}يمكنك توفير رسائل خطأ أيضًا:
//in the controller
return App:: View ( ' user ' )-> withErrors ([ ' authorization ' => ' You are not allowed to view this user. ' ]);سيقوم الإطار بتقديم العرض إلى الإخراج وستكون النتيجة:
<!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 >الآن دعنا نرى مثالًا آخر ، ماذا لو أردنا إنشاء جدول لجميع المستخدمين؟ تحرير وجهة نظرك:
<!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 >ثم وحدة التحكم الخاصة بك:
class IndexController extends dej mvc Controller
{
public static function index ()
{
$ users = User:: getAll ();
return App:: View ( ' user ' , [ ' users ' => $ users ]);
}
}وانظر النتيجة لنفسك!
يمكنك إنشاء عرض جزئي ولصق (تضمين) في وجهات نظر أخرى:
[/app/views/partials/header.phtml]
<!--begin header-->
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " >
< title > < ?= $data- > title ? > </ title >
</ head >
< body >
<!--end header--> ولصقه في index.phtml :
[/app/views/index.phtml]
< ?php $this- > paste('partials/header'); ? >
< h2 > < ?= $data- > message ? > </ h2 >
.
.
.
</ html > المصادقة هي مسألة متعلقة بالتطبيق. يمكن أن يكون الأمر مختلفًا للغاية في كل تطبيق ، لذلك لا يقوم Dejframework بتنفيذه في الإطار نفسه ، بدلاً من ذلك ، يتم تزويدك بنموذج المستخدم الأساسي ، أو طرق المصادقة ومنطق وحدة التحكم التي تجعل المصادقة تحدث وتتخلى عنها ، أو تنفيذ الحل الخاص بك ، والحل الذي يتم تنفيذه في الإطار يستخدم السمة IsStateful على نموذج المستخدم واستخدام $user->remember() . الشيء الوحيد الذي عليك القيام به هو تعيين 'default_auth_model' في config.json لتكون قادرًا على استخدام App::Request->user() إلى ::retrieve() المستخدم من الجلسة باستخدام سمة IsStateful .
ألقِ نظرة على وحدة التحكم ، والنموذج ، والوجهات التي يتم توفيرها في إطار المصادقة لفهم أعمالها. وتغيير/تحسين/إزالته كما تريد.
ملاحظة: لكي يعمل نموذج المستخدم بشكل صحيح ، تحتاج إلى إنشاء جدول يدعى users مع حقلين:
TABLE: users
FIELD TYPE
id int, autoincrement
username varchar
password varchar(255) //password hashing system requires 255