أنماط العمارة في PHP: من MVC إلى CQRS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا العمارة هي كل شيء (وقهوتك لن تبرد بعد الآن)

\n

تخيل أنك تبني منزلاً. يمكنك رمي الطوب بشكل عشوائي، ولصقه بالعلكة، وتأمل أن يصمد حتى الشتاء. أو يمكنك تصميم الأساس والجدران والسقف بحيث يتحمل المنزل الإعصار وغزو الأقارب. في عالم PHP، الأمر نفسه تمامًا. أنماط العمارة هي تلك المخططات التي تحول كودك من "يعمل – وبس" إلى "يعمل، ويتوسع، ولا يسبب لك الرغبة في شرب اليود".

\n

عندما بدأت البرمجة بلغة PHP، كانت مشاريعي وحوشًا متراصة. في ملف واحد index.php، كانت استعلامات SQL وترميز HTML ومنطق الأعمال تعيش معًا. كان هذا يعمل تمامًا حتى يطلب العميل إضافة ميزة جديدة. ثم كان الجحيم. اليوم سأريكم كيف تتجنبون هذا الجحيم. سنستعرض أنماط العمارة الرئيسية في PHP – من الكلاسيكية إلى الأساليب الحديثة. هيا بنا!

\n\n

MVC (Model-View-Controller): جد أنماط العمارة

\n

إذا كنت قد كتبت بلغة Laravel أو Symfony أو Yii2، فأنت قد صادفت بالفعل MVC. إنه نمط العمارة الأساسي في PHP الذي يقسم التطبيق إلى ثلاثة أجزاء:

\n
    \n
  • Model – البيانات ومنطق الأعمال (التعامل مع قاعدة البيانات، التحقق من الصحة، الحسابات).
  • \n
  • View – العرض (HTML، القوالب، JSON).
  • \n
  • Controller – الرابط: يستقبل الطلب، يستدعي Model، ويمرر البيانات إلى View.
  • \n
\n

يحل MVC المشكلة الرئيسية – فصل المسؤوليات. لم يعد هناك SQL داخل HTML. يصبح الكود قابلاً للقراءة والاختبار والصيانة.

\n\n

مثال على MVC بلغة PHP الخالصة

\n
// Model: User.php\nclass User {\n    public function find(int $id): ?array {\n        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n        $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n        $stmt->execute([$id]);\n        return $stmt->fetch() ?: null;\n    }\n}\n\n// Controller: UserController.php\nclass UserController {\n    public function show(int $id): void {\n        $userModel = new User();\n        $user = $userModel->find($id);\n        if (!$user) {\n            http_response_code(404);\n            echo 'المستخدم غير موجود';\n            return;\n        }\n        // تمرير البيانات إلى View\n        require 'views/user.php';\n    }\n}\n\n// View: views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>البريد الإلكتروني: <?= htmlspecialchars($user['email']) ?></p>
\n

متى تستخدمه: لتطبيقات الويب متوسطة التعقيد. إذا كان لديك مدونة بسيطة أو متجر إلكتروني – فإن MVC هو خيارك. لكن كن حذرًا: إذا أصبحت المتحكمات (Controllers) ثقيلة (Fat Controllers)، يفقد النمط معناه.

\n\n

Active Record: البساطة والسرعة

\n

نمط Active Record هو عندما يمثل الكائن في نفس الوقت صفًا في قاعدة البيانات ومنطق الأعمال. هل تذكر Laravel Eloquent أو Yii2 ActiveRecord؟ هذا هو. كل نموذج (Model) هو استعلام لقاعدة البيانات، وقواعد التحقق، والعلاقات.

\n\n

مثال على Active Record (على غرار Eloquent)

\n
class User extends ActiveRecord {\n    // الخصائص تتوافق مع أعمدة الجدول\n    public int $id;\n    public string $name;\n    public string $email;\n\n    public function save(): bool {\n        // منطق INSERT/UPDATE\n        if ($this->id) {\n            // UPDATE\n        } else {\n            // INSERT\n        }\n        return true;\n    }\n\n    public static function find(int $id): ?self {\n        // SELECT * FROM users WHERE id = $id\n    }\n}\n\n// الاستخدام\n$user = new User();\n$user->name = 'أحمد';\n$user->email = 'ahmed@example.com';\n$user->save(); // بسيط وواضح
\n

المزايا: كتابة سريعة، مفهومة بشكل بديهي للمبتدئين. العيوب: ينتهك مبدأ المسؤولية الواحدة (Single Responsibility من SOLID). النموذج يعرف البيانات وكيفية حفظها. للمشاريع المعقدة، قد يصبح هذا فوضى.

المدونات

توصيات الكتب