أطر عمل PHP

لكل إطار عمل PHP مهمة يتقنها أكثر من غيرها.

نبني التطبيقات وننقذها ونستضيفها بكلٍّ منها — وبـ PHP الخام التي لم يكن لها إطار عمل قط — مع فريق يكتب PHP منذ خمسة وعشرين عامًا.

أي إطار عمل يناسب مشروعك

أجب عن سؤالين. ينتهي كل مسار حيث كنا سنبدأ — ويذكر متى كنا سنختار شيئًا آخر.

ما الذي تبدأ منه؟

مشروع جديد

ما الأهم بالنسبة إليك؟

نظام كبير ستعمل عليه عدة فرق لسنوات

من أين سنبدأ

Symfony

إعدادات صريحة، وحاوية لحقن التبعيات، وإصدارات بدعم طويل الأمد، وDoctrine للبيانات. وتظل البنية متماسكة حين ينضم المطوّر الخامس.

وفكّر أيضًا في Laminas إذا كانت الشركة تشغّل شيفرة Zend Framework بالفعل.

منتج يجب إطلاقه قريبًا، بفريق صغير

من أين سنبدأ

Laravel

المصادقة والطوابير والبريد والجدولة وORM معبِّر جاهزة من البداية، باصطلاح واحد لكل ذلك.

Laravel في EGPHP
واجهة API أو خدمة صغيرة لمهمة واحدة

من أين سنبدأ

Slim

التوجيه والطبقات الوسيطة وطلبات PSR-7 القياسية، ولا شيء لم تطلبه. أنت تختار طبقة قاعدة البيانات والحاوية.

إذا كانت الواجهة ستكبر لتصبح منتجًا كاملًا، فإن Laravel أو Symfony يوفّر عليك إعادة البناء لاحقًا.

تطبيق صغير على خادم متواضع

من أين سنبدأ

CodeIgniter

بصمة صغيرة، وإعدادات قليلة، وتوثيق واضح. ويعمل جيدًا حيث تكون الموارد محدودة.

شاشات بيانات كثيرة، تُبنى بسرعة من قاعدة البيانات

من أين سنبدأ

Yii · CakePHP

يولّد Yii النماذج وشاشات CRUD عبر Gii، وينشئها CakePHP انطلاقًا من اصطلاحاته. وكلاهما يحوّل المخطط إلى شاشات عاملة بسرعة.

أقل عبء لإطار العمل في كل طلب

من أين سنبدأ

Phalcon

إطار العمل امتداد مُترجَم بلغة C، لذا لا يعمل إلا القليل جدًا من PHP في كل طلب. ويحتاج إلى تثبيت هذا الامتداد على الخادم — ونحن نثبّته على خوادمنا.

كثير من الاستضافات المشتركة لا تسمح بامتدادات PHP. تحقّق من ذلك قبل أن تختاره.

تطبيق موجود بالفعل

على ماذا بُني؟

PHP خام بلا إطار عمل، أو إصدار PHP قديم جدًا

من أين سنبدأ

الإنقاذ أولًا

نجعله آمنًا ومحدَّثًا قبل أي شيء آخر، ثم نقرر معًا إن كان إطار العمل يستحق.

كيف يجري الإنقاذ
مبني على إطار عمل، ويعمل

من أين سنبدأ

الإبقاء على إطار العمل

نرقّيه ونؤمّنه ونوسّعه بإطار العمل الذي كُتب به. إعادة الكتابة هي الملاذ الأخير، لا الخيار الأول.

مبني على إطار عمل تريد مغادرته

من أين سنبدأ

الانتقال على مراحل

يعمل التطبيقان القديم والجديد جنبًا إلى جنب، وتنتقل المسارات واحدًا تلو الآخر بينما يستمر العمل.

كيف يجري الانتقال

جنبًا إلى جنب

ما هو كل إطار عمل، وفيمَ يتفوق، ومتى نتردد في اختياره. لا أحد منها خاطئ؛ فكلٌّ منها مناسب لمهمة مختلفة.

