مقدمة: لماذا REST API بلغة PHP سريع وبسيط
\n\nREST (Representational State Transfer) هو نمط معماري أصبح المعيار لإنشاء خدمات الويب. يخشى العديد من المطورين المبتدئين من تنفيذ API، معتبرين أنها مهمة صعبة. في الواقع، يمكن كتابة REST API كامل بلغة PHP في 30 دقيقة فقط إذا اتبعت الهيكل الصحيح.
\n\nفي هذا الدليل، سنقوم بإنشاء API بسيط ولكنه عملي لإدارة قائمة المهام (To-Do List). ستتعلم كيفية التعامل مع طرق HTTP (GET, POST, PUT, DELETE)، والعمل مع JSON، وبناء التوجيه. جميع أمثلة الكود جاهزة للتشغيل.
\n\nما ستحصل عليه بعد القراءة:
\n- \n
- REST API عامل بلغة PHP النقية بدون أطر عمل \n
- فهم مبادئ الهندسة المعمارية RESTful \n
- هيكل جاهز لتوسيع نطاق المشروع \n
الخطوة 1: إعداد هيكل المشروع وقاعدة البيانات
\n\nللبدء، سنقوم بإنشاء هيكل مجلدات بسيط. سنحتاج إلى ملف PHP واحد للتوجيه (index.php) وملف إعدادات قاعدة البيانات (config.php).
هيكل المشروع
\nrest-api-todo/\n│\n├── index.php (الموجه الرئيسي)\n├── config.php (الاتصال بقاعدة البيانات)\n└── .htaccess (إعداد عناوين URL الصديقة)\n\nإنشاء قاعدة بيانات MySQL
\nنفذ استعلام SQL هذا في phpMyAdmin أو عبر وحدة التحكم:
\nCREATE DATABASE todo_api;\n\nUSE todo_api;\n\nCREATE TABLE tasks (\n id INT AUTO_INCREMENT PRIMARY KEY,\n title VARCHAR(255) NOT NULL,\n completed BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nINSERT INTO tasks (title) VALUES \n('تعلم PHP'), \n('كتابة REST API'), \n('نشر المقال');\n\nملف config.php
\n<?php\n// config.php\nheader('Content-Type: application/json');\nheader('Access-Control-Allow-Origin: *');\nheader('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');\nheader('Access-Control-Allow-Headers: Content-Type');\n\n$host = 'localhost';\n$dbname = 'todo_api';\n$username = 'root';\n$password = '';\n\ntry {\n $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);\n $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch(PDOException $e) {\n echo json_encode(['error' => 'خطأ في الاتصال بقاعدة البيانات: ' . $e->getMessage()]);\n exit;\n}\n?>\n\nالخطوة 2: إنشاء نقطة دخول واحدة (الموجه)
\n\nفي ملف index.php، سنقوم بتنفيذ التوجيه. سيتعامل مع عناوين URL ويعيد توجيه الطلبات إلى الوظائف المناسبة.
ملف index.php (الكود الكامل)
\n<?php\nrequire_once 'config.php';\n\n$method = $_SERVER['REQUEST_METHOD'];\n$request = explode('/', trim($_SERVER['PATH_INFO'] ?? '/', '/'));\n\n// تحديد معرف المهمة إذا تم تمريره\n$id = isset($request[0]) && is_numeric($request[0]) ? (int)$request[0] : null;\n\n// معالجة طرق HTTP المختلفة\nswitch($method) {\n case 'GET':\n if ($id) {\n getTask($pdo, $id);\n } else {\n getTasks($pdo);\n }\n break;\n \n case 'POST':\n createTask($pdo);\n break;\n \n case 'PUT':\n if ($id) {\n updateTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => 'لم يتم تحديد معرف المهمة']);\n }\n break;\n \n case 'DELETE':\n if ($id) {\n deleteTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => 'لم يتم تحديد معرف المهمة']);\n }\n break;\n \n default:\n http_response_code(405);\n echo json_encode(['error' => 'الطريقة غير مدعومة']);\n}\n\n// --- تنفيذ الوظائف ---\n\nfunction getTasks($pdo) {\n $stmt = $pdo->query("SELECT * FROM tasks ORDER BY created_a