لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 11/28/24 في كل الموقع
-
كيف أرفع ال 5 صفحات هبوط في مستودع قيت هب لأن لي قريب ال 12 ساعة بلا مبالغة اعمل على حل المشاكل التي تواجهني في رفع المشروع3 نقاط
-
تصميم متطلبات الموقع وتسجيل الدخول يتم بناء على المنتج النهائي المراد أن يظهر للاخرين, قبل بناء الموقع يجب تحديد الهدف من الموقع وتحديد الفئة المستخدمة وتحديد المتطلبات وعلي هذه المعطيات يتم بناء الموقع إن كان يتطلب قاعدة بيانات أو تسجيل أو أي متطلبات أخرى فيجب فعلها وإن كان لا يتطلب فلا يجب فعلها, عندما تريد استخدام تكنولوجية أو قاعدة بيانات يجب عليك تعلمها أولا قبل استخدام أي شيء جاهز لكي نتجنب بعض الأخطاء مثل عدم حماية معلومات المستخدمين أو عدم تشفير بياناتهم وغيرها من الأخطاء. تمنياتي لك بالتوفيق.1 نقطة
-
وعليكم السلام ورحمة الله وبركاته, أتمنى تزويد الكود لكي نعمل على المساعدة بشكل أفضل. على ما يبدو أنك تعمل موقع بواجهة أمامية فقط بدون خلفية حيث أن الفرق بين الواجهة الأمامية والخلفية أن الواجهة الأمامية تعطي معلومات ثابتة لا تتغير بتغير المستخدم ولا تحتفظ وتعالج البيانات الاتية من المستخدم حيث أن تعلم اطار عمل للواجهات الأمامية أو الواجهات الخلفية سيسهل العمل لكنه يتطلب وقت لتعلمه سأشرح طريقة يمكنك تطبيقها في مشروعك. يمكنك عمل صفحة ال HTML كالتالي: <form id="form"> <label for="suraOptions">اختر صورة</label> <select id="suraOptions" name="suraName"> <option value="al-fatiha">الفاتحة</option> <option value="al-nas">الناس</option> </select> </form> حيث سيكون جميع الأصوات في مجلد اسمه sounds ويكون صيغة الصوت .mp3 ويكون اسم السورة نفس اسم ال value الذي في الHTML يمكنك عمل دالة لتشغيل الصوت عندما يأخذ اسم السورة كمعامل parameter كالتالي: function playSound (name) { var audio = new Audio("sounds/" + name + ".mp3"); audio.play(); } يمكنك وضع اسم كل سورة داخل option في ال value وعلى أساسه نختار اسم السورة عند الضغط على الزر. function optionName() { // نختار العنصر من خلال ال id const element = document.getElementById("suraOptions"); // ملاحظة لو حصل تغير بالقائمة element.addEventListener("change", function() { // اختيار العنصر const selectedOptionName = element.options[element.selectedIndex]; return selectedOptionName; }); } // تشغيل الصوت حسب الاسم playSound(optionName());1 نقطة
-
بشكل واقعي ما تقوم به ليس الطريقة الصحيحة لتعلم البرمجة، لا يوجد أحد قادر على تعلم جميع لغات البرمجة والتقنيات الخاصة بها، من الممكن تعلم الأساسيات وتنفيذ مشاريع لكن ليس الإحتراف واكتساب خبرة بها تؤهلك للتخصص في مجال معين. للتوضيح بخصوص تلك النقطة، مثلاً مطور الواجهة الخلفية من الطبيعي والصحيح أن يصبح قادر على التنقل بين لغات البرمجة والتقنيات الخاصة بالواجهة الخلفية مثل PHP و GO وC# وغيرهم. وتلك هي طبيعة مهندس البرمجيات وليس مطور فقط، أي شخص لديه دراية وتعمق بالأساسيات تؤهله للتنقل بين لغة وأخرى وإطار وآخر. لكن ليس من المنطقي أن يقوم بذلك في الواجهة الأمامية أيضًا أو في مجال تطوير تطبيقات الهاتف، لا يوجد وقت لذلك، أو حتى القدرة فالتخصصات البرمجية أصبحت معقدة حاليًا. بالتالي عليك تحديد تخصص برمجي والعمل على تعلم المهارات الخاصة به، وستصبح قادر على فعل ذلك بعد دورة علوم الحاسوب. لكن لا تقوم بذلك بناءًا على ما تفضله أنت، بل على حسب المطلوب في سوق العمل الذي ترغب بالعمل به، أي عليك القيام بواجبك وتفقد الوظائف المعروضة والمهارات المطلوبة ومستوى الخبرة وبالأخص مستوى Junior أو Mid-Level (3 سنوات خبرة)، لديك موقعي LinkedIn وIndeed. في البداية تستطيع العمل على مواقع العمل الحر، مثل موقع مستقل وخمسات، وتلك هي الطريقة للحصول على عائد حتى لو بسيط لحين الحصول على وظيفة. لكن عليك أيضًا تفقد تلك المواقع والمهارات المطلوبة عليها فقد تختلف عن سوق العمل لديك، لذا عليك الموازنة والتقرير بناءًا على ظروفك الحالية وما تريده خلال فترة سنة.1 نقطة
-
هل يمكن شرح الخطوات المطلوبه لعمل هذا المشروع نظام أمن المنزل الذكي في دراسة الحالة هذه، سيقوم بتصميم نظام أمان منزلي ذكي باستخدام مبادئ البرمجة الشيئية الموجهة (OOP😞 التغليف والتوريث والتعدد الأشكال. سيتولى النظام إدارة أجهزة الأمان المختلفة وتفاعلاتها مع ضمان خصوصية المستخدم والاعتبارات الأخلاقية في التعامل مع البيانات. سيناريو تتمثل مهمتك في تطوير نظام أمان منزلي ذكي يتضمن أنواعًا مختلفة من أجهزة الأمان، مثل الكاميرات وأجهزة الإنذار وأجهزة استشعار الحركة. يجب أن يتمتع كل جهاز بوظائف فريدة ولكنه يشترك في سمات وسلوكيات مشتركة. 1. التغليف: يجب أن يقوم كل جهاز بتغليف خصائصه (مثل الحالة والموقع والحساسية) وطرقه (مثل التنشيط وإلغاء التنشيط والتنبيه). تأكد من عدم إمكانية الوصول إلى البيانات الحساسة بشكل مباشر من خارج الفصل. 2. الوراثة: قم بإنشاء فئة أساسية من Security Device تتضمن سمات وطرقًا مشتركة. ثم استنتج فئات محددة لكل نوع من الأجهزة (على سبيل المثال، الكاميرا، والإنذار، وجهاز استشعار الحركة) التي ترث من Security Device ولكنها تحتوي أيضًا على خصائص وسلوكيات إضافية. 3. تعدد الأشكال: قم بتنفيذ تعدد الأشكال عن طريق تجاوز الأساليب في الفئات المشتقة. على سبيل المثال، يجب أن تتصرف طريقة التنبيه بشكل مختلف لكل نوع جهاز، • التأكد من أن جميع البيانات التي تم جمعها بواسطة الأجهزة (على سبيل المثال، لقطات الفيديو، وسجلات اكتشاف الحركة) يتم التعامل معها بطريقة أخلاقية، مع مراعاة موافقة المستخدم والخصوصية. • تنفيذ آلية تسمح للمستخدمين بتمكين أو تعطيل ميزات جمع البيانات. البحث تحديد مفهوم التجريد في غرس البرمجة الشيئية،1 نقطة
-
يبدوا أنك تبني مشروع ثابت static ولا تتسعمل لغة برمجة لإنشاء خادم (back end) و لا تستخدم إطار عمل للواجهة الأمامية ويفضل تعلم إطار عمل أفضل . الأفضل لو أرسلت لى عناصر HTML لمساعدتك وإنشاء كود جافا سكريبت بناء على الموقع الخاص بك ولكن سأقوم بإرشادك بالطريقة ويمكنك عمل مثلها . في زر الإستماع يمكنك جعله عنصر a حيث عند الضغط عليه يذهب إلى رابط السورة . ولكن في نهاية هذا الرابط نقوم بوضع معرف السورة أو رقمها وهو ترتيبها في القرآن . هكذا مثلا : <a href="?q=2">إستماع</a> وهنا لاحظ أنني وضعت رقم 2 وهو ترتيب سورة البقرة أى عندما سيتم الذهاب إلى الرابط هذا نستطيع قراءة العنوان و معرفة السورة الحالية التي يريد المستخدم الإستماع لها . والآن في الملف الخاص بالإستماع إلى السورة نضع الكود التالي : const query = new URLSearchParams(window.location.search); const q = urlParams.get('q'); let select_audio = document.getElementById('audio'); select_audio.value = q; let audio = new Audio(q); audio.play(); ولكن يجب الإنتباه إلى العديد من الأشياء . أولا هو أن عنصر ال select القيمة value الخاصة بعناصر ال option يجب أن تكون هي القيمة التي يتم وضعها في العنصر a في زر الإستماع السابق . وأيضا يجب على تلك القيمة أن تحوى إسم الملف الذي تريد تشغيله . فمثلا لو سورة البقرة الملف لديك بإسم "'2.mp3" فيجب أن تكون قيمة ال value في عنصر ال option هي "'2.mp3" والعنوان الذي تذهب إليه يجب أن يكون به : ?q=2.mp3 يمكنك تجربة الكود السابق على الكود الذي لديك إذا وجدت صعوبة في شئ يرجى إرسال ملف HTML فقط للنظر إليه .1 نقطة
-
سأوضح لك بمثال وحاول تطبيقه على مشروعك، لكن للعلم ستوفر على نفسك الكثير لو تعلمت جافاسكريبت فهي اللغة البرمجية الخاصة بالويب وبدونها لن تتمكن من أن تصبح مطور للواجهة الأمامية Front-End حيث ستقوم ببناء مواقع ثابتة بدون أي تفاعل حقيقي. أولاً عند إنشاء كروت السور في صفحة الرئيسية، أضف سمة data-sura-name لكل كرت، واحفظ فيها اسم السورة. <div class="sura-card" data-sura-name="الفاتحة"> <h2>الفاتحة</h2> <button class="listen-button">استماع</button> </div> بعد ذلك علينا معالجة النقر على زر استماع من خلال جافاسكريبت كالتالي: إضافة حدث onclick لزر استماع في كل كرت. عند النقر، نحصل على اسم السورة من سمة data-sura-name للكرت. نستخدم window.location.href لتحويل المستخدم إلى صفحة القرآن مع تمرير اسم السورة كمعامل في عنوان URL. const listenButtons = document.querySelectorAll('.listen-button'); listenButtons.forEach(button => { button.addEventListener('click', () => { const suraName = button.parentElement.getAttribute('data-sura-name'); window.location.href = `quran.html?sura=${suraName}`; }); }); الآن علينا معالجة اسم السورة في صفحة القرآن من خلال القيام بالتالي بجافاسكريبت أيضًا: استخدم URLSearchParams للحصول على اسم السورة من عنوان URL. حدد اسم السورة في عنصر select باستخدام value. ثم نشغل الصوت تلقائيًا باستخدام JavaScript. const urlParams = new URLSearchParams(window.location.search); const suraName = urlParams.get('sura'); const suraSelect = document.getElementById('sura-select'); suraSelect.value = suraName; // شغل الصوت تلقائيًا من خلال إنشاء دالة خاصة بذلك وتمرير اسم السورة إليها) playAudio(suraName); لاحظ getElementById('sura-select') نحصل من خلالها على العنصر select لتغيير قيمة السورة به. لذا عليك تعديل أسماء الكلاسات بما يتناسب مع كود HTML لديك، بالتالي يجب إمتلاك أساسيات جافاسكريبت على الأقل.1 نقطة
-
كل شئ من عندي على الحاسوب عايز بس اوضح ان كل لغة لوحدها يعني css لوحدها وhtml وjava script كمان1 نقطة
-
و عليكم السلام، لا شيء يدعو للخوف، حتى لو كان الكود الخاص بك ليس مثاليًا فمن الجيد نشره هناك للحصول على بعض التقييمات ممن هم أكثر خبرة، هذا يفيدك في تطوير نفسك بشكل أسرع بكثير من الاعتماد على تقييمك الذاتي فقط. حتى تحصل على دعم أكبر من الجيد أن تقوم بترتيب الكود قدر الإمكان و تقوم بإضافة تعليقات توضيحية عند بعض النقاط حتى تساعد من يقرأ الكود الخاص بك. تحياتي.1 نقطة
-
يرجى تغير إسم الملف إلى index.php حتي يتم تشغيل الملف تلقائيا. أو يمكنك الضغط على الملف أو كتابة إسمه في العنوان وسيتم فتح هذا الملف : http://localhost/blog/loc.php1 نقطة
-
1 نقطة
-
ليس مطلوباً منك دراسة جميع الدورات الموجودة بالأكاديمية إطلاقاً حيث أنك كما ذكرت قمت بدراسة العديد من الدورات في مجالات مختلفة ولذلك المشكلة هي عدم وجود هدف معين وتحديد مجال لتعلمه لذلك حاول تحديد هدف واضح والتركيز عليه حيث يساعدك على توجيه جهودك بشكل أفضل. بشكل عملي لحل هذه المشكلة تحتاج لتحديد مجال معين في البرمجة ويمكنك الإطلاع على المقالة التالية للتعرف على المجالات المختلفة ثانياً بعد تحديد المجال الذي تفضله يمكنك الأن معرفة الدورة التي يجب إكمالها ولكن يفضل قبل ذلك دراسة دورة علوم الحاسوب حيث توفر لك الأساسيات المطلوبة لتصبح مطور محترفاً ويفضل الإطلاع على الإجابات التالية1 نقطة
-
فالاول يجب فهم الService Container يمكن أن يكون Service Container معقد بعض الشيء، Service Container في Laravel هو أداة قوية لإدارة التبعية (Dependency Injection) وتحديد مكونات التطبيق. يُعتبر Service Container قلب Laravel حيث يساعد في ربط المكونات المختلفة معًا بشكل مرن وسهل. مفهوم التبعية (Dependency) عندما يعتمد كائن ما على كائن آخر لكي يعمل، يُقال أن لديه "تبعية". على سبيل المثال، لنفترض أن لدينا كائنًا من نوع RegisterController والذي يعتمد على كائن من نوع RegisterService. هنا، RegisterController يعتمد على RegisterService ليعمل بشكل صحيح. Service Container يعمل كصندوق أسود، يتم فيه تسجيل جميع الخدمات التي يحتاجها التطبيق، وعند الحاجة إلى أي خدمة، يتم استدعاؤها من خلال هذا الصندوق بطريقة بسيطة ومنظمة. كيفية استخدام Service Container: 1. تسجيل الخدمات (Binding): يمكن تسجيل الخدمات في Service Container باستخدام طرق مثل bind و singleton. يتم تسجيل أغلب الخدمات في ال Service Provider in register() function داخل ال service provider يمكننا الوصول إلى ال Service Container عن طريق هذه الخاصية $this->app الفرق بين bind و singleton: bind: يتم استخدام bind لتسجيل خدمة يتم إنشاؤها في كل مرة يتم فيها طلبها من الـ Service Container. بمعنى آخر، يتم إنشاء كائن جديد في كل مرة تستدعي فيها الخدمة. singleton: يتم استخدام singleton لتسجيل خدمة يتم إنشاؤها مرة واحدة فقط عند أول طلب، وتُعاد نفس النسخة في كل مرة يتم فيها طلبها بعد ذلك. هذا يضمن أن نفس الكائن يُستخدم في جميع أنحاء التطبيق. 2. استدعاء الخدمات (Resolving): يوجد طريقتين لإستدعاء الخدمات التي تم تسجيلها الاستدعاء التلقائي: لحسن الحظ، العديد من الكلاسات التي سيتم كتابتها عند بناء تطبيق Laravel تستقبل تلقائيًا تبعياتها عبر الـ Container، بما في ذلك: Controllers - Event Listeners - Middleware الاستدعاء اليدوي: يمكنك أيضا استدعاء الخدمات يدويا باستخدام طريقة make من الـ Service Container فوائد استخدام Service Container: إدارة التبعيات بفعالية: يساعد Service Container في إدارة التبعيات بين المكونات المختلفة في التطبيق بطريقة مركزية ومرنة. سهولة الاختبار: من خلال حقن التبعيات، يصبح من السهل اختبار المكونات بشكل منعزل باستخدام أدوات الاختبار (Mocking). تنظيم الكود: يساهم Service Container في تنظيم الكود بشكل أفضل من خلال تجميع التسجيلات في مكان واحد. فلنرجع لفهم الService Provider فهو أساس عملية التحميل في Laravel. فهو المسؤول عن ربط جميع الخدمات الرئيسية في التطبيق، بما في ذلك الخدمات التي يحتاجها التطبيق للعمل بشكل صحيح. تستخدم Service Providers لتهيئة تطبيق Laravel وإعداده. تقريبا كل خدمة في Laravel يتم تهيئتها عبر Service Providers، سواء كانت خدمة داخلية أو خدمة يتم استخدامها من حزم خارجية. كل Service Provider يسجل في الملف config/app.php داخل المصفوفة providers. لإنشاء Service Provider: يمكنك إنشاء Service Provider جديد باستخدام الأمر artisan التالي: php artisan make:provider AdminServiceProvider سينتج عن هذا إنشاء ملف جديد داخل مجلد app/Providers. بعد إنشاء Service Provider، يجب تسجيله داخل الملف config/app.php في المصفوفة providers. لإعداد Service Provider يتضمن كل Service Provider two function: register and boot. register: يتم استخدام هذه function لتسجيل الخدمات في الحاوية (Container). هنا يمكن ربط الكلاسات عن طريق dependency injection كما قمت بشرحه في البوست السابق. boot: يتم استدعاء هذه function بعد تنفيذ كل ال register() function لجميع ال service providers. يمكننا استخدامها لتنفيذ أي إجراءات تتطلب الخدمات المسجلة، مثل تسجيل routes or command. أهمية استخدام boot: في Service Provider يتم استدعاؤها بعد تسجيل جميع الخدمات، مما يعني أنه يصبح لدينا وصولا إلى جميع الخدمات الأخرى التي تم تسجيلها بواسطة داخل ال register function. هذا مفيد بشكل خاص عندما تحتاج إلى تسجيل View Composers أهمية Service Providers: تنظيم الكود: تساهم Service Providers في تنظيم الكود بشكل أفضل من خلال تجميع عمليات التهيئة في مكان واحد. تسهيل الاختبار: باستخدام Service Providers، يمكننا بسهولة إعداد بيئة الاختبار الخاصة بنا عن طريق تسجيل الخدمات والتهيئة اللازمة. مقدمو الخدمات (Service Providers) في Laravel1 نقطة
-
هناك عدة تقنيات يمكن استخدامها لتحقيق التواصل في الوقت الفعلي، ومن أبرزها: WebSocket: يعد بروتوكول WebSocket من أشهر التقنيات المستخدمة لتحقيق التواصل في الوقت الفعلي. يتيح WebSocket إنشاء اتصال ثابت بين الخادم والعميل، مما يسمح بإرسال البيانات في الوقت الفعلي بدون الحاجة إلى تحميل الصفحة مرة أخرى. Server-Sent Events (SSE): تعتمد هذه التقنية على استخدام اتصال طويل الأمد بين الخادم والعميل. يتمكن الخادم من إرسال تحديثات وإشعارات بشكل مستمر إلى العميل دون الحاجة إلى إعادة الاتصال. WebRTC: هو معيار يتيح التواصل المباشر بين المستخدمين بدون الحاجة للخادم كوسيط. يستخدم WebRTC لنقل الصوت والفيديو وتحويل البيانات بشكل فوري بين المستخدمين. تُستخدم تلك التقنيات لإرسال الإشعارات وتحديثات البيانات بشكل فوري إلى المستخدمين دون الحاجة لتحديث الصفحة بأكملها. يمكن استخدام إطار عمل مثل Socket.IO أو Pusher أو Firebase لتسهيل تنفيذ التواصل في الوقت الفعلي في تطبيقات الويب.1 نقطة
-
يوجد طرق مختلفة مثل طلبات متعددة باستخدام Ajax وإتصال مفتوح لجلب التحديثات SSE ومقبس(WebSockets ) بين الخادوم والمتصفح. واالأفضل هو استخدام تقنية تسمى WebSockets لجلب الإشعارات في الوقت الفعلي، وWebSockets هي بروتوكول يسمح للعملاء والخوادم بإجراء اتصالات ثنائية الاتجاه في الوقت الفعلي، مما يعني أن الخادم يمكنه إرسال إشعارات إلى العميل دون الحاجة إلى إعادة تحميل الصفحة. وتوفر WebSockets إمكانية إرسال إشعارات حول الأنشطة الجديدة على الموقع، مثل التعليقات الجديدة أو المنشورات الجديدة، ويمكن للمستخدمين أيضًا استخدام WebSockets للتفاعل مع الموقع في الوقت الفعلي، مثل الدردشة مع المستخدمين الآخرين أو التصويت على المنشورات. وبالطبع بإمكانك استخدام عدّة مكتبات للتعامل مع WebSockets ومن بينها: Ratchet: وهي مكتبة قوية ومتعددة الاستخدامات لإنشاء تطبيقات WebSockets. Ratchet PHP: مكتبة WebSockets تعتمد على Ratchet. Pusher: خدمة خارجية تقدم واجهة برمجة تطبيقات WebSockets. Socket.io: مكتبة WebSockets مفتوحة المصدر تدعم العديد من اللغات ، بما في ذلك PHP. Swoole: إطار عمل PHP مع دعم WebSockets مدمج. بإمكانك أيضًا الإعتماد على مكتبة Pusher ولارافيل وقد تم شرح الأمر بشكل مفصل هنا: أيضًا في لارافيل يوجد نظام إشعارات:1 نقطة
-
اللارافيل تسهل القيام بذلك من خلال امرين: البوابات او الgates : وهي عبارة عن بوابة تعطي المرور للمستخدمين المصرح لهم القيام بالواجبات المعينة. ويتم تعريف البوابات بداخل الدالة boot use App\Models\Post; use App\Models\User; use Illuminate\Support\Facades\Gate; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Gate::define('update-post', function (User $user, Post $post) { return $user->id === $post->user_id; }); } في الكود الموجود بالأعلى يتم إنشاء بوابة تقوم بتحديد عملية تحديث الpost للشخص الذي قام بانشائه فقط وذلك من خلال مقارنة الid الخاص بالمستخدم الحالي مع الid الخاص بالمستخدم الذي قام بإنشاء الpost. <?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Models\Post; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; class PostController extends Controller { /** * Update the given post. * * @param \Illuminate\Http\Request $request * @param \App\Models\Post $post * @return \Illuminate\Http\Response */ public function update(Request $request, Post $post) { if (! Gate::allows('update-post', $post)) {//هنا يتم التأكد باستخدام البوابة update-post من أن المستخدم مصرح له تحديث ال post abort(403);//يتم اجهاض العملية مع الخطأ 403 اي أن المستخدم غير مصرح للقيام بالعملية } // متابعة الكود وتحديث المنشور } } بعد عملية إنشاء الgate يأتي الدور على ربط البوابة مع الcontroller حيث تم وضع شرط لمواصلة تنفيذ التحديث على البوست وهو ان تكون قيمة البوابة قيمة ايجابية اي ان المستخدم مصرح له القيام بالامر. : او السياسات policies من خلال ال php artisan make:policy PostPolicy --model=Post خاصة بالموديل بوست حتكون موجودة في المسار policy الامر ده من خلاله سيتم إنشاء app/Policies بعدها ستقوم بتسجيل السياسة التي قمت بعملها في المسار App\Providers\AuthServiceProvider والتسجيل بمثابة اخبار للارافيل بالسياسات التي ستستخدمها في البرنامج. <?php namespace App\Policies; use App\Models\Post; use App\Models\User; class PostPolicy { /** * Determine if the given post can be updated by the user. * * @param \App\Models\User $user * @param \App\Models\Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; } } في الكود السابق يتم التحقق من أن المستخدم مصرح له أن يقوم بعملية التحديث. وتقدر تستخدم الpolicy بواحدة من طريقتين: اما عن طريق الblade : @can('update', $post) <!-- ...بتقوم بعرض جزئيات من التصميم للمستخدم في حال انه كان يمكنه عمل تحديث للبوست --> @elsecan('create', App\Models\Post::class) <!-- ...بتقوم بعرض جزئيات من التصميم للمستخدم في حال انه كان يمكنه عمل انشاء لبوست جديد--> @endcan @cannot('update', $post) <!-- ...تقوم بعرض جزئيات من التصميم للمستخدم في حال انه كان لا يمكنه عمل تحديث للبوست --> @elsecannot('create', App\Models\Post::class) <!-- ...بتقوم بعرض جزئيات من التصميم للمستخدم في حال انه كان لا يمكنه عمل انشاء لبوست جديد--> @endcannot عن طريق الربط مع الcontroller: <?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { /** * Update the given post. * * @param \Illuminate\Http\Request $request * @param \App\Models\Post $post * @return \Illuminate\Http\Response */ public function update(Request $request, Post $post) { if ($request->user()->cannot('update', $post)) { abort(403); } // Update the post... } }1 نقطة