اذهب إلى المحتوى

السؤال

نشر (معدل)

عند بناء api باستعمال لارافيل , فانه من الاحسن استعمال User::findOrFail($id) بدلا من User::find($id)   و لكن اليس كلاهما غير مهم اذ انه عند الانتهاء من التطوير نفعل الخيار APP_DEBUG=true في ملف .env 

هل من حاجة لاستعمال findOrFail() ?

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال

Recommended Posts

  • 1
نشر

استخدام findOrFail($id) بدلاً من find($id) يعتبر عملية جيدة في بعض الحالات وذلك لضمان أمان التطبيق والتعامل مع الأخطاء بشكل أفضل.

ولكن يجب توضيح الفرق بين الاثنين:

User::find($id)

تلك الطريقة تقوم بالبحث عن سجل في قاعدة البيانات باستخدام المفتاح الرئيسي للجدول (وغالبًا ما يكون الـ ID)، وإن وجد السجل، فيتم إرجاع السجل نفسه، وإذا لم يتم العثور عليه، فيتم إرجاع قيمة null.

User::findOrFail($id)

نفس عملية البحث السابق، ولكن في حالة عدم العثور على السجل، فيتم برفع استثناء من نوع ModelNotFoundException، وذلك يعني أنه إذا لم يتم العثور على السجل، يتم رمي استثناء وتوقف تنفيذ البرنامج، مما يتطلب التعامل مع الاستثناء في الكود.

السبب الرئيسي لاستخدام findOrFail($id) هو تجنب الحصول على قيمة null ومعالجة تلك القيمة في حالة عدم وجود السجل المطلوب في قاعدة البيانات، وعند استخدام findOrFail($id)، تستطيع ببساطة التعامل مع الاستثناء المرتبط في الكود، مما يسهل تحديد الأخطاء والتعامل معها بشكل أفضل.

إذا قمت بتعيين APP_DEBUG=true في ملف .env، فذلك سيساعدك في رؤية الأخطاء والاستثناءات التي تم رفعها، ولكن لا ينصح بالاعتماد على ذلك الإعداد في بيئة الإنتاج، حيث سيكشف عن معلومات حساسة.

أي بإختصار، سيتسبب استخدام User::find($id) في تلقي المستخدمين خطأً 500 ، مما قد يكشف عن بيانات غير مقصودة، وسيتسبب استخدام User::findOrFail($id) في تلقي المستخدمين خطأ 404 ، والذي يعد أكثر أمانًا.

بالإضافة إلى ذلك ، فإن استخدام User::findOrFail($id) سيساعد على منع الأخطاء التي قد تحدث إذا لم يكن المستخدم موجودًا، وإذا استخدمت User::find($id) ولم يكن المستخدم موجودًا ، فستتلقى خطأً 500.

مما يؤدي إلى توقف API الخاص بك عن العمل، وسيكون من الصعب تحديد سبب المشكلة، وسيتسبب استخدام User::findOrFail($id) في تلقي خطأ 404 ، مما سيسهل تحديد سبب المشكلة وإصلاحها.

  • 1
نشر

استخدام User::findOrFail($id) هو الأكثر أمانًا من User::find($id) عند البحث عن سجل محدد في قاعدة البيانات. وهذا لأن هذا الأخير يقوم بإعادة قيمة Null في حالة عدم وجود سجل، على عكس الأول الذي يقوم برمي استثناء ModelNotFoundException.

لذلك، عندما تكون متأكدًا أن السجل المطلوب يجب أن يكون موجودًا -مثل أول صف مثلا من جدول إعدادات أو تفضيلات الموقع-، فإن استخدام `User::findOrFail($id)` يساعد على توفير شيفرة أكثر أمانًا وأكثر دقة في التعامل مع حالات عدم وجود السجل.

وهذا لكي لا تضطر إلى التعامل مع حالات Null في ملفات المتحكمات أو العروض.

  • 0
نشر

بالإضافة للشرح السابق الرائع استخدام `find($id)` يكون مناسبًا في بعض الحالات التي لا تتطلب التعامل الصارم مع عدم العثور على السجل. إليك بعض الحالات التي يمكن أن يكون فيها استخدام `find($id)` أفضل:

  •  عندما تكون على يقين تام بأن السجل المطلوب موجود: إذا كنت تعلم أن السجل المطلوب سيكون موجودًا بالتأكيد في قاعدة البيانات، فيمكنك استخدام `find($id)` بدون الحاجة إلى التحقق من القيمة المُعادة. هذا يمكن أن يكون مفيدًا في حالات عملية بحث عن سجلات معروفة مسبقًا.
  • عندما تحتاج إلى التحكم الكامل في استثناء العثور: إذا كنت ترغب في تعريف استثناء مخصص عند عدم العثور على السجل بدلاً من استخدام الاستثناء الافتراضي `ModelNotFoundException` الذي يتم رميه بواسطة `findOrFail($id)`، فيمكنك استخدام `find($id)` ومن ثم التحقق يدويًا من القيمة المُعادة ورمي الاستثناء المناسب وفقًا لذلك.
  • عندما تريد استخدام القيمة المُعادة بدون التحقق منها: في بعض الحالات، قد تحتاج إلى استخدام القيمة المُعادة حتى إذا كانت `null`. على سبيل المثال، إذا كنت تقوم بتحديث سجل معين إذا وجد، وإلا قم بإنشاء سجل جديد، فيمكنك استخدام `find($id)` للبحث عن السجل الموجود والحصول على قيمته دون الحاجة إلى التحقق من القيمة المُعادة.

في النهاية، يتعلق الأمر بمتطلبات تطبيقك وطريقة التعامل مع عدم العثور على السجلات. إذا كنت ترغب في التعامل بشكل صارم مع حالة عدم العثور، فيفضل استخدام `findOrFail($id)`، وإذا كنت ترغب في التحكم الكامل في التعامل مع حالة عدم العثور، فيفضل استخدام `find($id)` والتحقق اليدوي من القيمة المُعادة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...