النار هو إطار PHP خفيفة الوزن. بسهولة وبسرعة بناء تطبيقات ويب راحة عالية الأداء. التوجيه المدمج خارج الصندوق ، وقاعدة البيانات ، وتخزين المؤقت ، ومعالجة الأخطاء ، وتسجيل وجدولة الوظائف. ركز على إنشاء حلول للعملية الأساسية لتطبيقات الويب. الحفاظ على بسيطة وقابلة للتمديد.
| مشروع | وصف |
|---|---|
| ترجل | الإطار الأساسي المدمج في التوجيه ، قاعدة البيانات ، التخزين المؤقت ، إلخ. |
| النزل | تمديد لوحة المسؤول الكامل على أساس النيران. لا يوجد ترميز في الواجهة الأمامية المطلوبة. |
| المشرق | قالب للمبتدئين لإنشاء تطبيقات ويب بسهولة عن طريق الزرق/النيران. |
PHP 7.4+
ليس لديك ملحن؟ تثبيت الملحن أولا.
$ composer create-project juneszh/alight-project {PROJECT_DIRECTORY}يحتوي قالب المشروع على بنية مجلد مشتركة ، مناسبة لنمط MVC ، يرجى الرجوع إلى: koproject.
من السهل تخصيص المجلدات عن طريق تعديل التكوين. لكن البرامج التعليمية التالية تعتمد على تكوين القالب.
مثال NGINX (NGINX 1.17.10 ، PHP 7.4.3 ، Ubuntu 20.04.3):
server {
listen 80 ;
listen [::]:80;
root /var/www/{PROJECT_DIRECTORY}/public;
index index.php;
server_name {YOUR_DOMAIN};
location / {
try_files $uri $uri / /index.php? $query_string ;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}سيتم استيراد جميع خيارات التكوين الخاصة بإطار النرج من ملف "config/app.php" ، والذي تحتاج إلى إنشاء نفسك. على سبيل المثال:
ملف: config/app.php
<?php
return [
' app ' => [
' debug ' => false ,
' timezone ' => ' Europe/Kiev ' ,
' storagePath ' => ' storage ' ,
' domainLevel ' => 2 ,
' corsDomain ' => null ,
' corsHeaders ' => null ,
' corsMethods ' => null ,
' cacheAdapter ' => null ,
' errorHandler ' => null ,
' errorPageHandler ' => null ,
],
' route ' => ' config/route/web.php ' ,
' database ' => [
' type ' => ' mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' database ' => ' alight ' ,
' username ' => ' root ' ,
' password ' => '' ,
],
' cache ' => [
' type ' => ' file ' ,
],
' job ' => ' config/job.php ' ,
]; <?php
Alight Config:: get ( ' app ' );
Alight Config:: get ( ' app ' , ' storagePath ' );انظر config.php للحصول على التفاصيل.
قبل تعلم قواعد التوجيه ، تحتاج إلى إنشاء ملف PHP أولاً يخزن قواعد التوجيه. نظرًا لأنه يتم تحديث ذاكرة التخزين المؤقت للتوجيه أم لا ، فإنه يعتمد على وقت تعديل ملف التوجيه. على سبيل المثال:
ملف: config/route/web.php
Alight Route:: get ( ' / ' , ' Controller::index ' );ملف: config/app.php
<?php
return [
' route ' => ' config/route/web.php '
// Also supports multiple files
// 'route' => ['config/route/web.php', config/route/api.php']
];بالمناسبة ، يدعم تكوين المسار استيراد الملفات المحددة للنطاقات الفرعية :
<?php
return [
' route ' => [
//Import on any request
' * ' => ' config/route/web.php ' ,
//Import when requesting admin.yourdomain.com
' admin ' => ' config/route/admin.php ' ,
//Import multiple files when requesting api.yourdomain.com
' api ' => [ ' config/route/api.php ' , ' config/route/api_mobile.php ' ],
]
]; Alight Route:: get ( $ pattern , $ handler );
// Example
Alight Route:: get ( ' / ' , ' Controller::index ' );
Alight Route:: get ( ' / ' , [ ' Controller ' , ' index ' ]);
// Or try this to easy trigger hints from IDE
Alight Route:: get ( ' / ' , [Controller::class, ' index ' ]);
// With default args
Alight Route:: get ( ' post/list[/{page}] ' , [Controller::class, ' list ' ], [ ' page ' => 1 ]);
// Common HTTP request methods
Alight Route:: options ( ' / ' , ' handler ' );
Alight Route:: head ( ' / ' , ' handler ' );
Alight Route:: post ( ' / ' , ' handler ' );
Alight Route:: delete ( ' / ' , ' handler ' );
Alight Route:: put ( ' / ' , ' handler ' );
Alight Route:: patch ( ' / ' , ' handler ' );
// Map for Custom methods
Alight Route:: map ([ ' GET ' , ' POST ' ], ' test ' , ' handler ' );
// Any for all common methods
Alight Route:: any ( ' test ' , ' handler ' ); // Matches /user/42, but not /user/xyz
Alight Route:: get ( ' user/{id:d+} ' , ' handler ' );
// Matches /user/foobar, but not /user/foo/bar
Alight Route:: get ( ' user/{name} ' , ' handler ' );
// Matches /user/foo/bar as well, using wildcards
Alight Route:: get ( ' user/{name:.+} ' , ' handler ' );
// The /{name} suffix is optional
Alight Route:: get ( ' user[/{name}] ' , ' handler ' );
// Root wildcards for single page app
Alight Route:: get ( ' /{path:.*} ' , ' handler ' );يعالج Nikic/Fast-Route جميع التعبيرات العادية في مسار التوجيه. انظر استخدام Fastroute للحصول على التفاصيل.
Alight Route:: group ( ' admin ' );
// Matches /admin/role/list
Alight Route:: get ( ' role/list ' , ' handler ' );
// Matches /admin/role/info
Alight Route:: get ( ' role/info ' , ' handler ' );
// Override the group
Alight Route:: group ( ' api ' );
// Matches /api/news/list
Alight Route:: get ( ' news/list ' , ' handler ' ); يمكنك تخصيص الأساليب الواردة في AlightRoute::any() .
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
Alight Route:: any ( ' only/get/and/post ' , ' handler ' );إذا كنت ترغب في تشغيل بعض التعليمات البرمجية الشائعة قبل معالج المسار.
// For example log every hit request
Alight Route:: beforeHandler ([ svc Request::class, ' log ' ]);
Alight Route:: get ( ' test ' , ' handler ' );
Alight Route:: post ( ' test ' , ' handler ' );غير موصى به ، ولكن إذا كان الكود الخاص بك يتطلب:
// Effective in the current route file
Alight Route:: disableCache (); جميع خيارات التوجيه تسري فقط في الملف الحالي وسيتم إعادة تعيينها التلقائي عن طريق AlightRoute::init() قبل استيراد الملف التالي. على سبيل المثال:
ملف: config/admin.php
Alight Route:: group ( ' admin ' );
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
// Matches '/admin/login' by methods 'GET', 'POST'
Alight Route:: any ( ' login ' , ' handler ' );ملف: config/web.php
// Matches '/login' by methods 'GET', 'POST', 'PUT', 'DELETE', etc
Alight Route:: any ( ' login ' , ' handler ' );أرسل رأسًا للسيطرة على ذاكرة التخزين المؤقت للتحكم في التخزين المؤقت في المتصفحات وذاكرة التخزين المؤقت المشتركة (CDN) من أجل تحسين سرعة الوصول إلى البيانات غير المعدلة.
// Cache one day
Alight Route:: get ( ' about/us ' , ' handler ' )-> cache ( 86400 );
// Or force disable cache
Alight Route:: put ( ' user/info ' , ' handler ' )-> cache ( 0 );نحن نقدم معالج ترخيص بسيط لإدارة حالة تسجيل الدخول إلى المستخدم.
// Define a global authorization verification handler
Alight Route:: authHandler ([ svc Auth::class, ' verify ' ]);
// Enable verification in routes
Alight Route:: get ( ' user/info ' , ' handler ' )-> auth ();
Alight Route:: get ( ' user/password ' , ' handler ' )-> auth ();
// No verification by default
Alight Route:: get ( ' about/us ' , ' handler ' );
// In general, routing with authorization will not use browser cache
// So auth() has built-in cache(0) to force disable cache
// Please add cache(n) after auth() to override the configuration if you need
Alight Route:: get ( ' user/rank/list ' , ' handler ' )-> auth ()-> cache ( 3600 );ملف: التطبيق/الخدمة/auth.php
namespace svc ;
class Auth
{
public static function verify ()
{
// Some codes about get user session from cookie or anywhere
// Returns the user id if authorization is valid
// Otherwise returns 0 or something else for failure
// Then use Router::getAuthId() in the route handler to get this id again
return $ userId ;
}
}في كثير من الأحيان تستغرق البيانات المقدمة من قبل المستخدم بعض الوقت للمعالجة ، ولا نريد تلقي نفس البيانات قبل معالجتها. لذلك نحن بحاجة إلى تعيين وقت التباطؤ. سيتلقى المستخدم خطأ 429 عند الطلب مرة أخرى داخل التباطؤ.
// Cooldown only takes effect when authorized
Alight Route:: put ( ' user/info ' , ' handler ' )-> auth ()-> cd ( 2 );
Alight Route:: post ( ' user/status ' , ' handler ' )-> auth ()-> cd ( 2 );عندما تحتاج واجهة برمجة التطبيقات الخاصة بك إلى استخدام طلبات AJAX بواسطة موقع ويب ثالث (أو أن مشروعك يحتوي على مجالات متعددة) ، فأنت بحاجة إلى إرسال مجموعة من رؤوس CORS. لأسباب محددة ، يرجى الرجوع إلى: مستندات Mozilla.
// Domains in config will receive the common cors header
Alight Route:: put ( ' share/config ' , ' handler ' )-> cors ();
// The specified domain will receive the common cors header
Alight Route:: put ( ' share/specified ' , ' handler ' )-> cors ( ' abc.com ' );
// The specified domain will receive the specified cors header
Alight Route:: put ( ' share/specified2 ' , ' handler ' )-> cors ( ' abc.com ' , ' Authorization ' , [ ' GET ' , ' POST ' ]);
// All domains will receive a 'Access-Control-Allow-Origin: *' header
Alight Route:: put ( ' share/all/http ' , ' handler ' )-> cors ( ' * ' );
// All domains will receive a 'Access-Control-Allow-Origin: [From Origin]' header
Alight Route:: put ( ' share/all/https ' , ' handler ' )-> cors ( ' origin ' );إذا كان موقع الويب الخاص بك يستخدم CDN ، فيرجى استخدام هذه الأداة المساعدة بعناية. لتجنب فشل الطلب بعد أن تم تخزين العنوان بواسطة CDN.
تمرر النيران تكوين "قاعدة البيانات" إلى Catfan/MEDOO مباشرة. لخيارات التكوين المحددة ، يرجى الرجوع إلى MEDOO البدء. على سبيل المثال:
ملف: config/app.php
<?php
return [
' database ' => [
' type ' => ' mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' database ' => ' alight ' ,
' username ' => ' root ' ,
' password ' => '' ,
],
// Multiple databases (The first database is default)
// 'database' => [
// 'main' => [
// 'type' => 'mysql',
// 'host' => '127.0.0.1',
// 'database' => 'alight',
// 'username' => 'root',
// 'password' => '',
// ],
// 'remote' => [
// 'type' => 'mysql',
// 'host' => '1.1.1.1',
// 'database' => 'alight',
// 'username' => 'root',
// 'password' => '',
// ],
// ]
]; AlightDatabase::init() هو تنفيذ مثيل ثابت ومنفرد لـ new MedooMedoo() ، لذلك يرث جميع وظائف Medoo() . يقوم مثيل واحد بتوصيل كل طلب الاتصال بقاعدة البيانات مرة واحدة فقط وإعادة استخدامه ، مما يقلل بشكل فعال من عدد اتصالات قاعدة البيانات.
// Initializes the default database
$ db = Alight Database:: init ();
// Initializes others database with key
$ db2 = Alight Database:: init ( ' remote ' );
$ userList = $ db -> select ( ' user ' , ' * ' , [ ' role ' => 1 ]);
$ userInfo = $ db -> get ( ' user ' , ' * ' , [ ' id ' => 1 ]);
$ db -> insert ( ' user ' , [ ' name ' => ' anonymous ' , ' role ' => 2 ]);
$ id = $ db -> id ();
$ result = $ db -> update ( ' user ' , [ ' name ' => ' alight ' ], [ ' id ' => $ id ]);
$ result -> rowCount ();راجع وثائق MEDOO للحصول على تفاصيل الاستخدام.
يدعم النيران برامج تشغيل ذاكرة التخزين المؤقت المتعددة وواجهات ذاكرة التخزين المؤقت المتعددة مع Symfony/Cache . سيتم تمرير خيارات التكوين "DSN" و "الخيارات" إلى محول ذاكرة التخزين المؤقت ، والمزيد من التفاصيل يرجى الرجوع إلى محولات ذاكرة التخزين المؤقت المتاحة. على سبيل المثال:
ملف: config/app.php
<?php
return [
' cache ' => [
' type ' => ' file ' ,
],
// Multiple cache (The first cache is the default)
// 'cache' => [
// 'file' => [
// 'type' => 'file',
// ],
// 'memcached' => [
// 'type' => 'memcached',
// 'dsn' => 'memcached://localhost',
// 'options' => [],
// ],
// 'redis' => [
// 'type' => 'redis',
// 'dsn' => 'redis://localhost',
// 'options' => [],
// ],
// ]
]; مثل قاعدة البيانات ، يعد AlightCache::init() تطبيق مثيل ثابت ومفرد لعميل ذاكرة التخزين المؤقت لتحسين أداء الطلب المتزامن.
// Initializes the default cache
$ cache = Alight Cache:: init ();
// Initializes others cache with key
$ cache2 = Alight Cache:: init ( ' redis ' );
// Use SimpleCache(PSR-16) interface
if (! $ cache -> has ( ' test ' )){
$ cache -> set ( ' test ' , ' hello world! ' , 3600 );
}
$ cacheData = $ cache -> get ( ' test ' );
$ cache -> delete ( ' test ' ); $ cache6 = Alight Cache:: psr6 ( ' memcached ' );
$ cacheItem = $ cache6 -> getItem ( ' test ' );
if (! $ cacheItem -> isHit ()){
$ cacheItem -> expiresAfter ( 3600 );
$ cacheItem -> set ( ' hello world! ' );
// Bind to a tag
$ cacheItem -> tag ( ' alight ' );
}
$ cacheData = $ cacheItem -> get ();
$ cache6 -> deleteItem ( ' test ' );
// Delete all cached items in the same tag
$ cache6 -> invalidateTags ( ' alight ' )
// Or symfony/cache adapter style
$ cacheData = $ cache6 -> get ( ' test ' , function ( $ item ){
$ item -> expiresAfter ( 3600 );
return ' hello world! ' ;
});
$ cache6 -> delete ( ' test ' );يدعم أيضًا واجهات Memcached أو Redis الأصلية لاستخدام التخزين المؤقت المتقدم:
$ memcached = Alight Cache:: memcached ( ' memcached ' );
$ memcached -> increment ( ' increment ' );
$ redis = Alight Cache:: redis ( ' redis ' );
$ redis -> lPush ( ' list ' , ' first ' );يدعم Symfony/Cache أكثر من 10 محولات ، ولكن لدينا فقط 3 مدمجين بشكل شائع ، مثل نظام الملفات ، memcached ، redis. إذا كنت بحاجة إلى المزيد من المحولات ، فيمكنك توسيعها. على سبيل المثال:
ملف: config/app.php
<?php
return [
' app ' => [
' cacheAdapter ' => [ svc Cache::class, ' adapter ' ],
],
' cache ' => [
// ...
' apcu ' => [
' type ' => ' apcu '
],
' array ' => [
' type ' => ' array ' ,
' defaultLifetime ' => 3600
]
]
];ملف: التطبيق/الخدمة/cache.php
namespace svc ;
use Symfony Component Cache Adapter ApcuAdapter ;
use Symfony Component Cache Adapter ArrayAdapter ;
use Symfony Component Cache Adapter NullAdapter ;
class Cache
{
public static function adapter ( array $ config )
{
switch ( $ config [ ' type ' ]) {
case ' apcu ' :
return new ApcuAdapter ();
break ;
case ' array ' :
return new ArrayAdapter ( $ config [ ' defaultLifetime ' ]);
default :
return new NullAdapter ();
break ;
}
}
}انظر مكون Symfony Cache لمزيد من المعلومات.
النزل يمسك بجميع الأخطاء عبر AlightApp::start() . عند تشغيل "Debug" في تكوين التطبيق ، سيتم إخراج الأخطاء في HTML جميلة (بواسطة FILP/WHOOPS ) أو JSON.
ملف: config/app.php
<?php
return [
' app ' => [
' debug ' => true ,
]
];عند إيقاف تشغيل "Debug" في بيئة الإنتاج ، تقوم Alight فقط بتسجيل الأخطاء في تقديم وإخراج حالة HTTP. يمكنك تجاوز هذه السلوكيات الافتراضية عن طريق تكوين التطبيق. على سبيل المثال:
ملف: config/app.php
<?php
return [
' app ' => [
' errorHandler ' => [ svc Error::class, ' catch ' ],
' errorPageHandler ' => [ svc Error::class, ' page ' ],
]
];ملف: التطبيق/الخدمة/error.php
namespace svc ;
class Error
{
public static function catch ( Throwable $ exception )
{
// Some code like sending an email or using Sentry or something
}
public static function page ( int $ status )
{
switch ( $ status ) {
case 400 :
// Page code...
break ;
case 401 :
// Page code...
break ;
case 403 :
// Page code...
break ;
case 404 :
// Page code...
break ;
case 500 :
// Page code...
break ;
default :
// Page code...
break ;
}
}
}إذا كنت بحاجة إلى تشغيل البرامج النصية PHP في الخلفية بشكل دوري.
$ sudo contab -eأضف ما يلي إلى سطر النهاية:
* * * * * sudo -u www-data /usr/bin/php /var/www/{PROJECT_DIRECTORY}/app/scheduler.php >> /dev/null 2>&1ملف: config/job.php
Alight Job:: call ( ' handler ' )-> minutely ();
Alight Job:: call ( ' handler ' )-> hourly ();
Alight Job:: call ( ' handler ' )-> daily ();
Alight Job:: call ( ' handler ' )-> weekly ();
Alight Job:: call ( ' handler ' )-> monthly ();
Alight Job:: call ( ' handler ' )-> yearly ();
Alight Job:: call ( ' handler ' )-> everyMinutes ( 5 );
Alight Job:: call ( ' handler ' )-> everyHours ( 2 );
Alight Job:: call ( ' handler ' )-> date ( ' 2022-08-02 22:00 ' );يعمل كل معالج على تشغيل عملية واحدة فقط في وقت واحد ، ويكون وقت التشغيل الافتراضي للعملية 1 ساعة. إذا كان معالجك يحتاج إلى وقت تشغيل أطول ، فاستخدم timelimit ().
Alight Job:: call ( ' handler ' )-> hourly ()-> timeLimit ( 7200 ); // 7200 seconds يوفر Alight AlightApp::root() لتوحيد تنسيق مسارات الملفات في المشروع.
// Suppose the absolute path of the project is /var/www/my_project/
Alight App:: root ( ' public/favicon.ico ' ); // /var/www/my_project/public/favicon.ico
// Of course, you can also use absolute path files with the first character '/'
Alight App:: root ( ' /var/data/config/web.php ' ); تعتمد مسارات الملفات في التكوين على AlightApp::root() . على سبيل المثال:
Alight App:: start ([
' route ' => ' config/route/web.php ' , // /var/www/my_project/config/route/web.php
' job ' => ' config/job.php ' // /var/www/my_project/config/job.php
]); يوفر Alight AlightResponse::api() لتوحيد تنسيق استجابة API.
HTTP 200 OK
{
" error " : 0 , // API error code
" message ": " OK ", // API status description
" data": {} // Object data
}تعريف الحالة:
| حالة HTTP | خطأ API | وصف |
|---|---|---|
| 200 | 0 | نعم |
| 200 | 1xxx | أخطاء العمل العامة ، فقط عرض رسالة للمستخدم |
| 200 | 2xxx | أخطاء العمل الخاصة ، تحتاج إلى تحديد الإجراء التالي للمستخدم |
| 4xx | 4xx | أخطاء العميل |
| 5xx | 5xx | أخطاء الخادم |
على سبيل المثال:
Alight Response:: api ( 0 , null , [ ' name ' => ' alight ' ]);
// Response:
// HTTP 200 OK
//
// {
// "error": 0,
// "message": "OK",
// "data": {
// "name": "alight"
// }
// }
Alight Response:: api ( 1001 , ' Invalid request parameter. ' );
// Response:
// HTTP 200 OK
//
// {
// "error": 1001,
// "message": "Invalid request parameter.",
// "data": {}
// }
Alight Response:: api ( 500 , ' Unable to connect database. ' );
// Response:
// HTTP 500 Internal Server Error
//
// {
// "error": 500,
// "message": "Unable to connect database.",
// "data": {}
// } يوفر Alight AlightResponse::render() لعرض قالب عرض ، استدعاء طريقة العرض مع مسار ملف القالب وبيانات القالب الاختياري:
ملف: التطبيق/وحدة التحكم/pages.php
namespace ctr ;
class Pages
{
public static function index ()
{
Alight Response:: render ( ' hello.php ' , [ ' name ' => ' Ben ' ]);
}
}ملف: التطبيق/العرض/hello.php
<h1>Hello, <?= $ name ?> !</h1>ملف: config/route/web.php
Alight Route:: get ( ' / ' , [ ctr Pages::class, ' index ' ]);سيكون إخراج الصفحة الرئيسية للمشروع:
Hello, Ben!هناك أيضًا بعض المساعدين المفيدين الموضوعة في مساحات أسماء مختلفة. يرجى النقر على الملف للحصول على التفاصيل:
| مساحة الاسم | ملف |
|---|---|
| requer request | request.php |
| rabight الاستجابة | استجابة |
| helight فائدة | Utility.php |