مراجعة My CakePHP 3 - ما زالت طازجة وساخنة
نشرت: 2022-03-11في الشهر الماضي ، أعلن فريق CakePHP عن إطلاق الإصدار ألفا من CakePHP 3. يعتبر فريق تطوير الكيك الإصدار 3 بمثابة تغيير في قواعد اللعبة ، لذلك مع إصدار ألفا للإصدار 3 الذي أصبح الآن ساخنًا خارج الفرن ، تأخذ هذه المقالة نظرة جديدة على CakePHP 3 كإطار حديث فعال لتطوير PHP.
لمحة تاريخية
في هذه الأيام ، هناك العديد من الخيارات عندما يتعلق الأمر بتطوير PHP. مع نضوج PHP ، ظهر المزيد والمزيد من أطر عمل PHP ، مما يوفر للمطورين مجموعة واسعة من الخيارات. لكن الأمر لم يكن دائمًا على هذا النحو.
في عام 2005 ، عندما كانت PHP 4 لا تزال هي المعيار ، لم تكن هناك أطر PHP وكان تطوير نهج ترميز موجه للكائنات في PHP يمثل تحديًا بالتأكيد. ثم ظهر CakePHP - أول إطار عمل PHP MVC على الإطلاق. في ما يقرب من 10 سنوات مرت منذ إطلاقه لأول مرة ، استمر CakePHP في التطور ، وحافظ على حصة سوقية جيدة لمطوري PHP.
ما مدى شعبية إطار عمل CakePHP؟ تم تصنيفها ضمن أفضل 4 مشاريع PHP الأكثر شيوعًا على GitHub ، من حوالي 130.000 مشروع ، مع أكثر من 18000 عضو في مجموعة CakePHP Google مع 32000 موضوع. مع 270 مساهمًا في الكود ، و 320 مساهمًا في التوثيق ، فلا يمكن إنكار أن CakePHP لها عدد كبير من المتابعين. تم تلخيص شعبية CakePHP الحالية والمتنامية على نطاق واسع في مقال بقلم جيمس واتس ، العضو الأساسي ومدير مجتمع CakePHP لمؤسسة Cake Software Foundation ، الذي أجريت معه مقابلة أثناء كتابة هذا المقال.
مع توفر الإصدار 3 من إطار العمل الآن ، من المتوقع أن يظل CakePHP قوة رائدة في عالم PHP ومنافسًا رئيسيًا وسط المشهد المتنوع اليوم لأطر PHP.
ما الجديد في الإصدار 3 من CakePHP؟
تستند هذه المراجعة إلى الإصدار ألفا من CakePHP 3.0 ، والذي يتضمن عددًا من الميزات والتحسينات الجديدة بما في ذلك:
أداء أفضل. يتضمن الإصدار 3 تحسينات في الأداء لعملية التمهيد وعملية التوجيه والعديد من أجزاء العملية لإنشاء قوالب المساعدة.
المكونات المحسنة والمساعدين. يوفر الإصدار 3 دعمًا محسنًا لـ "رسائل فلاش" مع FlashHelper و FlashComponent الجديدتين. بالإضافة إلى ذلك ، تم تحسين ملف تعريف الارتباط ، مما يسهل فصل تكوين مساحات أسماء ملفات تعريف الارتباط ومعالجة بيانات ملفات تعريف الارتباط.
تحسين إدارة الجلسة. لطالما كانت إدارة الجلسات فئة ثابتة في CakePHP والتي أثبتت أنها إشكالية بعدة طرق. مع الإصدار 3 ، يمكنك الآن الوصول إلى الجلسة من كائن الطلب
$this->request->session()
. يسهل هذا التغيير أيضًا اختبار الجلسة ، ويمكّن CakePHP من استخدام PHPUnit 4.x.تحسين اتساق الاتفاقيات. تم تحديث الهيكل العظمي للتطبيق وهياكل البرنامج المساعد لاستخدام نفس بنية الدليل من أجل أن تكون أكثر اتساقًا مع بعضها البعض.
تم دمج السمات والمكونات الإضافية. كان الهدف الرئيسي لـ CakePHP 3 هو جعل السمات أكثر قوة وقوة. من أجل تحقيق هذا الهدف ، أصبح من الواضح أن المطلوب حقًا هو أن توفر السمات نفس الإمكانات مثل المكونات الإضافية. وفقًا لذلك ، يمكن الآن استخدام أي مكون إضافي كقالب ، مما يبسط أيضًا عملية التعبئة وإعادة التوزيع.
تحسينات ORM. تم إجراء العديد من تغييرات API على ORM (رسم الخرائط العلائقية للكائن). والجدير بالذكر أنه من الأسهل الآن تحديد ارتباطات عميقة لعمليات الحفظ ، وتم تغيير بعض الاصطلاحات لتقليل منحنى التعلم والارتباك بين المتبنين الجدد.
بالإضافة إلى ذلك ، هناك بعض الميزات الإضافية التي تم التخطيط أيضًا لإدراجها في الإصدار التجريبي للإصدار 3.0. الاكثر اهمية:
- تحسينات لميزة التدويل والتعريب (i18n و L10n)
- بديل لـ CacheHelper على أساس Edge Side Includes
- واجهة برمجة تطبيقات جديدة للتوجيه لإعلان المسار بشكل أبسط وأسرع
في الواقع ، يمثل الإصدار 3 ترقية كبيرة تتجاوز الإصدارات السابقة من CakePHP.
لماذا CakePHP؟
بينما يحتوي CakePHP على العديد من الميزات الرائعة ، تركز هذه المراجعة على عدد قليل من الميزات التي تساعد حقًا في تمييزها ، وهي:
- اتفاقية على التكوين
- CakePHP's ORM (رسم الخرائط العلائقية للكائن)
- المكونات والمساعدين
اتفاقية على التكوين
لطالما كانت CakePHP تدور حول التطوير السريع والمتسق ، ومن أجل تحقيق هذه الغاية ، فإن CakePHP تركز بشدة على الاتفاقية. لذلك ، مثل Ruby on Rails (التي استلهم CakePHP منها الكثير من الإلهام) ، يلتزم CakePHP بشدة بالاتفاقية حول مبدأ التكوين.
تعني الاصطلاحات أن المطور ليس مضطرًا للتفكير في "أين تذهب الأشياء" عند تعلم كيفية استخدام إطار عمل CakePHP ، نظرًا لأن الإعدادات الافتراضية لهذه القواعد قد تم وضعها بالفعل. بينما يحتاج المرء إلى التعرف على اتفاقيات CakePHP ، بمجرد إتقانها ، يمكن للمطور التركيز على التطوير الأساسي ، بدلاً من الحاجة إلى القلق بشأن مكان وضع الكود ومشكلات التكوين الأخرى.
تتناقض اصطلاحات CakePHP بشكل صارخ مع PHP نفسها ، وهي لغة ليبرالية إلى حد ما. نتيجة لاتفاقياتها ، تساعد CakePHP على ضمان المزيد من الاتساق في أسلوب الترميز وهيكله عبر مطورين متعددين وحتى عبر فرق متعددة. من خلال اعتماد مجموعة قياسية من الاتفاقيات ، تسعى Cake جاهدة إلى جعل التنمية أكثر اتساقًا.
بالنسبة لمخطط قاعدة البيانات ، على سبيل المثال ، يضع CakePHP بعض الافتراضات الافتراضية فيما يتعلق بكيفية تسمية متغيرات معينة وأسماء الجداول والحقول. على وجه التحديد ، تتوقع كيك ما يلي:
- ستكون أسماء الجداول بصيغة الجمع (على سبيل المثال ،
orders
) - سيكون اسم حقل المفتاح الأساسي
id
- ستستند أسماء أي حقول مفتاح خارجي إلى اسم الجدول المشار إليه متبوعًا بـ
_id
(على سبيل المثال ، سيتم تسمية المفتاح الخارجي في جدولcustomers
customer_id
).
للتوضيح ، دعنا نفكر في مراجعة بسيطة لجدولين ( articles
users
) من قاعدة بيانات منشورات المدونة. في مثالنا ، سنقول أن Articles
"تنتمي إلى" Users
، ومقالات Users
" Articles
". سيتم تحديد هذه العلاقات على النحو التالي في CakePHP 3.0:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }
يفترض CakePHP الاصطلاحات الافتراضية وبالتالي يعرف تلقائيًا المفاتيح الخارجية التي يجب البحث عنها (على سبيل المثال ، user_id
في جدول articles
) عند جلب أي اقترانات.
من المهم التأكيد ، مع ذلك ، على أن CakePHP 3 تسمح بتجاوز الاصطلاحات الافتراضية بسهولة. على سبيل المثال ، لنفترض أن المفتاح الخارجي الخاص بنا في جدول users
كان يسمى author_id
بدلاً من user_id
. يتطلب تحديد هذا فقط إجراء التغييرين الصغيرين التاليين على الكود الخاص بنا للسماح لـ CakePHP بمعرفة أننا لا نستخدم الإعداد الافتراضي:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }
لذلك ، على الرغم من أن الاتفاقيات جزء لا يتجزأ من CakePHP ولها مزاياها بالتأكيد ، فإن تجاوزها عند الضرورة أمر بسيط للغاية ، كما أوضحنا هنا.
في حين أن بعض المطورين قد يفضلون أطر PHP (مثل Yii و Laravel) التي لا تعتمد بشكل كبير على الاصطلاحات ، فإن اصطلاحات CakePHP يمكن أن تكون مفيدة جدًا في الواقع. يمكن أن تساعد في تقليل وقت الزيادة بشكل كبير لمطور CakePHP عند تكليفه بتعزيز أو الحفاظ على التعليمات البرمجية المكتوبة من قبل مطور آخر ، حيث إنها تؤدي إلى بنية واتفاقيات تشفير متسقة عبر العديد من مطوري ومشاريع CakePHP.

