إطار عمل Micro PHP قابل للتكيف يحاول البقاء بعيدًا عن طريقك.
إلى حد كبير عمل مستمر ، استخدم على مسؤوليتك الخاصة ...
اليقين من الموت. فرصة صغيرة للنجاح. ماذا ننتظر؟
composer require danc0/gimliduck-php
قم بإنشاء مشروع هيكل عظمي مع: composer create-project danc0/gimli-skeleton
أضف devtools مع composer require --dev danc0/gimliduck-devtools
قم بإنشاء ملف .htaccess يبدو شيئًا كهذا لتوجيه طلبات إلى ملف index.php الخاص بك
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
إنشاء تطبيق gimliduck بسيط:
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use Gimli Application ;
use Gimli Router Route ;
Application:: create ( __DIR__ , $ _SERVER );
Route:: get ( ' / ' , function (){
echo " Hello World " ;
});
Application:: start ();هذا هو حقا كل ما تحتاجه للبدء. يمكنك إضافة المزيد مثل محرك القالب ، وملف التكوين ، وما إلى ذلك ، لكن ليس عليك ذلك.
<?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use Gimli Application ;
use App Core Config ;
use App Core Cache ;
define ( ' APP_ROOT ' , __DIR__ );
$ App = Application:: create ( APP_ROOT , $ _SERVER );
// set up your config and add it to the Application
$ config_file = parse_ini_file ( APP_ROOT . ' /App/Core/config.ini ' , true );
$ App -> Config = $ App -> Injector -> resolveFresh (Config::class, [ ' config ' => $ config_file ]);
// Register a cache class with the Injector
$ App -> Injector -> register (Cache::class, Cache:: getCache ( $ App -> Config -> admin_cache ));
// Run Application
$ App -> run (); تقوم فئة Application أيضًا بتسجيل معالج الأحداث الأساسي وفئة الجلسة عند إنشائها. بالإضافة إلى ذلك ، إذا كان التكوين الخاص بك يتضمن enable_latte فسيتم إضافة محرك قالب Latte إلى مثيل التطبيق باستخدام قيمة التكوين لـ template_base_dir كدليل قالب.
بشكل افتراضي ، سيتطلب Gimli أي ملفات في دليل App/Routes . يمكنك تعطيل ذلك عن طريق تعيين autoload_routes إلى false في ملف التكوين الخاص بك. يمكنك تغيير الدليل عن طريق تعيين قيمة route_directory في ملف التكوين الخاص بك. يمكنك أيضًا تحميل ملفات مسار إضافية مع الطريقة التالية:
// Load routes from a file(s)
$ App -> loadRouteFiles ([
' App/routes/web.php ' ,
]);هناك بعض الأشياء التي يمكنك القيام بها مع عمليات الاسترجاعات الخاصة بك ... تمرير سلسلة أو قابلة للاستدعاء أو صفيف.
Route::get( ' / ' , function (){
echo " Hello World "
});
// Single action controller, must use __invoke method
Route:: get ( ' / ' , Home_Controller::class);
// cli routes are single action Job classes
Route:: cli ( ' build-cache ' , Cache_Job::class);
Route:: get ( ' / ' , Home_Controller::class . ' @homePage ' );
Route:: get ( ' / ' , [Home_Controller::class, ' homePage ' ]);أي من هذه الأعمال ، الأمر متروك لك كيف تفعل ذلك.
يمكنك إضافة البرامج الوسيطة إذا كنت بحاجة إلى بعض الدفاع الإضافي
Route:: get ( ' / ' , [Home_Controller::class, ' homePage ' ])-> addMiddleware (Logged_In_Middleware::class); يجب أن يكون ذلك فئة تنفذ GimliMiddlewareMiddleware_Interface والتي تتطلب طريقة process تُرجع GimliMiddlewareMiddleware_Response . تتمتع البرامج الوسيطة بإمكانية الوصول إلى مثيل التطبيق بما في ذلك الحاقن وأي شيء آخر تقرر تعيينه عليه.
يمكنك أيضًا إضافة مجموعات ، وتحديد ملف الطريق الافتراضي الذي يجب تحميله ، وتحميل ملفات مسار إضافية للمساعدة في تنظيم طرقك.
يمكن أن تحتوي مساراتك أيضًا على وسائط متغيرة تلبي الأنماط التالية:
protected array $ patterns = [
' :all ' => " ([^/]+) " ,
' :alpha ' => " ([A-Za-z_-]+) " ,
' :alphanumeric ' => " ([w-]+) " ,
' :integer ' => " ([0-9_-]+) " ,
' :numeric ' => " ([0-9_-.]+) " ,
' :id ' => " ([0-9_-]+) " ,
' :slug ' => " ([A-Za-z0-9_-]+) " ,
]; ستحتاج إلى إضافة اسم المتغير باستخدام الرمز # في تعريف المسار.
Route:: get ( ' /user/:integer#id ' , [User_Controller::class, ' getUser ' ]); يتم تمرير هذا الاسم المتغير إلى جهاز التوجيه وتعيينه كاعتماد على طريقة وحدة التحكم الخاصة بك. يجب عليك استخدام الاسم المتغير المحدد كوسيطة في طريقة وحدة التحكم الخاصة بك. سيتم كتابة القيمة بناءً على الأنواع المتاحة إلى settype ، والأنواع الممكنة:
integer or int
float or double
string
array
object
boolean or bool
مثال طريقة وحدة التحكم:
public function getUser ( Response $ Response , int $ id ): Response {
// do something with $id
} يجب أن تعيد وحدات التحكم كائن GimliHttpResponse . هناك طرق مساعدة تعيد كائنات Response المنسقة للمساعدة في الحد من بعض المنطق الشرطي:
response استجابة أساسيةredirect إعادة توجيه الاستجابةredirect_on_success redirect إذا نجحت الاستجابةredirect_on_failure إعادة توجيه إذا لم تنجح الاستجابةjson_response json استجابة يتم منح ملفات الوظائف أيضًا الوسيطات subcommand options flags التالية. وسيطة options هي مجموعة من المصفوفات التي تحتوي على الاسم والقيمة. حجة flags هي صفيف مع الأعلام المعطاة. الوسيطة subcommand هي مجرد سلسلة إذا تم إعطاء مبلغ فرعي.
يمكنك استخدام الحاقن المدمج لربط التبعيات أو تسجيلها. يمكنك أيضًا حل التبعيات من الحاقن. يمكنك إضافة أي شيء تحتاجه للحاقن والوصول إليه خلال التطبيق الخاص بك من خلال مثيل Application .
سيقوم الحاقن المدمج بتقديم دروس الأوتار في الأوتار وحل التبعيات حسب الحاجة. يمكنك أيضًا ربط فئة بإغلاق إذا كنت بحاجة إلى القيام ببعض الإعداد قبل إرجاع الفصل أو تسجيل كائن تم إنشاؤه بالفعل. يوضح المثال أدناه وحدة تحكم عمل واحدة سيتم حلها من فئة جهاز التوجيه. يتم حل معلمات طريقة __construct من الحاقن.
<?php
declare (strict_types= 1 );
namespace App Controllers ;
use App Logic Dashboard_Logic ;
use Gimli Http Response ;
use Gimli Application ;
use Gimli View Latte_Engine ;
class Dashboard_Landing_Controller {
/**
* Constructor
*
* @param Application $Application
*/
public function __construct (
public Application $ Application ,
protected Dashboard_Logic $ Dashboard_Logic ,
protected Latte_Engine $ View
){
//
}
/**
* Single action controller call
*
* @return Response
*/
public function __invoke ( Response $ Response ): Response {
$ template_data = $ this -> Dashboard_Logic -> getTemplateData ();
return $ Response -> setResponse ( $ this -> View -> render ( ' dashboard/dashboard.latte ' , $ template_data ));
}
}يتم أيضًا حل معلمات الطريقة بواسطة الحاقن عندما يرسل المسار الطريقة.
هناك أيضًا أساليب مساعد الحاقن التي تقلل من رمز مضمّن. عادةً إذا كنت ترغب في ضخ فئة مضمّنة ، فيمكنك القيام بذلك باستخدام $this->Application->Injector->resolve(Some_Class::class) أو Application::get()->Injector->resolve(Some_Class::class) . تتوفر الأساليب resolve و resolve_fresh لقطع هذا الرمز المضمن.
هناك Database PDO الأساسية الأساسية بالإضافة إلى فئة Pdo_Manager التي يمكنك استخدامها لإدارة استعلامات قاعدة البيانات. عودة فئة Pdo_Manager ومثيل PDO ويمكن استخدامها لتشغيل الاستعلامات مباشرة. فئة Database عبارة عن غلاف حول فئة Pdo_Manager وتوفر بعض طرق الاستعلام الأساسية. هناك أيضًا فئة قاعدة Model للغاية وطرق مساعدة إضافية Database ، مثل هذه الطرق في مكان آخر تتعامل مع حقن التبعية واستدعاء الأساليب في فئة Database المحقونة. المساعدون هم:
fetch_columnfetch_rowfetch_allrow_exists هناك فئة بذرة أساسية يمكن استخدامها لبذرة قاعدة البيانات الخاصة بك. يعتمد هذا على السمات الموضوعة في فئات النماذج لتوجيه Seeder كيفية إنشاء البيانات.
<?php
declare (strict_types= 1 );
namespace Gimli Database ;
use Gimli Database Model ;
use Gimli Database Seed ;
class User_Model extends Model {
/**
* @var string $table_name
*/
protected string $ table_name = ' users ' ;
/**
* ID
*
* @var int $id
*/
public $ id ;
/**
* Unique_Id
*
* @var string $unique_id
*/
#[Seed(type: ' unique_id ' , args: [ ' length ' => 12 ])]
public $ unique_id ;
/**
* Username
*
* @var string $username
*/
#[Seed(type: ' username ' )]
public $ username ;
/**
* Email
*
* @var string $email
*/
#[Seed(type: ' email ' )]
public $ email ;
/**
* Password
*
* @var string $password
*/
#[Seed(type: ' password ' )]
public $ password ;
/**
* Is_Active
*
* @var int $is_active
*/
#[Seed(type: ' tiny_int ' )]
public $ is_active ;
/**
* First Name
*
* @var string $first_name
*/
#[Seed(type: ' first_name ' )]
public $ first_name ;
/**
* Last Name
*
* @var string $last_name
*/
#[Seed(type: ' last_name ' )]
public $ last_name ;
/**
* Status
*
* @var int $status
*/
#[Seed(type: ' one_of ' , args: [ 0 , 1 ])]
public $ status ;
/**
* Created_At
*
* @var string $created_at
*/
#[Seed(type: ' date ' , args: [ ' format ' => ' Y-m-d H:i:s ' , ' min ' => ' 2021-01-01 ' , ' max ' => ' 2021-04-01 00:00:00 ' ])]
public $ created_at ;
/**
* Updated_At
*
* @var string $updated_at
*/
#[Seed(type: ' date ' , args: [ ' format ' => ' Y-m-d H:i:s ' , ' min ' => ' 2021-04-01 00:02:00 ' ])]
public $ updated_at ;
/**
* bio
*
* @var string $about
*/
#[Seed(type: ' paragraph ' , args: [ ' count ' => 1 ])]
public $ about ;
}يمكنك بعد ذلك بذرة قاعدة البيانات بالرمز التالي:
Seeder:: make (User_Model::class)
-> seed ( 123 )
-> count ( 1 )
-> create (); بدلاً من الإنشاء ، يمكنك الاتصال بـ getSeededData للحصول على البيانات التي سيتم إدراجها في قاعدة البيانات. هذا مفيد للاختبار أو تحميل نموذج يدويًا دون حفظه. يمكنك أيضًا تمرير طريقة رد الاتصال التي سيتم منحها بيانات النموذج الأولي. هذا يساعد على بذرة البيانات ذات الصلة. يجب أن يعيد رد الاتصال مجموعة من مثيلات Seeder .
Seeder:: make (User_Model::class)
-> seed ( 123 )
-> count ( 1 )
-> callback ( function ( $ data ) {
return [
Seeder:: make (User_Hobby_Model::class)-> with ([ ' user_id ' => $ data [ ' id ' ]]),
Seeder:: make (User_Group_Model::class)-> with ([ ' user_id ' => $ data [ ' id ' ]]),
]
})
-> create (); تضمن البذور التي تم تمريرها أن البيانات تظل كما هي في كل مرة يتم فيها تشغيل البذور ، مما يؤدي إلى مجموعات بيانات قابلة للتكرار. تحتوي فئة Seeder على طريقة getRandomSeed التي ستعود قيمة بذرة عشوائية. يعد هذا مفيدًا لإنشاء بيانات عشوائية لا تحتاج إلى استنساخها ، أو لإنشاء بذرة عشوائية يمكنك نسخها واستخدامها.
هناك أيضًا عدد قليل من مساعدي التكوين:
get_config للحصول على مجموعة التكوين بأكملهاget_config_value للحصول على قيمة محددة من مجموعة التكوينconfig_has للتحقق مما إذا كان هناك مفتاح في مجموعة التكوين