البحث في الموقع
المحتوى عن 'حذف'.
-
هل سبق لك أن وجدت على موقع ووردبريس الخاص بك رابطا أو مجموعة من الروابط التي تؤدي إلى خطأ 404 (“404” error) سيء السمعة؟ إن كان الأمر كذلك حاول أن لا تنزعج فحدوث هذا الأمر وارد جدا، كل ما في الأمر أنك وجدت رابطا لا يؤدي إلى المكان المُفترض به. تتميز الروابط المعطلة المعروفة أيضا باسم الروابط الميتة (dead links) بانتشارها الكبير وتكرر حدوثها، يعمل متصفحك من خلال الخطأ 404 (404 error) على إخبارك بأن الرابط المعني يؤدي إلى مكان لا يوجد فيه شيء. يعتبر الحفاظ على فاعلية روابط موقعك أمرا حساسا كونها تعتبر جزءا أساسيا من مصداقية موقعك، قد يسعدك سماع أن إصلاح الروابط المعطلة يعد أمرا غايةً في السهولة، بعد قراءة هذا الموضوع ستتعرف عن كثب عن ماهية الروابط المعطلة، أخذ نظرة حول بعض أفضل أدوات فحص الروابط (link-checking) ثم تتعلّم كيفية القيام بإصلاح وحذف هذه الروابط باستعمال ملحق Broken Link Checker. ما هي الروابط المعطلة؟ على عكس الروابط التي تشتغل بشكل عادي، تقوم الروابط المعطلة بالتوجيه إلى الخطأ 404 عند الضغط عليها، ما يحدث غالبا بسبب محاولة تحويل الزوار إلى صفحة مفقودة أو إلى مصدر غير موجود. توجد الروابط المعطلة كنتيجة لمجموعة من الأسباب، أحد أكثرها حدوثا هو الرّابط URL بالتوجيه إلى نطاق لم يعد موجودا، يتوفر على إعدادات جدار ناري غير قياسية، تعرض للقرصنة أو فشل في الحفاظ على استضافة مناسبة. عدا هذا، قد تنتج الروابط المعطلة أحيانا عن الكتابة غير الصحيحة لعناوين URL الخاصة بإعادة التوجيه (redirecting URLs). فعلى سبيل المثال لدى إضافة رابط إلى تدوينة جديدة وإذا لم تُضف //:http إليها (كما في الصّورة التّالية) فإنّه سينتج عنه رابط ميّت. أين يتجلى بالضبط الخطأ في القيام بذلك؟ توجد في الواقع مجموعة كبيرة من الأخطاء. عند القيام بكتابة عنوان URL الخاص بجوجل (Google URL) بهذه الطريقة يتم دفع المتصفح إلى البحث على: google.com داخل موقعك (شيء ما من قبيل http://www.yoursite.com/google.com). سواء كنت تقوم بصياغة (creating) أو تثبيت (fixing) رابط ما تذكر دوما الإشارة إلى عنوان URL كاملا، الأمر الذي يمكنك القيام به من خلال إضافة "http://www" إلى الصفحة المعنية التي تريد إعادة التوجيه إليها (http://www.google.com/maps على سبيل المثال). حلول فحص الروابط على ووردبريس بعد أن أصبح بإمكانك التعرف على الروابط المعطلة، عليك الآن بتحديدها ثم القيام بالتعديل عليها أو حذفها. رغم أن القيام بتحديد أماكن الروابط المعطلة قد يبدو أمرا سهلا إلا أنه أصعب مرحلة في هذه العملية، تتغير طريقة إيجادك للروابط المعطلة على موقعك بتغير وتيرة نشرك وكثافة محتوى موقعك، إن كنت تملك موقعا صغير الحجم نسبيا بعدد روابط قليل قد تتمكن من القيام بتجريبها يدويا مرة في الشهر وإصلاح المعطلة منها. هل يمكنك تخيل استعمال هذه العملية اليدوية مع موقع كبير الحجم؟ من أجل سلامتك العقلية لا تقم بذلك. رغم أن تكبد عناء القيام بتجربة كل الروابط على موقع كبير الحجم قد يساعد في صقل الشخصية إلا أن القيام باستعمال أداة فحص الروابط يسمح لك بتقليص ساعات أو حتى أيام من العمل إلى مجرد بضع ثوان، فضلا عن أن استعمال البرنامج المناسب يساعد على توفير الوقت، يوجد أيضا عدد كبير من الخيارات لفحص الروابط على ووردبريس، يمكن الحصول على أغلبها بشكل مجاني. يجدر بك بطبيعة الحال القيام بالموازنة بين إيجابيات وسلبيات الأدوات التي تضعها بعين الاعتبار قبل القيام بالاختيار، إن كنت نصبت مسبقا أدوات مشرفي المواقع الخاصة بجوجل (Webmaster Tools) فأنت على أتم الاستعداد لقيام المفهرسات التلقائية (crawlers) بفحص موقعك، أما إن كنت تفضل بدأ بحثك الخاص فعليك باستعمال بعض المواقع مثل: iWebTool Broken Link Checker و Online Broken Link Checker للقيام بفحص سريع لموقعك. Broken Link Checker رغم أنه ليس الخيار الوحيد إلا أن Broken Link Checker يعتبر ملحقا جيدا للقيام بفحص روابط ووردبريس. يُقَدِّرُ الكثيرون بخصوص هذا الملحق روتينَ قيامه بالفحوصات، طريقةَ تنظيمه للروابط المعطلة في جدول سهل الاستعمال، اكتشاف الصور الناقصة فضلا عن معلمةِ مقاطع فيديو يوتيوب الناقصة. حتى وإن كان هذا الملحق لا يتوافق مع غيره من الملحقات ويسبب بعض البطء في الاستعمال ما يؤدي إلى شكاوى المستعملين إلا أنه تم تنصيبه على 000 400 موقع إلى حدود الساعة. تجدر الإشارة إلى أن الهدف من هذا المقال ليس القيام بالترويج لملحق ما على حساب الآخر، يمكن أن تجد عددً كبيرًا من الملحقات على الصفحة الرسمية للموقع WordPress directory، بعد قراءتك لهذا الموضوع قد تقرر أن ملحقا آخر هو الحل الأنسب لمتطلباتك، بما أن التعليمات التالية لفحص الروابط لا يمكن شرحها إلا على ملحق واحد سنقوم باستعمال Broken Link Checker كمثال تطبيقي، كما أنه المفضل لدي. كيفية القيام بإصلاح أو حذف الروابط المعطلة باستعمال Broken Link Checker بمجرد القيام بتنصيب وتفعيل Broken Link Checker سيقوم بمباشرة بفحص موقعك، يمكنك التّحقّق من تقدم البحث من خلال الذهاب إلى: Settings > Link Checker على لوحة التحكم الخاصة بووردبريس: يمكنك القيام بتغيير عدد من الإعدادات من على نفس الصفحة، بما فيها التالي: تغيير وتيرة فحص الروابط الموجودة (يتم فحص الروابط الجديدة بشكل مباشر). إعداد التنبيه بوجود الروابط المعطلة باستعمال رسالة إلكترونية. استعمال تنسيق خاص للروابط المعطلة و/أو المحذوفة. منع محركات البحث من اتباع الروابط المعطلة. يمكن لك استعمال الإعدادات المتقدمة من خلال تبويب Advanced . عند استعدادك للقيام بإصلاح بعض الروابط، قم بالضغط على رابط Found (x) broken links أعلى نافذة الملحق. يدل العدد المشار إليه على تعداد الروابط المعطلة لديك، سيتم تقديم قائمة روابط لك على الشكل التالي: يوجد الكثير من المعلومات لاستيعابها هنا، من الجيد أن الواجهة تتميز بكونها سهلة الاستعمال، من اليسار إلى اليمين نجد: عنوان URL الخاص بالرابط المعطل، حالة الرابط المعطل، النص المنشور الخاص بالرابط المعطل ثم المصدر (أي الصفحة، المنشور أو التعليق الذي يوجد الرابط المعطل فيه). إن التعامل مع الروابط المعطلة أمر في غاية السهولة ، فقط قم بوضع مؤشر الفأرة (دون الحاجة إلى الضغط) على الرابط لإظهار خياراتك: تشرح الخيارات الظاهرة هنا نفسها بنفسها: Edit URL: التعديل على عنوان URL أي القيام بتصحيحه. Unlink: القيام بإلغاء الرابط (مع الإبقاء على النص المنشور). Not broken: القيام بتعليم الرابط على أنه غير معطل (بعد الضغط على هذه الخاصية سيختفي الرابط). Dismiss: إخفاء الرابط (سيتم وضع الرابط في صنف Dismissed (الروابط التي يتم تجاهلها)) Recheck: القيام بإعادة فحص الرابط إن كنت تعتقد أنه يعمل الآن. هذا كل ما في الأمر، تجوّل في الروابط واتخذ الخيارات التي تراها مناسبة. هنالك المزيد مما يمكن لهذا الملحق القيام به، لكن استنادا إلى مبدأ باريتو (Pareto Principle) أود أن أشارك معكم نصيحة واحدة فعالة. من خلال تجربتي، تأتي معظم الروابط المعطلة من قسم التعليقات، غالبا على شكل روابط لمواقع المعلقين تم إدخالها بشكل خاطئ أو فقط لم تعد موجودة. عادة ما سترغب بالاهتمام بشكل أكبر لإلغاء، إصلاح وحذف الروابط المعطلة الموجودة في المنشورات أو الصفحات عوض القيام بالتنقل بين العشرات (أو حتى المئات) من تلك الموجودة في التعليقات. لذا عوض تضيع الوقت في التعامل مع كل من هذه الأخيرة على حدة يمكنك القيام باستعمال خاصية التصفية الخاصة بـ Broken Link Checker للقيام بإلغاء كل هذه الروابط (Unlink) دفعة واحدة. قم أولا بالذهاب إلى: Tools > Broken Links في لوحة تحكم ووردبريس ثم اضغط على زر Search: قم بتحديد Broken من قائمة الاختيارات المنسدلة Link status و Links used in Comments من قائمة الاختيارات المنسدلة Link type، ثم قم بالضغط على زر Search Links ما سيعطيك قائمة بالروابط المعطلة المتواجدة في قسم التعليقات فقط. إن كنت مثلي فستحصل على الكثير من هذه الروابط، قبل حذفها كلها دفعة واحدة قم بالضغط على تبويب Screen Options وقم بالرفع من عدد Show on screen ليساوي أو يتعدى عدد الروابط المعطلة: قم بالضغط على Apply عندما تكون مستعدا، قد تستغرق العملية ثانية أو ثانيتين إن قمت باختيار عدد كبير (استغرق الأمر ثانيتين عند اختيار 260). لم يتبقى إلا القيام بفك هذه الروابط المعطلة، فقط قم بتحديد كل المنشورات من خلال الضغط على مربع الاختيار الرئيسي (‘master 'checkbox ) أعلى القائمة. قم بتحديد Unlink من قائمة الاختيارات المنسدلة Bulk Actions، ستظهر لك علبة تأكيد قم بالموافقة عليها. بعد ذلك عليك بالانتظار قد يستغرق الأمر بعض الثّواني لأن على الملحق القيام ببعض العمل، بمجرد الانتهاء سيتم تقديم شاشة تأكيد بسيطة. تم الحذف بنجاح. خلاصة إن كنت قد تابعت حتى هذه النقطة فستكون تعرفت على كيفية تحديد، تعديل أو حذف الروابط المعطلة. في حين توجد العديد من الخيارات لإيجاد الروابط المعطلة، تعتبر الملحقات التي تخول برمجة عمليات الفحص أفضل من مواقع فحص الروابط التي تتطلب منك القيام بالعملية بشكل يدوي في كل مرّة. تتميز الفحوصات الأوتوماتيكية والمبرمجة بكونها أكثر حيوية، ذلك أن الروابط تتعطل عندما لا تتوقع ذلك وهو غالبا ما يحدث. من المُؤكّد أن لا شيء أفضل من استثمار بعض الوقت في إعداد ملحق أوتوماتيكي وعدم الحاجة للتفكير في هذا الأمر بعد ذلك إلى أن تتلقى رسالة تنبيه إلكترونية تشير إلى عطل في أحد الروابط. حتى وإن لم يكن الحفاظ على عمل روابطك سببا في إغداق المديح عليك، سبق لنا جميعا التواجد في مواقع حيث لا يمكن الولوج إلى روابط تتضمن معلومات حيوية، فلنحاول أن نكون أفضل من هذا. تذكر دوما أن الوقت والجهد اللذان تستثمرس في الحفاظ على عمل روابطك ليس مجرد تحسين لموقعك بل يتعدى ذلك ليكون عملية وضع الأساس لبناء تجربة مستخدم قَيِّمَةٍ. ترجمة -وبتصرّف- للمقال: HOW TO FIX (OR REMOVE) BROKEN LINKS ON YOUR WORDPRESS WEBSITE لصاحبه: TOM EWER.
- 1 تعليق
-
- 1
-
- إصلاح
- broken link checker
- (و 6 أكثر)
-
بعد أن انتهينا من إعداد المشروع وإنشاء توابع وعروض الإنشاء والتخزين والعرض، سوف نقوم في درسنا الأخير اليوم بكتابة الشيفرة البرمجية لتوابع التعديل والتحديث والحذف ومن ثم العروض الموافق لها. تابع Editإن توابع وعروض edit وdelete غير موجودة لحد الساعة، فلننشئها، سنبدأ بالعمل على edit أولا. عدل على تابع المتحكم: public function edit($id) { $marketingImage = Marketingimage::findOrFail($id); return view('marketingimage.edit', compact('marketingImage')); }مرة أخرى قمنا باستخدام تابع findOrFail وقمنا بإرسال الكائن إلى العرض لأننا نريد أن نقوم بتعبئة الاستمارة مسبقا بالقيم المناسبة من سجلات البيانات. عرض Editعدل على ملف views/marektingimage/edit.blade.php ليكون كالتالي: @extends('layouts.master') @section('content') {!! Breadcrumb::withLinks(['Home' => '/', 'marketing images' => '/marketingimage', "edit $marketingImage->image_name.$marketingImage->image_extension" ]) !!} <h1>Edit {{ $marketingImage->image_name. '.' . $marketingImage->image_extension }} </h1> <hr/> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>Whoops! </strong> There were some problems with your input. <br> <br> <ul> @foreach ($errors->all() as $error) <li>{{ $error }} </li> @endforeach </ul> </div> @endif <div> Note: name and path values cannot be changed. If you wish to change these, then delete and create a new photo: </div> <br> {!! Form::model($marketingImage, ['route' => ['marketingimage.update', $marketingImage->id], 'method' => 'PATCH', 'class' => 'form', 'files' => true] ) !!} <!-- image name Form Input --> <div> <ul> <li> <h4>Image Name: {{ $marketingImage->image_name. '.' . $marketingImage->image_extension }} </h4> </li> <li> <h4>Image Path: {{ $marketingImage->image_path }} </h4> </li> <li> <h4>Mobile Name: {{ $marketingImage->mobile_image_name. '.' . $marketingImage->mobile_extension }} </h4> </li> <li> <h4>Mobile Path: {{ $marketingImage->mobile_image_path }} </h4> </li> </ul> </div> <!-- is_something Form Input --> <div class="form-group"> {!! Form::label('is_active', 'Is Active:') !!} {!! Form::checkbox('is_active') !!} </div> <!-- is_featured Form Input --> <div class="form-group"> {!! Form::label('is_featured', 'Is Featured:') !!} {!! Form::checkbox('is_featured') !!} </div> <!-- form field for file --> <div class="form-group"> {!! Form::label('image', 'Primary Image') !!} {!! Form::file('image', null, array('class'=>'form-control')) !!} </div> <!-- form field for file --> <div class="form-group"> {!! Form::label('mobile_image', 'Mobile Image') !!} {!! Form::file('mobile_image', null, array('class'=>'form-control')) !!} </div> <div class="form-group"> {!! Form::submit('Edit', array('class'=>'btn btn-primary')) !!} </div> {!! Form::close() !!} <div> {!! Form::model($marketingImage, ['route' => ['marketingimage.destroy', $marketingImage->id], 'method' => 'DELETE', 'class' => 'form', 'files' => true] ) !!} <div class="form-group"> {!! Form::submit('Delete Photos', array('class'=>'btn btn-danger', 'Onclick' => 'return ConfirmDelete();')) !!} </div> {!! Form::close() !!} </div> @endsection @section('scripts') <script> function ConfirmDelete() { var x = confirm("Are you sure you want to delete?"); if (x) return true; else return false; } </script> @endsectionلم نسمح للمستخدم بتعديل أسماء الصور أومساراتها لأننا نريدهم أن يقوموا بحذف السجلات والبدء من جديد وإلا سيكون الأمر معقدا عندما نقوم بتعديل الأسماء التي قمنا بحفظها في السجلات وهذا الأمر لا يدخل في نطاق الدرس. ماهي الاختلافات الأخرى في الاستمارة ؟ سوف تلاحظ أننا نستخدم حقول أقل وقمنا باستخدام الربط بين النموذج والاستمارة في مساعدي الاستمارة (form helper): {!! Form::model($marketingImage, ['route' => ['marketingimage.update', $marketingImage->id], 'method' => 'PATCH', 'class' => 'form', 'files' => true] ) !!}إن مثيل النموذج marketingImage$ مرتبط بالاستمارة لذلك سيتم تعبئة الحقول بشكل مسبق، ولاحظ أننا قمنا أيضا بتحديد marketingImage->id$ حتى نتمكن من إرسال ذلك إلى تابع المتحكم وتعديل السجل الصحيح. ولقد قمنا بتعيين قيمة PATCH إلى method وهذه سوف تتغير تلقائيا لأن HTML لا يدعم PATCH، ولقد قمنا بتعيين قيمة true إلى files حتى نتمكن من إرسال الملفات. بقية الشيفرة سهلة وقمنا بشرحها سابقا، لاحظ أننا قمنا بوضع زر للحذف في الأسفل في حالة ما أراد المستخدم الحذف بدل التعديل. عند سير العمل بطريقة عادية، سوف تكون خطوتك القادمة في الغالب الانتقال إلى تابع update في MarketingImagesController لكننا سنقوم بإنشاء صنف request للتعامل مع سيناريو update. EditImageRequestالفرق في عملية التحقق بين create و update هو أنه عندما تقوم بإنشاء صورة سيكون ملف الصورة إلزاميا على عكس التحديث، لذلك قررت لأجل البساطة والوضوح أن نقوم بإنشاء صنف request منفصل باسم EditImageRequest بدلا من وضعه في صنف request واحد. المشكلة التي واجهتها هي أنني لا أعرف كيف أجعلها شرطية فعلى أي تابع يجب وضع الصنف، لذلك بدأت في التفكير في الأمر، فبدلا من ذلك، يمكنني أن أقوم بتمرير حقل خفي والذي سوف يُعرف الاستمارة وسوف أقوم بوضع فيه عنصر تحكم منطقي (controlling logic)، فإذا كانت الاستمارة استمارة create، فستكون الصور إلزامية، لكنني في النهاية قررت أنه من الأسهل أن أقوم بعمل صنف منفصل. لذلك قم بتنفيذ هذا الأمر من سطر الأوامر: php artisan make:request EditImageRequestثم قم بتعيين قيمة return true في تابع authorize في ذلك الصنف وعدل تابع rules إلى التالي: public function rules() { return [ 'is_active' => 'boolean', 'is_featured' => 'boolean', 'image' => 'mimes:jpeg,jpg,bmp,png | max:1000', 'mobile_image' => 'mimes:jpeg,jpg,bmp,png | max:1000' ]; }قمنا بالفعل بالتحدث عن تابع rules سابقا ولا داعي لإعادة شرحه هنا. تابع Updateلنقم الآن بالانتقال إلى تابع update في MarketingImageController، عدله كما يلي: public function update($id, EditImageRequest $request) { $marketingImage = Marketingimage::findOrFail($id); $marketingImage->is_active = $request->get('is_active'); $marketingImage->is_featured = $request->get('is_featured'); $this->formatCheckboxValue($marketingImage); $marketingImage->save(); if ( ! empty(Input::file('image'))){ $destinationFolder = '/imgs/marketing/'; $destinationThumbnail = '/imgs/marketing/thumbnails/'; $file = Input::file('image'); $imageName = $marketingImage->image_name; $extension = $request->file('image')->getClientOriginalExtension(); //create instance of image from temp upload $image = Image::make($file->getRealPath()); //save image with thumbnail $image->save(public_path() . $destinationFolder . $imageName . '.' . $extension) ->resize(60, 60) // ->greyscale() ->save(public_path() . $destinationThumbnail . 'thumb-' . $imageName . '.' . $extension); } if ( ! empty(Input::file('mobile_image'))) { $destinationMobile = '/imgs/marketing/mobile/'; $mobileFile = Input::file('mobile_image'); $mobileImageName = $marketingImage->mobile_image_name; $mobileExtension = $request->file('mobile_image')->getClientOriginalExtension(); //create instance of image from temp upload $mobileImage = Image::make($mobileFile->getRealPath()); $mobileImage->save(public_path() . $destinationMobile . $mobileImageName . '.' . $mobileExtension); } flash()->success('image edited!'); return view('marketingimage.edit', compact('marketingImage')); }دعونا نبدأ بتوقيع التابع: public function update($id, EditImageRequest $request) {سوف ترى أننا نقوم بسحب مثيل من كائن request الصحيح، وقمنا باستخدام findOrFail في نموذج السجل حتى نتمكن من تعيين القيم من مثيل request، وبعد ذلك قمنا بتهيئة (format) قيم خانة الاختيار (checkbox) ثم حفظناها: $marketingImage = Marketingimage::findOrFail($id); $marketingImage->is_active = $request->get('is_active'); $marketingImage->is_featured = $request->get('is_featured'); $this->formatCheckboxValue($marketingImage); $marketingImage->save();إذا لم تكن الصورة الأولية فارغة، سوف نقوم بالتحديث: if ( ! empty(Input::file('image'))){ $destinationFolder = '/imgs/marketing/'; $destinationThumbnail = '/imgs/marketing/thumbnails/'; $file = Input::file('image'); $imageName = $marketingImage->image_name; $extension = $request->file('image')->getClientOriginalExtension(); //create instance of image from temp upload $image = Image::make($file->getRealPath()); //save image with thumbnail $image->save(public_path() . $destinationFolder . $imageName . '.' . $extension) ->resize(60, 60) // ->greyscale() ->save(public_path() . $destinationThumbnail . 'thumb-' . $imageName . '.' . $extension); }ثم سنفعل نفس الشيء على صور الهاتف: if ( ! empty(Input::file('mobile_image'))) { $destinationMobile = '/imgs/marketing/mobile/'; $mobileFile = Input::file('mobile_image'); $mobileImageName = $marketingImage->mobile_image_name; $mobileExtension = $request->file('mobile_image')->getClientOriginalExtension(); //create instance of image from temp upload $mobileImage = Image::make($mobileFile->getRealPath()); $mobileImage->save(public_path() . $destinationMobile . $mobileImageName . '.' . $mobileExtension); }ثم قمنا بتنفيذ flash لـ success وبعد ذلك قمنا بالعودة return وفي حالتنا هذه إلى صفحة التعديل edit، لكن يمكنك تغيير العودة إلى أي صفحة تريدها: flash()->success('image edited!'); return view('marketingimage.edit', compact('marketingImage'));أرجو ملاحظة أنه إذا كنت تقوم بعمل هذا لشركة تطوير، ربما قد تريد أن تجعل هذه الشيفرة أقوى عن طريق التحقق من أن الملف قد تم إنشاءه، وسوف تتعامل مع الأمر بشكل مختلف إذا لم يعمل لبعض الأسباب، لكن كل هذا خارج نطاق الدرس. حسنا، الآن آخر خطوة في درسنا. تابع Destroyسوف نحتاج إلى كتابة تابع destroy للتعامل مع حذف الصور: public function destroy($id) { $marketingImage = Marketingimage::findOrFail($id); $thumbPath = $marketingImage->image_path.'thumbnails/'; File::delete(public_path($marketingImage->image_path). $marketingImage->image_name . '.' . $marketingImage->image_extension); File::delete(public_path($marketingImage->mobile_image_path). $marketingImage->mobile_image_name . '.' . $marketingImage->mobile_extension); File::delete(public_path($thumbPath). 'thumb-' . $marketingImage->image_name . '.' . $marketingImage->image_extension); Marketingimage::destroy($id); flash()->success('image deleted!'); return redirect()->route('marketingimage.index'); }يمكنك أن ترى أننا قمنا باستخدام findOrFail على id الذي تم استلامه عن طريق التوقيع، ثم استخدمنا مساعدي الملف (File helper) لـ Laravel للحذف، وهكذا تحصلنا مرة أخرى على صياغة جميلة لتبين لنا ما نقوم بفعله. قمنا أيضا باستخدام تابع ()public_path ووضعنا مكونات الصورة داخل ذلك التوقيع، وبعد ذلك قمنا بتكرار نفس الأمر مع كل نوع من الصور مرتبط مع السجل، ثم استخدمنا تابع destroy لحذف السجل من قاعدة البيانات، وقمنا بتنفيذ flash لتابع success ومن ثم قمنا بإعادة التوجيه إلى صفحة index، وهاقد انتهينا. خاتمةلقد تعلمنا في هذه الدروس العديد من الطرق والمفاهيم الجديدة في Laravel، وعلى الرغم من بساطة التطبيق الذي قمنا بعمله إلا أنه سيكون بداية جيدة لاحتراف إدارة الصور في Laravel، وإذا كان لديك أي سؤال أو تعليق، فيسرنا أن نسمعه في التعليقات في الأسفل، وإذا أعجبتك هذه التدوينة، أرجو أن تقوم بمشاركتها مع أصدقاءك. ترجمة -وبتصرّف- للدرس Basic Image Management Part 3 لصاحبه Bill Keck. حقوق الصورة البارزة: Designed by Freepik.