رسم الخرائط العلائقية للكائنات (ORM) في CakePHP
يستفيد رسم الخرائط الارتباطية للكائنات (ORM) الخاص بـ CakePHP بشكل كبير من اتفاقيات إطار عمل CakePHP. من خلال تحديد مخطط قاعدة البيانات وفقًا لمعايير Cake ، يمكنك توصيل الجداول معًا بسرعة من خلال إدارة ORM القوية في Cake. نادرًا ما تحتاج إلى كتابة جملة SQL ، حيث يتعامل CakePHP مع أشياء مثل روابط الجدول و hasMany
وحتى علاقات hasAndBelongsToMany
بسهولة.
الاستفادة من ContainableBehavior
، من خلال اقترانات النموذج ، يمكنك تحديد جداول وحقول قاعدة البيانات للاختيار من استعلام SQL. يمكن أن يتعمق هذا في عدة جداول ، ومن السهل إنشاء جمل SQL معقدة للغاية من خلال ORM.
بالمناسبة ، سلوك CakePHP's ContainableBehavior
هو مثال رائع على كيفية قيام CakePHP بتبسيط وتبسيط تطوير PHP. يساعدك على البحث عن البيانات وتصفيتها بطريقة نظيفة ومتسقة ويمكن أن يساعد أيضًا في زيادة السرعة والأداء العام لتطبيقك. (إنه يعمل عن طريق تغيير اقترانات النماذج الخاصة بك بشكل مؤقت أو دائم ، باستخدام الاحتواءات المتوفرة لإنشاء سلسلة مقابلة من bindModel
و unbindModel
.)
يتمثل التحدي الذي يواجه ORM في أنه يجعل استخدام SQL أمرًا بسيطًا للغاية بحيث إذا لم يكن المطور حريصًا ، فيمكنه كتابة استعلامات SQL غير فعالة دون قصد. لقد رأيت بالتأكيد تطبيقات كعكة سيئة الكتابة عدة مرات والتي لم تبسط استفساراتهم. تميل هذه المشكلات إلى الظهور بعد عامين من نشر النظام ، عندما تكبر قواعد البيانات وتصبح الاستعلامات المكتوبة بشكل سيئ بطيئة بشكل متزايد.
تكمن المشكلة الرئيسية هنا في أنه قبل أحدث إصدار من CakePHP 3 ، كان بإمكان Cake's ORM افتراضيًا استرداد أي جداول مرتبطة عند إجراء استعلام. نتيجة لذلك ، من المحتمل أن يصبح استعلام "العثور على الكل" البسيط منتفخًا تمامًا لأن SQL الأساسي سيسترد جميع البيانات من جميع الجداول المرتبطة. في الإصدار 3 ، لم يعد هذا السلوك هو السلوك الافتراضي. (وفي الإصدارات السابقة من CakePHP ، من السهل تعطيل هذا السلوك الافتراضي عن طريق إضافة public $recursive = -1;
إلى ملف AppModel.php
الرئيسي.)
بشكل عام ، تُظهر مراجعة طريقة إدارة الكيك في الكيك أنها تساعد حقًا في تبسيط التطوير ، وإذا تم استخدامها بشكل صحيح ، فهي أداة رائعة لبناء استعلامات معقدة بسرعة. ومع ذلك ، فمن الأهمية بمكان أن يأخذ المطورون الوقت الكافي لفهم ORM تمامًا ولضمان تحسين استفساراتهم بشكل صحيح (كما هو الحال في أي لغة).
المكونات والمساعدين: مكتبات CakePHP
واحدة من الميزات الرائعة لـ CakePHP هي المكتبات المدمجة - المكونات والمساعدات - التي تقضي على العديد من مهام التطوير المملة والمتكررة والمملة. في سياق MVC ، تساعد المكونات في تبسيط تطوير وحدة التحكم ، بينما يبسط Helpers عرض الترميز والمنطق (أي طبقة العرض التقديمي).
على سبيل المثال ، يقوم PaginatorComponent
بإنشاء واجهة صفحة تالية / سابقة بطريقة سحرية تلقائيًا من استعلام بحث. أضف JsHelper
، وفجأة يكون لديك AJAX Pagination ، مدعومًا بإطار عمل JavaScript المفضل لديك (jQuery افتراضيًا).
تتضمن العينة السريعة لأداة مساعدة مفيدة أخرى ما يلي:
-
TimeHelper
: يجعل عرض التواريخ والأوقات في غاية السهولة ، مما يوفر مجموعة من الوظائف لتنسيق قيم الوقت وتقييمها. -
NumberHelper
: يوفر طرقًا ملائمة لعرض الأرقام في مجموعة متنوعة من التنسيقات والدقة الشائعة (أو المخصصة). -
TextHelper
: يساعد في تمكين الروابط ، وتنسيق عناوين URL ، وإنشاء مقتطفات من النص حول الكلمات أو العبارات المختارة ، وتسليط الضوء على الكلمات الرئيسية في كتل من النص ، والاقتطاع بأمان لمسافات طويلة من النص.
وهناك غيرها الكثير.
انتقادات لـ CakePHP 3
من المؤكد أن كل إطار له مميزاته وعيوبه ، و CakePHP ليس استثناءً. فيما يلي بعض الانتقادات الأكثر شيوعًا التي تم توجيهها إلى CakePHP خارج هذه المراجعة:
"إطار الإرث ؛ منتفخة وبطيئة ". هذا النقد هو عادة تاريخي أكثر ، مع حقيقة محدودة (إن وجدت) اليوم. يتطلب دعم إصدارات PHP التي تعود إلى PHP 4 تاريخياً أن يتعامل CakePHP مع العديد من المشكلات القديمة الخاصة بـ PHP. مع نضج PHP وإصدار CakePHP الإصدار 3 على وجه الخصوص ، فقد هذا الادعاء حقًا صحته.
"صارمة للغاية ومقيدة." في حين أن هناك مزايا واضحة لاتفاقيات CakePHP ، إلا أن هناك من ينتقدها بالرغم من ذلك. غالبًا ما يجادل النقاد بأن الاتفاقيات صارمة للغاية ، لكنهم يفشلون في إدراك (أو الاعتراف) بإمكانية تجاوز هذه الاتفاقيات بسهولة . من خلال اعتماد مجموعة قياسية من الاصطلاحات ، يتطلع Cake إلى جعل التطوير متسقًا والذي ، نظرًا لممارسات الترميز الفضفاضة في PHP ، يجب أن يُنظر إليه فقط على أنه شيء إيجابي.
"دورة الإطلاق البطيئة". دورة الإطلاق البطيئة ليست بالضرورة سيئة. على العكس من ذلك ، يمكن أن تكون دورة التحرير شديدة العدوانية في الواقع أكثر إشكالية. في الواقع ، جزء من السبب في أن الإصدارات الرئيسية لـ CakePHP تستغرق وقتًا هو ضمان التوافق مع الإصدارات السابقة مع الإصدارات السابقة من PHP التي لا تزال منتشرة على نطاق واسع. علاوة على ذلك ، فإن دورة الإصدار المحافظة هذه والتركيز على التوافق مع الإصدارات السابقة يلغي الحاجة إلى إجراء تغييرات كبيرة (ومتكررة) على التعليمات البرمجية عند إصدار إصدارات جديدة. وتجدر الإشارة أيضًا إلى أن فريق CakePHP 3 ليس بطيئًا عندما يتعلق الأمر بالإصدارات الصغيرة (إصلاحات الأخطاء ، والتصحيحات ، والتحسينات الطفيفة ، وما إلى ذلك) ، والتي يتم إصدارها شهريًا . وبالمثل ، يتم الرد على معظم تذاكر الأخطاء في غضون ساعات من نشرها.
"ليس حلاً خارج الصندوق." على عكس العديد من أطر PHP الحديثة "لتطبيقات الويب الجاهزة" (مثل Yii ، على سبيل المثال) ، يتطلع CakePHP بشكل هادف إلى دعم الحلول المخصصة وتمكينها. لقد استفدت شخصيًا من هذا كثيرًا في تطوير عدد من مواقع الويب والتطبيقات الكبيرة والمخصصة والقائمة على قواعد البيانات.
"يستخدم مصفوفات البيانات بدلاً من الكائنات". لم يعد هذا صحيحًا ، اعتبارًا من الإصدار 3. في الإصدارات السابقة ، يجب تخزين أي بيانات والإشارة إليها كمصفوفات متداخلة (على سبيل المثال ،
$user['User']['username']
). يعالج CakePHP 3 هذا الأمر أخيرًا ، بدلاً من تخزين البيانات ككائنات (على سبيل المثال ،$user->username
)."وثائق رديئة". هناك بعض المصداقية في هذا النقد ، في أن وثائق CakePHP لا يبدو دائمًا أنها تمت كتابتها مع وضع المبتدئين في الاعتبار (تتم أحيانًا مناقشة المعلومات المهمة في جملة أو اثنتين فقط ، في حين أنه من المحتمل أن يكون هناك ما يبرر بضع فقرات من المناقشة ). يدرك فريق تطوير الكيك هذا ويعمل على تحسين التوثيق وفقًا لذلك. في الواقع ، تنص الصفحة الرئيسية لوثائق CakePHP 3 صراحةً على مستوى عالٍ من الالتزام بـ "جودة وصحة ودقة" الوثائق. نظرًا لأن CakePHP عبارة عن إطار عمل يحركه المجتمع ، يتم توفير زر "تحسين هذا المستند" في كل صفحة من الوثائق ، مما يتيح ويشجع مستخدمي CakePHP على المساهمة في عمليات الإضافة أو الحذف أو التصحيحات الخاصة بهم في الوثائق.
خاتمة
الكل في الكل ، بعد ما يقرب من 10 سنوات من إطلاقه الأولي ، يكشف استعراض CakePHP أنه لا يزال منافسًا قويًا وحيويًا للعديد من أطر PHP الأخرى التي ظهرت منذ ذلك الحين.
CakePHP هو حل تطوير كامل وشامل. قاعدة الشفرة ناضجة ويبدو أن الوظائف لا حصر لها. بشكل عام ، تم بناء Cake لتسريع التطوير ، وهو أمر مهم ليس فقط لمطوري البرمجيات ، ولكن أيضًا للمستثمرين. أكبر تكلفة لتطوير البرمجيات هي تكلفة وقت التطوير ، ويهدف CakePHP إلى تقليل وقت التطوير بشكل كبير.
CakePHP هو مشروع يديره المجتمع. يمكن أن تتحسن فقط مع مشاركة المزيد والمزيد من الناس. بعد أن شاركت لمدة 7 سنوات ورأيت المجتمع يواصل النمو ، أنا متحمس لهذه المرحلة التالية لـ CakePHP. إن إطلاق CakePHP 3 ، ونضج كل من PHP و CakePHP ، يعني أن إطار العمل سيستمر في التحسن.
إذا كنت تبحث عن حل قائم على PHP يقدم العديد من المزايا المشابهة لـ Ruby on Rails (من حيث سهولة الاستخدام والاتفاق على التهيئة) ، فامنح CakePHP دوامة. يستغرق البرنامج التعليمي لـ CakePHP Blog Tutorial بضع دقائق فقط للإعداد والتشغيل ، أو بدلاً من ذلك ، يقدم CakeCoded سلسلة من الدروس الواضحة للمساعدة في تعريف مطور PHP بـ CakePHP والبدء في استخدامه. باستخدام هذه الموارد ، سترى بسرعة إلى أي مدى يمكن لـ CakePHP تسريع وتعزيز جهود تطوير برامج PHP. استمتع!
مايكل هوتون مهندس Toptal مقيم في أيرلندا ويتمتع بخبرة واسعة في CakePHP. لقد طور أكثر من 100 موقع إلكتروني مع الإطار ، وعمل مع الفريق في CakeDC (الكيان التجاري الذي يقف وراء إطار CakePHP) ، وقدم تصحيحات مختلفة ، وساعد في توثيق CakePHP.