أنماط العمارة في PHP: من الفوضى إلى الكود النظيف

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

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

ابدأ الدورة

كفى كتابة "سباغيتي": لماذا أنماط العمارة في PHP أمر لا بد منه

\n\n

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

\n\n

اليوم سنتحدث عن كيف أنماط العمارة في PHP تحول كودك من كومة من الطوب إلى مبنى منظم. هذه ليست نظرية لكبار المطورين ذوي الخبرة 10 سنوات. إنها أدوات ستنقذ نومك وميزانية المشروع. سنحلل 4 أنماط رئيسية: MVC، Active Record، Repository و Dependency Injection. هيا بنا!

\n\n

MVC (Model-View-Controller): أساس أي إطار عمل

\n\n

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

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

إليك كيف يبدو ذلك في PHP الخالص (بدون إطار عمل):

\n\n
<?php\n// UserController.php\nclass UserController {\n    public function show(int $id): void {\n        $userModel = new UserModel();\n        $user = $userModel->findById($id); // Model\n        \n        // View\n        include 'views/user_profile.php';\n    }\n}\n\n// UserModel.php\nclass UserModel {\n    public function findById(int $id): ?array {\n        $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");\n        $stmt->execute([$id]);\n        return $stmt->fetch() ?: null;\n    }\n}\n\n// views/user_profile.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>
\n\n

متى تستخدم: دائمًا عندما يكون لديك أكثر من صفحتين. MVC هو الأساس. يوفر فصل المنطق، ويسهل الاختبار والصيانة.

\n\n

نصيحة: لا تكتب SQL مباشرة في View. هذا يقتل جوهر النمط. استخدم القوالب المعدة (Twig، Blade) — فهي تقوم تلقائيًا بتأمين المخرجات، مما يحمي من هجمات XSS.

\n\n

Active Record: البساطة التي تدفع ثمنها بالأداء

\n\n

Active Record هو عندما يمثل الكائن في نفس الوقت صفًا في قاعدة البيانات ويحتوي على طرق للتعامل معه. الكلاسيكية هي Eloquent في Laravel أو ActiveRecord في Yii2.

\n\n

مثال على PHP الخالص:

\n\n
<?php\nclass User extends ActiveRecord {\n    protected string $table = 'users';\n    \n    public static function findByName(string $name): ?self {\n        return self::query()\n            ->where('name', $name)\n            ->first();\n    }\n}\n\n// الاستخدام\n$user = new User();\n$user->name = 'إيفان';\n$user->email = 'ivan@example.com';\n$user->save(); // INSERT في قاعدة البيانات\n\n$admin = User::findByName('أدمن');\n$admin->role = 'superadmin';\n$admin->update();
\n\n

الإيجابيات:

\n
    \n
  • الحد الأدنى من الكود لعمليات CRUD.
  • \n
  • بديهي للمبتدئين.
  • \n
\n\n

السلبيات:

\n
    \n
  • ينتهك مبدأ المسؤولية الواحدة (كائن واحد يفعل كل شيء).
  • \n
  • صعب الاختبار — الكائن مرتبط بشدة بقاعدة البيانات.
  • \n
  • قابلية التوسع ضعيفة للمنطق المعقد.
  • \n
\n\n

الخلاصة: Active Record — اختيار ممتاز للنماذج الأولية، المشاريع الصغيرة ولوحات الإدارة. ولكن لتطبيقات المؤسسات، من الأفضل التوجه نحو Repository.

\n\n

Repository: طبقة تجريد فوق مخزن البيانات

\n\n

Repository هو طبقة وسيطة بين منطق الأعمال ومصدر البيانات (قاعدة بيانات، API، ملفات). تقول: "أعطني المستخدم ب

المدونات

توصيات الكتب