مقارنة أطر عمل PHP
إطار العمل ما هو طبقة البيانات أقوى ما فيه أعد النظر إذا
Symfony إطار عمل متكامل ومكوّنات قابلة لإعادة الاستخدام Doctrine ORM الأنظمة الكبيرة طويلة العمر، مع إصدارات بدعم طويل الأمد موقع صغير يجب إطلاقه هذا الأسبوع
Laravel إطار عمل متكامل Eloquent إطلاق منتج بسرعة، مع طوابير ومصادقة وبريد مدمجة تريد ربط كل جزء بشكل صريح
CodeIgniter إطار عمل متكامل خفيف منشئ استعلامات ونماذج بسيطة بصمة صغيرة على خوادم متواضعة يحتاج المشروع إلى منظومة كبيرة من الحزم
Yii إطار عمل متكامل Active Record شاشات كثيفة البيانات تُولَّد عبر Gii، والتخزين المؤقت فريقك جديد عليه، ومجتمعه أصغر
CakePHP إطار عمل متكامل CakePHP ORM الاصطلاح بدل الإعداد، وشيفرة تُولَّد من المخطط التطبيق يصطدم باصطلاحاته في كل خطوة
Laminas مكوّنات وأطر عمل MVC وطبقات وسيطة؛ خليفة Zend Framework laminas-db أو Doctrine أنظمة الأعمال المبنية أصلًا على Zend Framework مشروع جديد صغير يريد التحرك بسرعة
Slim إطار عمل مصغّر لا شيء مدمج — الاختيار لك واجهات API والخدمات الصغيرة يحتاج التطبيق إلى الجلسات والنماذج ولوحة إدارة من اليوم الأول
Phalcon إطار عمل متكامل يُقدَّم كامتداد بلغة C Phalcon ORM مع PHQL عبء منخفض جدًا لكل طلب لا يمكن لاستضافتك تثبيت امتدادات PHP

Laravel نفسه مبني على عدة مكوّنات من Symfony، ومعظم هذه الأطر تتشارك معايير PSR نفسها — فنقل الشيفرة بينها أقل جهدًا مما يبدو.

شيفرة PHP القديمة، نعيدها إلى حالة جيدة

لا تزال شيفرة كُتبت قبل سنوات تدرّ المال على كثير من الشركات. نجعلها آمنة ومحدَّثة دون إيقافها.

- $id = $_GET['id'];- $r = mysql_query("SELECT * FROM orders WHERE id = $id");- $order = mysql_fetch_assoc($r);+ $stmt = $pdo->prepare('SELECT * FROM orders WHERE id = ?');+ $stmt->execute([(int) $_GET['id']]);+ $order = $stmt->fetch(PDO::FETCH_ASSOC);
أُزيلت دوال mysql_ في PHP 7. وهذا التغيير الواحد يجعل الصفحة تعمل على إصدارات PHP الحالية ويسدّ ثغرة حقن SQL في الوقت نفسه.
  1. نقرؤه ونشغّله

    نسخة من التطبيق تعمل على خادم حديث، وقائمة مكتوبة بما يتعطل.

  2. اختبارات حول ما يعمل

    اختبارات تسجّل ما تفعله الصفحات اليوم، فيُكتشف فورًا أي تغيير يعطّل إحداها.

  3. ترقية PHP على مراحل

    إصدارًا واحدًا في كل مرة، مع Rector للتغييرات الآلية وPHPStan لاكتشاف ما فاته.

  4. الأمان أولًا

    استعلامات مُعدَّة مسبقًا، ومخرجات مُهرَّبة، وكلمات مرور يُعاد تجزئتها، وإحكام الجلسات والملفات المرفوعة.

  5. ثم إطار عمل، إن كان مجديًا

    تدخل الميزات الجديدة في إطار عمل بجانب الشيفرة القديمة، وتنتقل الصفحات القديمة إليه كلما جرى العمل عليها.

الانتقال بين أطر العمل، مسارًا تلو الآخر

لا نوقف العمل من أجل إعادة الكتابة. يقف التطبيقان القديم والجديد خلف خادم ويب واحد، وينتقل كل مسار حين يجهز بديله.

  • /api/orders التطبيق الجديد نُقل
  • /account التطبيق الجديد نُقل
  • /checkout التطبيق الجديد قيد الاختبار
  • /reports التطبيق القديم في الانتظار
  • /admin التطبيق القديم في الانتظار
مثال على انتقال في منتصف الطريق.

التحويل سطر واحد لكل مسار

# nginx
location /api/orders { proxy_pass http://new; }
location /account    { proxy_pass http://new; }
location /checkout   { proxy_pass http://new; }
location /           { proxy_pass http://old; }

المسار الذي يسيء التصرف يعود إلى التطبيق القديم بالتغيير نفسه ذي السطر الواحد، ريثما نصلحه.

أخبرنا بما تشغّله

يكفي للبدء إطار العمل وإصدار PHP وما يقلقك بشأنه. يُسعَّر كل مشروع بعد محادثة قصيرة.