برنامج نصي PHP ذو ملف واحد يضيف REST API إلى قاعدة بيانات MySQL/MariaDB أو PostgreSQL أو SQL Server أو SQLite.
الكيفية: قم بتحميل " api.php
" إلى خادم الويب الخاص بك، وقم بتكوينه للاتصال بقاعدة البيانات الخاصة بك، واحصل على واجهة REST API فورية كاملة الميزات.
ملحوظة: هذا هو التطبيق المرجعي لـ TreeQL في PHP.
PHP 7.2 أو أعلى مع تمكين برامج تشغيل PDO لأحد أنظمة قواعد البيانات هذه:
MySQL 5.7 / MariaDB 10.0 أو أعلى للميزات المكانية في MySQL
PostgreSQL 9.5 أو أعلى مع PostGIS 2.2 أو أعلى للميزات المكانية
SQL Server 2017 أو أعلى (2019 لديه أيضًا دعم Linux)
SQLite 3.16 أو أعلى (الميزات المكانية غير مدعومة)
قم بتنزيل الملف " api.php
" من الإصدار الأخير:
https://github.com/mevdschee/php-crud-api/releases/latest أو مباشرة من:
https://raw.githubusercontent.com/mevdschee/php-crud-api/main/api.php
هذا هو تطبيق ملف واحد! قم بتحميل " api.php
" في مكان ما واستمتع به!
للتطوير المحلي، يمكنك تشغيل خادم الويب المدمج في PHP:
php -S localhost:8080
اختبر البرنامج النصي عن طريق فتح عنوان URL التالي:
http://localhost:8080/api.php/records/posts/1
لا تنس تعديل التكوين في أسفل الملف.
وبدلاً من ذلك، يمكنك دمج هذا المشروع في إطار عمل الويب الذي تختاره، راجع:
واجهة برمجة تطبيقات REST التلقائية لـ Laravel
واجهة برمجة تطبيقات REST التلقائية لـ Symfony 4
واجهة برمجة تطبيقات REST التلقائية لـ SlimPHP 4
في عمليات التكامل هذه، يتم استخدام Composer لتحميل هذا المشروع باعتباره تبعية.
بالنسبة للأشخاص الذين لا يستخدمون الملحن، يتم توفير الملف " api.include.php
". يحتوي هذا الملف على كل شيء من " api.php
" باستثناء التكوين من " src/index.php
" ويمكن استخدامه بواسطة وظيفة "include" الخاصة بـ PHP.
قم بتحرير الأسطر التالية في أسفل الملف " api.php
":
$config = new Config([ 'username' => 'xxx', 'password' => 'xxx', 'database' => 'xxx', ]);
هذه هي كافة خيارات التكوين وقيمتها الافتراضية بين قوسين:
"برنامج التشغيل": mysql
أو pgsql
أو sqlsrv
أو sqlite
( mysql
)
"العنوان": اسم المضيف (أو اسم الملف) لخادم قاعدة البيانات ( localhost
)
"المنفذ": منفذ TCP لخادم قاعدة البيانات (الإعداد الافتراضي لبرنامج التشغيل الافتراضي)
"اسم المستخدم": اسم المستخدم للمستخدم المتصل بقاعدة البيانات (لا يوجد افتراضي)
"password": كلمة مرور المستخدم المتصل بقاعدة البيانات (غير افتراضية)
"قاعدة البيانات": قاعدة البيانات التي يتم الاتصال بها (لا يوجد افتراضي)
"الأمر": SQL إضافي لتهيئة اتصال قاعدة البيانات (لا شيء)
"الجداول": قائمة الجداول المفصولة بفواصل للنشر (الإعداد الافتراضي هو "الكل")
"تعيين": قائمة مفصولة بفواصل لتعيينات الجدول/العمود (لا يوجد تعيين)
"geometrySrid": يتم افتراض SRID عند التحويل من WKT إلى الهندسة ( 4326
)
"البرامج الوسيطة": قائمة البرامج الوسيطة المطلوب تحميلها ( cors
)
"وحدات التحكم": قائمة وحدات التحكم المطلوب تحميلها ( records,geojson,openapi,status
)
"customControllers": قائمة وحدات التحكم المخصصة للمستخدم المراد تحميلها (لا يوجد افتراضي)
"openApiBase": معلومات OpenAPI ( {"info":{"title":"PHP-CRUD-API","version":"1.0.0"}}
)
"cacheType": TempFile
أو Redis
أو Memcache
أو Memcached
أو NoCache
( TempFile
)
"cachePath": مسار/عنوان ذاكرة التخزين المؤقت (الإعداد الافتراضي هو الدليل المؤقت للنظام)
"cacheTime": عدد الثواني التي تكون فيها ذاكرة التخزين المؤقت صالحة ( 10
)
"jsonOptions": الخيارات المستخدمة لتشفير JSON ( JSON_UNESCAPED_UNICODE
)
"debug": إظهار الأخطاء في رؤوس "X-Exception" ( false
)
"basePath": المسار الأساسي لـ URI لواجهة برمجة التطبيقات (يتم تحديده باستخدام PATH_INFO افتراضيًا)
جميع خيارات التكوين متاحة أيضًا كمتغيرات البيئة. اكتب خيار التكوين بأحرف كبيرة، وبادئة "PHP_CRUD_API_" وشرطات سفلية لفواصل الكلمات، على سبيل المثال:
PHP_CRUD_API_DRIVER=mysql
PHP_CRUD_API_ADDRESS=localhost
PHP_CRUD_API_PORT=3306
PHP_CRUD_API_DATABASE=php-crud-api
PHP_CRUD_API_USERNAME=php-crud-api
PHP_CRUD_API_PASSWORD=php-crud-api
PHP_CRUD_API_DEBUG=1
متغيرات البيئة لها الأسبقية على تكوين PHP.
تنطبق هذه القيود والقيود:
يجب أن تكون المفاتيح الأساسية إما ذات زيادة تلقائية (من 1 إلى 2^53) أو UUID
لا يتم دعم المفاتيح الخارجية الأساسية والمركبة
لا يتم دعم عمليات الكتابة المعقدة (المعاملات).
الاستعلامات المعقدة التي تستدعي الوظائف (مثل "concat" أو "sum") غير مدعومة
يجب أن تدعم قاعدة البيانات وتحدد قيود المفاتيح الخارجية
لا يمكن أن يحتوي SQLite على مفاتيح أساسية متزايدة تلقائيًا مكتوبة بنظام Bigint
لا يدعم SQLite تغيير أعمدة الجدول (الهيكل)
يتم دعم الميزات التالية:
تثبيت الملحن أو ملف PHP واحد، سهل النشر.
رمز قليل جدًا وسهل التكيف والصيانة
يدعم متغيرات POST كمدخل (x-www-form-urlencoded)
يدعم كائن JSON كمدخل
يدعم مجموعة JSON كمدخل (إدراج دفعة)
تعقيم المدخلات والتحقق من صحتها باستخدام قواعد الكتابة وعمليات الاسترجاعات
نظام الأذونات لقواعد البيانات والجداول والأعمدة والسجلات
يتم دعم تخطيطات قاعدة البيانات الفردية والمتعددة المستأجرين
دعم CORS متعدد المجالات للطلبات عبر النطاقات
دعم لقراءة النتائج المرتبطة من جداول متعددة
دعم البحث على معايير متعددة
ترقيم الصفحات والفرز وقائمة N العليا واختيار العمود
اكتشاف العلاقة مع النتائج المتداخلة (belongsTo، hasMany، HABTM)
دعم الزيادة الذرية عبر PATCH (للعدادات)
الحقول الثنائية مدعومة بتشفير base64
الحقول والمرشحات المكانية/GIS المدعومة بـ WKT وGeoJSON
تعيين أسماء الجداول والأعمدة لدعم الأنظمة القديمة
قم بإنشاء وثائق API باستخدام أدوات OpenAPI
المصادقة عبر مفتاح API أو رمز JWT أو اسم المستخدم/كلمة المرور
قد تعتمد معلمات اتصال قاعدة البيانات على المصادقة
دعم لقراءة بنية قاعدة البيانات في JSON
دعم تعديل بنية قاعدة البيانات باستخدام نقطة نهاية REST
يتم تضمين البرمجيات الوسيطة لتعزيز الأمن
متوافق مع المعايير: PSR-4، PSR-7، PSR-12، PSR-15 وPSR-17
المشاريع ذات الصلة:
البدء السريع لـ PHP-CRUD-API: ملف إنشاء عامل إرساء قابل للتخصيص وجاهز للاستخدام ويتميز بـ PHP-CRUD-API.
مولد مرشح PHP-CRUD-API: مكتبة جافا سكريبت تنشئ مرشحات PHP-CRUD-API من التعبيرات.
JS-CRUD-API: مكتبة عميل JavaScript لواجهة برمجة تطبيقات PHP-CRUD-API
PHP-API-AUTH: برنامج نصي PHP ذو ملف واحد وهو موفر مصادقة لـ PHP-CRUD-API
PHP-CRUD-UI: برنامج نصي PHP ذو ملف واحد يضيف واجهة مستخدم إلى مشروع PHP-CRUD-API.
PHP-CRUD-ADMIN: برنامج نصي PHP ذو ملف واحد يضيف واجهة إدارة قاعدة البيانات إلى مشروع PHP-CRUD-API.
PHP-SP-API: برنامج نصي PHP ذو ملف واحد يضيف REST API إلى قاعدة بيانات SQL.
dexie-mysql-sync: المزامنة بين قاعدة بيانات IndexedDB المحلية وقاعدة بيانات MySQL.
ra-data-treeql: حزمة NPM التي توفر موفر بيانات لـ React Admin.
scriptPilot/vueuse: مكونات Vue بالإضافة إلى VueUse.org (التي تدعم PHP-CRUD-API).
scriptPilot/add-php-backend: أضف MySQL وphpMyAdmin وPHP-CRUD-API إلى بيئة التطوير الخاصة بك.
VUE-CRUD-UI: برنامج نصي Vue.js ذو ملف واحد يضيف واجهة مستخدم إلى مشروع PHP-CRUD-API.
توجد أيضًا منافذ لهذا البرنامج النصي في:
Go-CRUD-API (العمل قيد التقدم)
Java JDBC بقلم إيفان كولشاجوف (الإصدار الأول)
Java Spring Boot + jOOQ (الإصدار 2: العمل قيد التقدم)
توجد أيضًا منافذ إثبات المفهوم لهذا البرنامج النصي والتي تدعم فقط وظائف REST CRUD الأساسية في: PHP وJava وGo وC# .net core وNode.js وPython.
يمكنك تثبيت كافة تبعيات هذا المشروع باستخدام الأمر التالي:
php install.php
يمكنك تجميع كافة الملفات في ملف " api.php
" واحد باستخدام:
php build.php
لاحظ أنك لا تستخدم الترجمة عند دمج هذا المشروع في مشروع أو إطار عمل آخر (استخدم Composer بدلاً من ذلك).
يمكنك الوصول إلى التعليمات البرمجية غير المترجمة على عنوان URL:
http://localhost:8080/src/records/posts/1
الكود غير المترجم موجود في مجلدي " src
" و" vendor
". يحتوي دليل " vendor
" على التبعيات.
يمكنك تحديث كافة تبعيات هذا المشروع باستخدام الأمر التالي:
php update.php
سيقوم هذا البرنامج النصي بتثبيت Composer وتشغيله لتحديث التبعيات.
ملاحظة: سيقوم البرنامج النصي للتحديث بتصحيح التبعيات في دليل البائع للتوافق مع PHP 7.0.
يسمح لك TreeQL بإنشاء "شجرة" من كائنات JSON بناءً على بنية قاعدة بيانات SQL (العلاقات) واستعلامك.
يعتمد بشكل فضفاض على معيار REST وهو مستوحى أيضًا من json:api.
يحتوي جدول المشاركات النموذجي على عدد قليل من الحقول فقط:
posts ======= id title content created
تعمل عمليات CRUD + List أدناه على هذا الجدول.
إذا كنت تريد إنشاء سجل، فيمكن كتابة الطلب بتنسيق URL على النحو التالي:
POST /records/posts
يجب عليك إرسال نص يحتوي على:
{ "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" }
وسوف يُرجع قيمة المفتاح الأساسي للسجل المُنشأ حديثًا:
2
لقراءة سجل من هذا الجدول، يمكن كتابة الطلب بتنسيق URL على النحو التالي:
GET /records/posts/1
حيث "1" هي قيمة المفتاح الأساسي للسجل الذي تريد قراءته. سوف يعود:
{ "id": 1 "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }
في عمليات القراءة، يمكنك تطبيق الصلات.
لتحديث سجل في هذا الجدول، يمكن كتابة الطلب بتنسيق URL على النحو التالي:
PUT /records/posts/1
حيث "1" هي قيمة المفتاح الأساسي للسجل الذي تريد تحديثه. إرسال كجسم:
{ "title": "Adjusted title!" }
يؤدي هذا إلى تعديل عنوان المنشور. والقيمة المرجعة هي عدد الصفوف التي تم تعيينها:
1
إذا كنت تريد حذف سجل من هذا الجدول، فيمكن كتابة الطلب بتنسيق URL على النحو التالي:
DELETE /records/posts/1
وسيقوم بإرجاع عدد الصفوف المحذوفة:
1
لسرد السجلات من هذا الجدول، يمكن كتابة الطلب بتنسيق URL على النحو التالي:
GET /records/posts
سوف يعود:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" } ] }
في عمليات القائمة، يمكنك تطبيق عوامل التصفية والصلات.
توفر عوامل التصفية وظيفة البحث، في استدعاءات القائمة، باستخدام معلمة "التصفية". تحتاج إلى تحديد اسم العمود، والفاصلة، ونوع المطابقة، وفاصلة أخرى، والقيمة التي تريد التصفية عليها. أنواع المطابقة المدعومة التالية:
"cs": تحتوي على سلسلة (تحتوي السلسلة على قيمة)
"sw": البدء بـ (السلسلة تبدأ بقيمة)
"ew": تنتهي بـ (نهاية السلسلة بقيمة)
"eq": يساوي (السلسلة أو الرقم يتطابق تمامًا)
"lt": أقل من (الرقم أقل من القيمة)
"le": أقل أو يساوي (الرقم أقل من أو يساوي القيمة)
"ge": أكبر أو يساوي (الرقم أعلى من أو يساوي القيمة)
"GT": أكبر من (الرقم أعلى من القيمة)
"bt": بين (الرقم يقع بين قيمتين مفصولتين بفواصل)
"in": in (الرقم أو السلسلة موجودة في قائمة القيم المفصولة بفواصل)
"is": فارغة (يحتوي الحقل على القيمة "NULL")
يمكنك إلغاء جميع عوامل التصفية عن طريق إضافة الحرف "n" مسبقًا، بحيث يصبح "eq" "neq". من أمثلة استخدام الفلتر:
GET /records/categories?filter=name,eq,Internet GET /records/categories?filter=name,sw,Inter GET /records/categories?filter=id,le,1 GET /records/categories?filter=id,ngt,1 GET /records/categories?filter=id,bt,0,1 GET /records/categories?filter=id,in,0,1
الإخراج:
{ "records":[ { "id": 1 "name": "Internet" } ] }
في القسم التالي، سنتعمق أكثر في كيفية تطبيق مرشحات متعددة في استدعاء قائمة واحد.
يمكن تطبيق المرشحات عن طريق تكرار معلمة "الفلتر" في عنوان URL. على سبيل المثال عنوان URL التالي:
GET /records/categories?filter=id,gt,1&filter=id,lt,3
سيطلب جميع الفئات "حيث المعرف> 1 والمعرف <3". إذا أردت "حيث id = 2 أو id = 4" فعليك أن تكتب:
GET /records/categories?filter1=id,eq,2&filter2=id,eq,4
كما ترى، أضفنا رقمًا إلى معلمة "الفلتر" للإشارة إلى أنه يجب تطبيق "OR" بدلاً من "AND". لاحظ أنه يمكنك أيضًا تكرار "filter1" وإنشاء "AND" داخل "OR". نظرًا لأنه يمكنك أيضًا التعمق بمستوى واحد عن طريق إضافة حرف (af)، يمكنك إنشاء أي شجرة شروط معقدة إلى حد معقول تقريبًا.
ملحوظة: يمكنك التصفية فقط على الجدول المطلوب (وليس على الجداول المضمنة فيه) ويتم تطبيق عوامل التصفية فقط على استدعاءات القائمة.
بشكل افتراضي، يتم تحديد كافة الأعمدة. باستخدام المعلمة "include" يمكنك تحديد أعمدة معينة. يمكنك استخدام نقطة لفصل اسم الجدول عن اسم العمود. يجب أن تكون الأعمدة المتعددة مفصولة بفواصل. يمكن استخدام العلامة النجمية ("*") كحرف بدل للإشارة إلى "كافة الأعمدة". كما هو الحال مع "include"، يمكنك استخدام المعلمة "exclude" لإزالة أعمدة معينة:
GET /records/categories/1?include=name GET /records/categories/1?include=categories.name GET /records/categories/1?exclude=categories.id
الإخراج:
{ "name": "Internet" }
ملحوظة: تتم إضافة الأعمدة المستخدمة لتضمين الكيانات ذات الصلة تلقائيًا ولا يمكن استبعادها من المخرجات.
باستخدام معلمة "الطلب" يمكنك الفرز. بشكل افتراضي، يكون الفرز بترتيب تصاعدي، ولكن من خلال تحديد "تنازلي"، يمكن عكس ذلك:
GET /records/categories?order=name,desc GET /records/categories?order=id,desc&order=name
الإخراج:
{ "records":[ { "id": 3 "name": "Web development" }, { "id": 1 "name": "Internet" } ] }
ملحوظة: يمكنك الفرز على حقول متعددة باستخدام معلمات "ترتيب" متعددة. لا يمكنك الطلب على الأعمدة "المنضمة".
تحدد المعلمة "الحجم" عدد السجلات التي يتم إرجاعها. يمكن استخدام هذا لقوائم N العليا مع معلمة "الترتيب" (استخدم الترتيب التنازلي).
GET /records/categories?order=id,desc&size=1
الإخراج:
{ "records":[ { "id": 3 "name": "Web development" } ] }
ملاحظة: إذا كنت تريد أيضًا معرفة العدد الإجمالي للسجلات، فقد ترغب في استخدام معلمة "الصفحة".
تحتوي معلمة "الصفحة" على الصفحة المطلوبة. حجم الصفحة الافتراضي هو 20، ولكن يمكن تعديله (على سبيل المثال إلى 50).
GET /records/categories?order=id&page=1 GET /records/categories?order=id&page=1,50
الإخراج:
{ "records":[ { "id": 1 "name": "Internet" }, { "id": 3 "name": "Web development" } ], "results": 2 }
يحتفظ عنصر "النتائج" بالعدد الإجمالي للسجلات في الجدول، والتي سيتم إرجاعها إذا لم يتم استخدام ترقيم الصفحات.
ملحوظة: نظرًا لأنه لا يمكن ترقيم الصفحات غير المرتبة، فسيتم ترتيب الصفحات حسب المفتاح الأساسي.
لنفترض أن لديك جدول منشورات يحتوي على تعليقات (أدخلها المستخدمون) ويمكن أن تحتوي المنشورات على علامات.
posts comments users post_tags tags ======= ======== ======= ========= ======= id id id id id title post_id username post_id name content user_id phone tag_id created message
عندما تريد إدراج المنشورات مع تعليقات المستخدمين والعلامات الخاصة بها، يمكنك طلب مسارين "شجرة":
posts -> comments -> users posts -> post_tags -> tags
هذه المسارات لها نفس الجذر ويمكن كتابة هذا الطلب بتنسيق URL على النحو التالي:
GET /records/posts?join=comments,users&join=tags
يُسمح لك هنا بتجاهل الجدول الوسيط الذي يربط المنشورات بالعلامات. في هذا المثال، ترى جميع أنواع علاقات الجدول الثلاثة (hasMany، تنتمي إلى، hasAndBelongsToMany) سارية المفعول:
"منشور" به العديد من "التعليقات"
"التعليق" ينتمي إلى "المستخدم"
"منشور" يحتوي وينتمي إلى العديد من "العلامات"
قد يؤدي هذا إلى بيانات JSON التالية:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z", "comments": [ { id: 1, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi!" }, { id: 2, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi again!" } ], "tags": [] }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z", "comments": [], "tags": [ { id: 1, message: "Funny" }, { id: 2, message: "Informational" } ] } ] }
ترى أنه تم الكشف عن العلاقات "ينتمي إلى" ويتم استبدال قيمة المفتاح الخارجي بالكائن المشار إليه. في حالة "hasMany" و"hasAndBelongsToMany"، يتم استخدام اسم الجدول كخاصية جديدة على الكائن.
عندما تريد الإنشاء أو القراءة أو التحديث أو الحذف، يمكنك تحديد قيم مفاتيح أساسية متعددة في عنوان URL. تحتاج أيضًا إلى إرسال مصفوفة بدلاً من كائن في نص الطلب للإنشاء والتحديث.
لقراءة سجل من هذا الجدول، يمكن كتابة الطلب بتنسيق URL على النحو التالي:
GET /records/posts/1,2
قد تكون النتيجة:
[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
وبالمثل، عندما تريد إجراء تحديث دفعي، تتم كتابة الطلب بتنسيق URL على النحو التالي:
PUT /records/posts/1,2
حيث "1" و"2" هما قيمتا المفاتيح الأساسية للسجلات التي تريد تحديثها. يجب أن يحتوي النص على نفس عدد الكائنات الموجودة بالمفاتيح الأساسية في عنوان URL:
[ { "title": "Adjusted title for ID 1" }, { "title": "Adjusted title for ID 2" } ]
وهذا يضبط عناوين المشاركات. والقيم المرجعة هي عدد الصفوف التي تم تعيينها:
[1,1]
مما يعني أنه كانت هناك عمليتان للتحديث وقد قامت كل منهما بتعيين صف واحد. تستخدم العمليات المجمعة معاملات قاعدة البيانات، لذلك إما أن تنجح جميعها أو تفشل جميعها (يتم التراجع عن العمليات الناجحة). إذا فشلوا، سوف يحتوي الجسم على قائمة وثائق الخطأ. في الرد التالي، نجحت العملية الأولى وفشلت العملية الثانية للدفعة بسبب انتهاك السلامة:
[ { "code": 0, "message": "Success" }, { "code": 1010, "message": "Data integrity violation" } ]
سيكون رمز حالة الاستجابة دائمًا 424 (تبعية فاشلة) في حالة حدوث أي فشل في إحدى العمليات الدفعية.
لإدراج سجلات متعددة في هذا الجدول، يمكن كتابة الطلب بتنسيق URL على النحو التالي:
POST /records/posts
يجب أن يحتوي النص على مجموعة من السجلات المراد إدراجها:
[ { "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
القيمة المرجعة هي أيضًا مصفوفة تحتوي على المفاتيح الأساسية للسجلات المدرجة حديثًا:
[1,2]
لاحظ أن العملية المجمعة لـ DELETE تتبع نفس نمط PUT، ولكن بدون نص.
للحصول على الدعم المكاني، توجد مجموعة إضافية من المرشحات التي يمكن تطبيقها على أعمدة الأشكال الهندسية والتي تبدأ بالحرف "s":
"sco": يحتوي على مكاني (تحتوي الهندسة على آخر)
"scr": الصلبان المكانية (الهندسة تتقاطع مع أخرى)
"sdi": مفكك مكاني (الهندسة منفصلة عن أخرى)
"seq": مكاني متساوي (الهندسة تساوي أخرى)
"الخطيئة": يتقاطع مكانيًا (الهندسة تتقاطع مع أخرى)
"sov": التداخلات المكانية (الهندسة تتداخل مع أخرى)
"sto": اللمسات المكانية (الهندسة تلامس أخرى)
"swi": مكاني داخل (الهندسة داخل آخر)
"هكذا": المكاني مغلق (الهندسة مغلقة وبسيطة)
"sis": المكاني بسيط (الهندسة بسيطة)
"siv": المكاني صالح (الهندسة صالحة)
تعتمد هذه المرشحات على معايير OGC وكذلك مواصفات WKT التي يتم فيها تمثيل أعمدة الأشكال الهندسية. لاحظ أن SRID المفترض عند التحويل من WKT إلى الشكل الهندسي يتم تحديده بواسطة متغير التكوين geometrySrid
والإعدادات الافتراضية هي 4326 (WGS 84).
يعد دعم GeoJSON طريقة عرض للقراءة فقط على الجداول والسجلات بتنسيق GeoJSON. يتم دعم هذه الطلبات:
method path - operation - description ---------------------------------------------------------------------------------------- GET /geojson/{table} - list - lists records as a GeoJSON FeatureCollection GET /geojson/{table}/{id} - read - reads a record by primary key as a GeoJSON Feature
تستخدم نقطة النهاية " /geojson
" نقطة النهاية " /records
" داخليًا وترث جميع الوظائف، مثل الصلات والمرشحات. كما أنه يدعم معلمة "الهندسة" للإشارة إلى اسم عمود الهندسة في حالة احتواء الجدول على أكثر من عمود. بالنسبة لعروض الخريطة، فهو يدعم معلمة "bbox" التي يمكنك من خلالها تحديد الإحداثيات العلوية اليسرى واليمنى السفلية (مفصولة بفواصل). يتم دعم أنواع الأشكال الهندسية التالية من خلال تطبيق GeoJSON:
نقطة
نقاط متعددة
سلسلة الخط
MultiLineString
مضلع
متعدد المضلعات
يتم تمكين وظيفة GeoJSON افتراضيًا، ولكن يمكن تعطيلها باستخدام تكوين "وحدات التحكم".
لدعم إنشاء واجهة برمجة التطبيقات (API) لـ (جزء من) نظام قديم (مثل Wordpress)، قد ترغب في تعيين أسماء الجداول والأعمدة حيث لا يمكن تحسينها دون تغيير البرنامج، بينما قد تحتاج الأسماء إلى بعض التحسين من أجل الاتساق. يسمح لك التكوين بإعادة تسمية الجداول والأعمدة بقائمة تعيينات مفصولة بفواصل مقسمة بعلامة يساوي، مثل هذا:
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
سيعرض هذا المثال المحدد الجدول " wp_posts
" عند نقطة نهاية " posts
" (بدلاً من " wp_posts
") والعمود " ID
" داخل هذا الجدول كخاصية " id
" (بالأحرف الصغيرة بدلاً من الأحرف الكبيرة).
ملاحظة: بما أن هذين التعيينين يتداخلان، فقد يتم حذف التعيين الأول (الأقل تحديدًا).
يمكنك تمكين البرامج الوسيطة التالية باستخدام معلمة التكوين "البرامج الوسيطة":
"جدار الحماية": تقييد الوصول إلى عناوين IP محددة
"sslRedirect": فرض الاتصال عبر HTTPS بدلاً من HTTP
"cors": دعم طلبات CORS (ممكّن افتراضيًا)
"xsrf": قم بحظر هجمات XSRF باستخدام طريقة "Double Submit Cookie".
"ajaxOnly": تقييد الطلبات غير التابعة لـ AJAX لمنع هجمات XSRF
"apiKeyAuth": دعم "مصادقة مفتاح API"
"apiKeyDbAuth": دعم "مصادقة قاعدة بيانات مفتاح API"
"dbAuth": دعم "مصادقة قاعدة البيانات"
"wpAuth": دعم "مصادقة WordPress"
"jwtAuth": دعم "مصادقة JWT"
"basicAuth": دعم "المصادقة الأساسية"
"إعادة الاتصال": إعادة الاتصال بقاعدة البيانات باستخدام معلمات مختلفة
"الترخيص": تقييد الوصول إلى جداول أو أعمدة معينة
"التحقق من الصحة": إرجاع أخطاء التحقق من صحة الإدخال للقواعد المخصصة وقواعد النوع الافتراضية
"ipAddress": املأ الحقل المحمي بعنوان IP عند الإنشاء
"الصرف الصحي": تطبيق الصرف الصحي على الإدخال عند الإنشاء والتحديث
"multiTenancy": يقيد وصول المستأجرين في سيناريو متعدد المستأجرين
"pageLimits": يقيد عمليات القائمة لمنع تجريف قاعدة البيانات
"joinLimits": يقيد معلمات الانضمام لمنع تجريف قاعدة البيانات
"textSearch": البحث في كافة الحقول النصية باستخدام معلمة بسيطة
"التخصيص": يوفر معالجات لتخصيص الطلب والاستجابة
"json": دعم قراءة/كتابة سلاسل JSON ككائنات/مصفوفات JSON
"xml": يترجم كل المدخلات والمخرجات من JSON إلى XML
معلمة التكوين "البرامج الوسيطة" عبارة عن قائمة مفصولة بفواصل للبرامج الوسيطة الممكّنة. يمكنك ضبط سلوك البرامج الوسيطة باستخدام معلمات التكوين المحددة للبرامج الوسيطة:
"firewall.reverseProxy": اضبط على "true" عند استخدام وكيل عكسي ("")
"firewall.allowedIpAddresses": قائمة عناوين IP المسموح لها بالاتصال ("")
"cors.allowedOrigins": الأصول المسموح بها في رؤوس CORS ("*")
"cors.allowHeaders": الرؤوس المسموح بها في طلب CORS ("نوع المحتوى، X-XSRF-TOKEN، X-Authorization")
"cors.allowMethods": الطرق المسموح بها في طلب CORS ("OPTIONS، GET، PUT، POST، DELETE، PATCH")
"cors.allowCredentials": للسماح ببيانات الاعتماد في طلب CORS ("صحيح")
"cors.exposeHeaders": رؤوس القائمة البيضاء التي يُسمح للمتصفحات بالوصول إليها ("")
"cors.maxAge": الوقت الذي تكون فيه منحة CORS صالحة بالثواني ("1728000")
"xsrf.excludeMethods": الأساليب التي لا تتطلب حماية XSRF ("OPTIONS,GET")
"xsrf.cookieName": اسم ملف تعريف الارتباط لحماية XSRF ("XSRF-TOKEN")
"xsrf.headerName": اسم رأس حماية XSRF ("X-XSRF-TOKEN")
"ajaxOnly.excludeMethods": الطرق التي لا تتطلب AJAX ("OPTIONS,GET")
"ajaxOnly.headerName": اسم الرأس المطلوب ("X-Requested-With")
"ajaxOnly.headerValue": قيمة الرأس المطلوب ("XMLHttpRequest")
"apiKeyAuth.mode": اضبط على "اختياري" إذا كنت تريد السماح بالوصول المجهول ("مطلوب")
"apiKeyAuth.header": اسم رأس مفتاح API ("X-API-Key")
"apiKeyAuth.keys": قائمة مفاتيح واجهة برمجة التطبيقات الصالحة ("")
"apiKeyDbAuth.mode": اضبط على "اختياري" إذا كنت تريد السماح بالوصول المجهول ("مطلوب")
"apiKeyDbAuth.header": اسم رأس مفتاح API ("X-API-Key")
"apiKeyDbAuth.usersTable": الجدول المستخدم لتخزين المستخدمين في ("المستخدمين")
"apiKeyDbAuth.apiKeyColumn": عمود جدول المستخدمين الذي يحتوي على مفتاح API ("api_key")
"dbAuth.mode": اضبط على "اختياري" إذا كنت تريد السماح بالوصول المجهول ("مطلوب")
"dbAuth.usersTable": الجدول المستخدم لتخزين المستخدمين في ("المستخدمين")
"dbAuth.loginTable": الجدول أو العرض المستخدم لاسترداد معلومات المستخدمين لتسجيل الدخول ("المستخدمون")
"dbAuth.usernameColumn": عمود جدول المستخدمين الذي يحتوي على أسماء المستخدمين ("اسم المستخدم")
"dbAuth.passwordColumn": عمود جدول المستخدمين الذي يحتوي على كلمات المرور ("كلمة المرور")
"dbAuth.returnedColumns": الأعمدة التي تم إرجاعها عند تسجيل الدخول الناجح، فارغة تعني "الكل" ("")
"dbAuth.usernameFormField": اسم حقل النموذج الذي يحمل اسم المستخدم ("اسم المستخدم")
"dbAuth.passwordFormField": اسم حقل النموذج الذي يحمل كلمة المرور ("كلمة المرور")
"dbAuth.newPasswordFormField": اسم حقل النموذج الذي يحتوي على كلمة المرور الجديدة ("newPassword")
"dbAuth.registerUser": بيانات مستخدم JSON (أو "1") في حالة رغبتك في تمكين نقطة النهاية/تسجيل ("")
"dbAuth.loginAfterRegistration": 1 أو صفر إذا كان يجب على المستخدمين المسجلين تسجيل الدخول بعد التسجيل ("")
"dbAuth.passwordLength": الحد الأدنى لطول كلمة المرور ("12")
"dbAuth.sessionName": اسم جلسة PHP التي بدأت ("")
"wpAuth.mode": اضبط على "اختياري" إذا كنت تريد السماح بالوصول المجهول ("مطلوب")
"wpAuth.wpDirectory": المجلد/المسار الذي يمكن العثور على تثبيت Wordpress فيه (".")
"wpAuth.usernameFormField": اسم حقل النموذج الذي يحمل اسم المستخدم ("اسم المستخدم")
"wpAuth.passwordFormField": اسم حقل النموذج الذي يحمل كلمة المرور ("كلمة المرور")
"jwtAuth.mode": اضبط على "اختياري" إذا كنت تريد السماح بالوصول المجهول ("مطلوب")
"jwtAuth.header": اسم الرأس الذي يحتوي على رمز JWT ("تخويل X")
"jwtAuth.leeway": العدد المقبول من الثواني لانحراف الساعة ("5")
"jwtAuth.ttl": عدد الثواني التي يكون فيها الرمز صالحًا ("30")
"jwtAuth.secrets": السر (الأسرار) المشتركة المستخدمة لتوقيع رمز JWT المميز باستخدام ("")
"jwtAuth.algorithms": الخوارزميات المسموح بها، الفارغة تعني "الكل" ("")
"jwtAuth.audiences": الجماهير المسموح بها، الفارغة تعني "الكل" ("")
"jwtAuth.issuers": جهات الإصدار المسموح بها، فارغة تعني "الكل" ("")
"jwtAuth.sessionName": اسم جلسة PHP التي بدأت ("")
"basicAuth.mode": اضبط على "اختياري" إذا كنت تريد السماح بالوصول المجهول ("مطلوب")
"basicAuth.realm": نص للمطالبة عند إظهار تسجيل الدخول ("اسم المستخدم وكلمة المرور مطلوبان")
"basicAuth.passwordFile": الملف المطلوب قراءته لمجموعات اسم المستخدم/كلمة المرور (".htpasswd")
"basicAuth.sessionName": اسم جلسة PHP التي بدأت ("")
"reconnect.driverHandler": معالج لتنفيذ استرجاع برنامج تشغيل قاعدة البيانات ("")
"reconnect.addressHandler": معالج لتنفيذ استرجاع عنوان قاعدة البيانات ("")
"reconnect.portHandler": معالج لتنفيذ استرجاع منفذ قاعدة البيانات ("")
"reconnect.databaseHandler": معالج لتنفيذ استرجاع اسم قاعدة البيانات ("")
"reconnect.tablesHandler": معالج لتنفيذ استرجاع أسماء الجداول ("")
"reconnect.mappingHandler": معالج لتنفيذ استرجاع تعيين الاسم ("")
"reconnect.usernameHandler": معالج لتنفيذ استرجاع اسم مستخدم قاعدة البيانات ("")
"reconnect.passwordHandler": معالج لتنفيذ استرجاع كلمة مرور قاعدة البيانات ("")
"authorization.tableHandler": معالج لتنفيذ قواعد ترخيص الجدول ("")
"authorization.columnHandler": معالج لتنفيذ قواعد ترخيص العمود ("")
"authorization.pathHandler": معالج لتنفيذ قواعد ترخيص المسار ("")
"authorization.recordHandler": معالج لتنفيذ قواعد تصفية ترخيص السجل ("")
"validation.handler": معالج لتنفيذ قواعد التحقق من صحة قيم الإدخال ("")
"validation.types": الأنواع التي سيتم تمكين التحقق من النوع لها، الفارغة تعني "لا شيء" ("الكل")
"validation.tables": الجداول لتمكين التحقق من صحة النوع، الفارغة تعني "لا شيء" ("الكل")
"ipAddress.tables": جداول للبحث عن الأعمدة لتجاوزها بعنوان IP ("")
"ipAddress.columns": الأعمدة المطلوب حمايتها وتجاوزها باستخدام عنوان IP عند الإنشاء ("")
"sanitation.handler": معالج لتنفيذ قواعد الصرف الصحي لقيم الإدخال ("")
"sanitation.types": الأنواع التي سيتم تمكين نوع الصرف الصحي لها، الفارغة تعني "لا شيء" ("الكل")
"sanitation.tables": الجداول لتمكين نوع الصرف الصحي لـ، فارغة تعني "لا شيء" ("الكل")
"multiTenancy.handler": معالج لتنفيذ قواعد بسيطة متعددة الإيجارات ("")
"pageLimits.pages": الحد الأقصى لرقم الصفحة الذي تسمح به عملية القائمة ("100")
"pageLimits.records": الحد الأقصى لعدد السجلات التي يتم إرجاعها بواسطة عملية القائمة ("1000")
"joinLimits. Deep": الحد الأقصى للعمق (الطول) المسموح به في مسار الربط ("3")
"joinLimits.tables": الحد الأقصى لعدد الجداول المسموح لك بالانضمام إليها ("10")
"joinLimits.records": الحد الأقصى لعدد السجلات التي يتم إرجاعها للكيان المنضم ("1000")
"textSearch.parameter": اسم المعلمة المستخدمة لمصطلح البحث ("بحث")
"customization.beforeHandler": معالج لتنفيذ تخصيص الطلب ("")
"customization.afterHandler": معالج لتنفيذ تخصيص الاستجابة ("")
"json.controllers": وحدات التحكم لمعالجة سلاسل JSON لـ ("records,geojson")
"json.tables": جداول لمعالجة سلاسل JSON لـ ("الكل")
"json.columns": أعمدة لمعالجة سلاسل JSON لـ ("الكل")
"xml.types": أنواع JSON التي يجب إضافتها إلى سمة نوع XML ("null,array")
إذا لم تقم بتحديد هذه المعلمات في التكوين، فسيتم استخدام القيم الافتراضية (بين الأقواس).
ستجد في الأقسام أدناه مزيدًا من المعلومات حول البرامج الوسيطة المضمنة.
يوجد حاليًا خمسة أنواع من المصادقة المدعومة. يقومون جميعًا بتخزين المستخدم المصادق عليه في $_SESSION
super global. يمكن استخدام هذا المتغير في معالجات التفويض لتحديد ما إذا كان يجب أن يكون لدى شخص ما حق الوصول للقراءة أو الكتابة إلى جداول أو أعمدة أو سجلات معينة أم لا. توضح النظرة العامة التالية أنواع البرامج الوسيطة للمصادقة التي يمكنك تمكينها.
اسم | الوسيطة | تم المصادقة عبر | يتم تخزين المستخدمين في | متغير الجلسة |
---|---|---|---|---|
مفتاح واجهة برمجة التطبيقات | apiKeyAuth | رأس "X-API-Key". | إعدادات | $_SESSION['apiKey'] |
قاعدة بيانات مفتاح API | apiKeyDbAuth | رأس "X-API-Key". | جدول قاعدة البيانات | $_SESSION['apiUser'] |
قاعدة البيانات | dbAuth | نقطة النهاية "/ تسجيل الدخول". | جدول قاعدة البيانات | $_SESSION['user'] |
أساسي | basicAuth | رأس "الترخيص". | ملف ".htpasswd". | $_SESSION['username'] |
JWT | jwtAuth | رأس "الترخيص". | مزود الهوية | $_SESSION['claims'] |
ستجد أدناه مزيدًا من المعلومات حول كل نوع من أنواع المصادقة.
تعمل مصادقة مفتاح API عن طريق إرسال مفتاح API في رأس الطلب. اسم الرأس الافتراضي هو "X-API-Key" ويمكن تهيئته باستخدام معلمة التكوين "apiKeyAuth.header". يجب تكوين مفاتيح API الصالحة باستخدام معلمة التكوين "apiKeyAuth.keys" (قائمة مفصولة بفواصل).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
سيتم تخزين مفتاح واجهة برمجة التطبيقات (API) المصادق عليه في المتغير $_SESSION['apiKey']
.
لاحظ أن مصادقة مفتاح API لا تتطلب أو تستخدم ملفات تعريف الارتباط للجلسة.
تعمل مصادقة قاعدة بيانات مفتاح API عن طريق إرسال مفتاح API في رأس الطلب "X-API-Key" (الاسم قابل للتكوين). تتم قراءة مفاتيح API الصالحة من قاعدة البيانات من العمود "api_key" في جدول "المستخدمين" (كلا الاسمين قابلان للتكوين).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
سيتم تخزين المستخدم الذي تمت مصادقته (بكل خصائصه) في المتغير $_SESSION['apiUser']
.
لاحظ أن مصادقة قاعدة بيانات مفتاح API لا تتطلب أو تستخدم ملفات تعريف الارتباط للجلسة.
تحدد البرمجيات الوسيطة لمصادقة قاعدة البيانات خمسة مسارات جديدة:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /register - username, password - adds a user with given username and password POST /login - username, password - logs a user in by username and password POST /password - username, password, newPassword - updates the password of the logged in user POST /logout - - logs out the currently logged in user
يمكن تسجيل دخول المستخدم عن طريق إرسال اسم المستخدم وكلمة المرور الخاصين به إلى نقطة نهاية تسجيل الدخول (بتنسيق JSON). سيتم تخزين المستخدم الذي تمت مصادقته (بكل خصائصه) في المتغير $_SESSION['user']
. يمكن تسجيل خروج المستخدم عن طريق إرسال طلب POST بنص فارغ إلى نقطة نهاية تسجيل الخروج. يتم تخزين كلمات المرور كتجزئة في عمود كلمة المرور في جدول المستخدمين. يمكنك تسجيل مستخدم جديد باستخدام نقطة نهاية التسجيل، ولكن يجب تشغيل هذه الوظيفة باستخدام معلمة التكوين "dbAuth.registerUser".
من المهم تقييد الوصول إلى جدول المستخدمين باستخدام البرنامج الوسيط "التفويض"، وإلا يمكن لجميع المستخدمين إضافة أو تعديل أو حذف أي حساب بحرية! يظهر الحد الأدنى من التكوين أدناه:
'middlewares' => 'dbAuth,authorization', 'authorization.tableHandler' => function ($operation, $tableName) { return $tableName != 'users'; },
لاحظ أن هذه البرامج الوسيطة تستخدم ملفات تعريف الارتباط للجلسة وتخزن حالة تسجيل الدخول على الخادم.
تسجيل الدخول باستخدام طرق العرض مع الجدول المنضم
بالنسبة لعمليات تسجيل الدخول، من الممكن استخدام طريقة عرض كجدول المستخدمين. يمكن أن تقوم طريقة العرض هذه بإرجاع نتيجة تمت تصفيتها من جدول المستخدمين، على سبيل المثال، حيث active = true أو قد تقوم أيضًا بإرجاع نتيجة لجداول متعددة من خلال صلة الجدول. كحد أدنى، يجب أن يتضمن العرض اسم المستخدم وكلمة المرور وحقلًا يسمى id .
ومع ذلك، لا يمكن إدراج وجهات النظر ذات الجداول المرتبطة (انظر العدد 907). كحل بديل، استخدم الخاصية loginTable لتعيين جدول مرجعي مختلف لتسجيل الدخول. سيظل جدول المستخدمين مضبوطًا على جدول المستخدمين العادي القابل للإدراج.
تحدد البرمجيات الوسيطة لمصادقة Wordpress ثلاثة مسارات:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /login - username, password - logs a user in by username and password POST /logout - - logs out the currently logged in user
يمكن تسجيل دخول المستخدم عن طريق إرسال اسم المستخدم وكلمة المرور الخاصة به إلى نقطة نهاية تسجيل الدخول (بتنسيق JSON). يمكن تسجيل خروج المستخدم عن طريق إرسال طلب POST بنص فارغ إلى نقطة نهاية تسجيل الخروج. تحتاج إلى تحديد دليل تثبيت Wordpress باستخدام معلمة التكوين "wpAuth.wpDirectory". يستدعي البرنامج الوسيط "wp-load.php" وهذا يسمح لك باستخدام وظائف Wordpress في البرنامج الوسيط للترخيص، مثل:
wp_get_current_user()
is_user_logged_in()
is_super_admin()
user_can(wp_get_current_user(),'edit_posts');
لاحظ أن المتغير $_SESSION
لا يستخدم بواسطة هذه البرامج الوسيطة.
يدعم النوع الأساسي ملفًا (افتراضيًا ".htpasswd") يحتفظ بالمستخدمين وكلمات المرور (المجزأة) الخاصة بهم مفصولة بنقطتين (':'). عندما يتم إدخال كلمات المرور بنص عادي، سيتم تجزئتها تلقائيًا. سيتم تخزين اسم المستخدم المصادق عليه في المتغير $_SESSION['username']
. يتعين عليك إرسال رأس "التفويض" الذي يحتوي على نسخة مشفرة من عنوان url base64 لاسم المستخدم وكلمة المرور المفصولين بنقطتين، بعد الكلمة "أساسي".
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
يرسل هذا المثال السلسلة "username1:password1".
يتطلب نوع JWT خادمًا آخر (SSO/Identity) لتوقيع رمز مميز يحتوي على مطالبات. يتشارك كلا الخادمين سرًا حتى يتمكنوا من التوقيع أو التحقق من صحة التوقيع. يتم تخزين المطالبات في المتغير $_SESSION['claims']
. أنت بحاجة إلى إرسال رأس "X-Authorization" يحتوي على عنوان url مشفر بقاعدة 64 ورأس رمز مميز مفصول بالنقاط ونص وتوقيع بعد كلمة "Bearer" (اقرأ المزيد حول JWT هنا). يقول المعيار أنك بحاجة إلى استخدام رأس "التفويض"، ولكن هذا يمثل مشكلة في Apache وPHP.
X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6IjE1MzgyMDc2MDUiLCJleHAiOjE1MzgyMDc2MzV9.Z5px_GT15TRKhJCTHhDt5Z6K6LRDSFnLj8U5ok9l7gw
يرسل هذا المثال المطالبات الموقعة:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": "1538207605", "exp": 1538207635 }
ملاحظة: يدعم تطبيق JWT فقط الخوارزميات القائمة على RSA وHMAC.