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

Adnane Kadri

الأعضاء
  • المساهمات

    5256
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    52

كل منشورات العضو Adnane Kadri

  1. يمكنك ايضا الاستعانة بالتابع push لذات الغرض: this.props.history.push("/"); فيكون بعد التأكد من نجاح تسجيل الدخول مثلا كالتالي: .then(response => response.json()) .then(data => { if(data.status == 200){ this.props.history.push("/"); } })
  2. ما المشكلة التي تواجهها تحديدا؟ حاول نشر سؤال في قسم الأسئلة والأجوبة > أسئلة البرمجة وسيحاول المدربون والمشرفون على الأكاديمية مساعدتك.
  3. يوافق هذا الاختصار المرافق لاضافة سطر تعليق في VS code وهو Add line comment. قم بالضغط على ايقونة الاعدادات في الشريط الجانبي واضغط keyboard shortcuts من القائمة التي تظهر، ابحث عن Add line comment، الاختصار الظاهر هو المقصود. وهو في الغالب ctrl + k ctrl + c : قم اولا بتحديد الأسطر المراد تعليقها. ثم قم بالضغط تباعا على CTRL + k و CTRL + c. بالطبع يمكنك تخيصيص هذا الاختصار في VS code ايضا، من ذات القائمة السابقة قم بالضغط على رمز التعديل واضف الاختصار الذي يناسبك.
  4. يمكنك الغاء تفعيل وضع التصحيح debug mode من اعدادات PHP. من ملف الاعداد php.ini قم بتعديل الاسطر المعنية لتصبح كـ: display_startup_errors = Off display_errors = Off html_errors = Off أو قم بذلك عن طريق الاستعانة الوظيفة display_errors: display_errors(false);
  5. أرشح استعمال مكتبة axios فهي الأكثر شيوعا، كما أن تطبيق لارافيل جاهز يأتي معها بشكل عادي. يمكنك البدء في استيراد الوحدة axios واستعمالها بشكل مباشر: ملف app.js مثلا: import axios from 'axios' axios.get('path/to/target') .then(response => console.log(response)) .catch(error => console.log(error)) تأكدي بالطبع من تحزيم الملف عن طريق npm i و npm run dev.
  6. يوجد العديد من مكتبات الجافاسكربت التي تتولى مثل هاته العمليات، تسمى مكتبات عميل HTTP منها: مكتبة Axios-http مكتبة Node-fetch مكتبة Got مكتبة Needle يوجد حتى واجهة التطبيقات البرمجية المدمجة في جافاسكربت، واجهة fetch يمكن ايضا التعامل مع Ajax عن طريق الواجهة التي توفرها مكتبة jQuery
  7. وضع اكواد ذات مهام مختلفة ضمن نفس المجال شيء غير مقترح ابدا، حاول كشيء من التنظيم فقط فصل كل هاته المكونات واجعلها في ملف أو وظيفة منفصلة وهذا من اوجه تطبيق مبدأ يسمى بمبدأ فصل المهام Seperating of concerns. حاول ايضا الحفاظ على احتواء كل منها على مهمة واحدة يمكن التعبير عنها، وذلك كتطبيق لمبدأ المسؤولية الواحدة Single responsibility principle. أيضا لتلافي مشكلة التكرار حاول استخلاص المتشابه بينها واجعل المختلف متغيرا variables، الآن سيمكن تنظيم هاته العملية عن طريق دالة تقوم بأخذ المختلف وتستقبله كمعاملات ثم تحقنه تباعا في اماكن الاختلاف. ما تقوم به غير واضح جيدا، ولكن عموما، أظن انك تأخذ قيم قديمة ثم تعاود ادراجها بقواعد البيانات كطريقة لنسخ البيانات وانشاء صف جديد انطلاقا من آخر موجود بالفعل. حاول وصف دالة تستوفي نفس الشروط السابقة.
  8. مشكلتك تفتقر لتفاصيل أكثر، كيف تقوم بعرض هاته الصلاحيات مثلا؟ هل تقوم بالاستعلام عنها من قواعد البيانات؟ ان كان نعم، يفترض ان يكون هنالك علاقة ما بين المستخدم كنموذج بيانات والصلاحية كنموذج بيانات آخر. (عمود أجنبي foreign key يميز المستخدم في جدول الصلاحيات مثلا)، بعد هذا سيتحكم في طريقة عرض الصلاحية امتلاك المستخدم لصلاحية بنفس الاسم ونفس المعرف الخاص بالمستخدم في جدول الصلاحيات. نفس الشيء بالنسبة للمشكلة الثانية، يرجى ارفاق الشيفرة التي تظن انها مسؤولة عن المشكلة.
  9. يمكنك تطبيق هاته المقاربة عن طريق: انشاء جدول يعبر عن انموذج بيانات الدور Role وليكن باسم roles، يمتلك الخاصية permissions، فيكون مشابها لـ: const Role = new mongoose.Schema({ role: { type: String, default: "user", unique: true }, permissions: { type: [String] } }) طبعا سيحتاج انموذج بيانات المستخدم هو الآخر تمثيلا للدور كأحد خصائصه او اعمدته فيكون انموذج بيانات المستخدم User كـ: const User = new mongoose.Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true }, role: { type: String, default: 'user' }, الآن لن نحتاج الا انشاء الادوار اللازمة وارفاقها بالأذونات المناسبة. وأخيرا، سنحتاج التحقق من امتلاك المستخدم [لدور معين] ثم [لصلاحية معينة] قبل القيام بالأكشن المعنية عن طريق استعلامات Mongo العادية أو ايا كان ما تستخدميه في قواعد البيانات. ولما لا، تنظيم العملية أكثر عن طريق جعلها كطبقة وسيطة Middleware.
  10. أظنك ستحتاج بشكل أو بآخر استعمال واحدة من مكتبات Faker لتزييف بيانات تتعلق بالمنتجات التي تحاول انشاءها واستغلالها في تخيل أو تصور الشكل النهائي للموقع. تتوفر مكتبة fakerjs كواحدة منها. فيما يلي رابط المكتبة على الغيت هب. طريقة الاستعمال سهلة، ستحتاج تثبيت المكتبة عن طريق مدير الحزم npm أول الامر: npm install --save-dev @faker-js/faker ثم استيراد وحدة faker واستعمال توابعها لتزييف البيانات: import { faker } from '@faker-js/faker'; const dummyData = { userId: faker.datatype.uuid(), username: faker.internet.userName(), email: faker.internet.email(), avatar: faker.image.avatar(), password: faker.internet.password(), birthdate: faker.date.birthdate(), registeredAt: faker.date.past(), }; console.log(dummyData) سيمكنك استعمال هاته البيانات في تصيير المكونات واستعمالها كبيانات اختبارية.
  11. تأكد من ان الحساب الذي تستعمله في الدفع يمتلك مبلغا كافيا لاكمال عملية الدفع، ان كان البنك الخاص بك يشترط مصادقة باستعمال كود CVV (card verification value) لاكمال عملية الدفع فيحتمل ان تواجه مشكلة مشابهة، (هو الكود المكون من ثلاث ارقام الموجود خلف البطاقة). لأن AWS لا تدعمه، وتنصح بمراسلة الدعم الخاص بالبنك للتنازل عن هاته المصادقة. (على الأقل للتحويل الحالي). راسل خدمة عملاء AWS، واعرف اكثر عن المشكلة. حاول ايضا البحث عن مشاكل عملاء مشابهة عن طريق استعمال نص رسالة الخطأ: there was a problem with your payment information aws
  12. مرحبا محمد، يمكنك الاطلاع على هاته المقالة كدليل شامل لتعلم البرمجة: تصفح أيضا تفاصيل مختلف الدورات التي يتم عرضها: دورة تطوير المنتجات دورة علوم الحاسوب دورة تطوير واجهات المستخدم دورة تطوير التطبيقات باستخدام لغة Python دورة تطوير التطبيقات باستخدام لغة جافاسكربت دورة تطوير التطبيقات باستخدام لغة PHP دورة تطوير التطبيقات باستخدام لغة Ruby
  13. فكرتك غير واضحة. هل يمكنك التوضيح مع ارفاق الشيفرات بشكل مكتوبة او قابل للمعاينة؟
  14. ان كنت تستخدم هيروكو كخادم للتخزين فستواجه مشكلة لأن خوادم هيروكو توصف على أنها سريعة الزوال، ربما لن تواجه مشكلة في حالة استخدمت المسار العام لها. قد تكون مشكلتك مشابهة لـهاته:
  15. لا يبدوا من التفاصيل التقنية الموصوفة أن فشل الارسال راجع الى حظر عنوان IP فالأرجح هو أن المشكلة تتعلق بصندوق بريد المستلم the recipient mailbox. الحظ: تأكد أيضا من عنوان النطاق الخاص بك غير مستهلك expired وابحث عن دلالة كود الخطأ الذي يظهر ضمن التقرير: Socket error code 10061 جرب ايضا الاستفسار عن المشكلة في منتديات Microsoft او راسل الدعم بالمشكلة.
  16. ما هو نظام ادارة قواعد البيانات التي تستعملها؟ الأمر عادي، ويماثل اي طريقة أخرى لحذف وتحديث سجل من قواعد البيانات. فهو عموما سيتبع المنطق التالي: انشاء ملف عرض يصف الهيكلة المطلوبة، ويحتوي نموذجين كل منهما يوجه الى مسارين A و B. يمثل المساران A و B نقطتي وصول تشيران الى تابعي متحكم خاص بالمنشور وليكن delete و update. عند استهداف التابع الاول يتم تنفيذ شيفرة الحذف الخاصة بالمنشور. وعند استهداف التابع الثاني يتم تنفيذ شيفرة التحديث الخاصة بالمنشور. الآن لن تحتاج الا حماية هاذين المسارين وليكن عن طريق الطبقات الوسيطة Middlewares. اين ستحتاج التحقق من هوية المرسل للطلب ومن صلاحياته. بالطبع فإن هذا هو المنطق العام للعملية. لن تحتاج الا نمذجتها عن طريق الشيفرة الخاصة بك، وذلك يختلف بحسب اطار عمل الواجهة الامامية او محرك القالب المستعمل، نظام قاعدة البيانات وما الى ذلك.
  17. هل يمكنك الاشارة الى اطار العمل او اللغة التي تستعملها؟ ربما تبحث عن أحد مكتبات faker. مثل fakerphp في PHP أو fakerjs في جافاسكربت أو Faker في بايثون. وموجودة حتى في Perl و Ruby. على اختلاف هاته اللغات، كل هاته المكتبات توفر تابعا email يهتم بتوليد عناوين بريد الكتروني مزيفة او اختبارية. يمكنك بذرها الى قواعد البيانات واستعمالها لذات الغرض. قد تحتاج ايضا خادم SMTP اختباري من مثل Mailtrap، لاستقبال هاته الرسائل.
  18. أظن أن هاته التوابع تم التخلي عنها في نسخ متأخرة من PHPunit (اذكر انها كانت موجودة في النسخة الخامسة من لارافيل). فقد تم فصل عملية اختبار الواجهة الامامية أو اتمتة المتصفح عن الـ core الخاص بـ PHPunit فهي الآن تركز على: اختبارات HTTP اختبارات قواعد البيانات اختبارات Console بجانب تزييف الاحداث لغرض الاختبار او ما يسمى Mocking أما في يخص أتمتة المتصفح فيتوفر الآن Laravel dusk كحزمة خارجية والذي يتكامل بشكل جميل مع قوقل كروم. هو يوفر تقريبا نفس التوابع والادوات التي كانت متوفرة سابقا. اعرف أكثر عن اختبارات المتصفح (Laravel Dusk) في Laravel
  19. يمكنك استخدام ذات التابع السابق لعمل ذات الشيء. $targetID = 'YOUR_ID'; $this->assertDatabaseMissing('courses' ,['id' => $targetID]); ليست العملية معقدة كثيرا، نظم ذلك فقط. دورة الحياة داخل تابع الاختبار تكون دائما بشكل او بآخر كـ: مرحلة لتحضير البيانات مرحلة للقيام بأكشن والخروج بنتيجة مرحلة للقيام بالتوكيدات على اشياء او سلوكات معينة
  20. كتطبيق عملي للوصف السابق يمكنك القيام بالتالي: عند تقديم طلب من طرف الراكب او العميل يتم االتالي. <?php ... class RideController extends controller { /** * حجز رحلة * * @return void */ public function book(){ // انشاء رحلة جديدة وسائق معين $ride = Ride::create([ 'user_id' => auth()->id() , 'driver_id' => 'RANDOM_DRIVER_ID']); // انشاءرحلة مجدولة ScheduledRide::create([ 'ride_id' => $ride->id ]); // تنبيه السائق عن رحلة جديدة event(new NotifyDriverByRideEvent($scheduledRides->ride)); } } لاحظ وجود انموذج بيانات Ride يعبر عن الرحلة التي قام المستخدم بحجزها. في ذات الوقت تم انشاء رحلة مجدولة تعبر عن مهمة جدولة الرحلة. ويتم تمثيل ذلك بانموذج ببيانات آخر هو ScheduledRide سنحتاج الآن جعل هاته الرحلات المجدولة مهام يتم تحميلها بشكل ديناميكي من طرف المجدول. ليمكن التحقق مثلا من ما ان كانت الرحلة قبلت من السائق خلال الخمس دقائق الماضية او هي معلقة. بملف app/Console/Kernel.php سنحتاج عرض كامل الرحلات المعلقة او المجدولة والتحقق مثلا من ما ان قام السائق بقبول الرحلة أو لا: /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { /* جلب كاملة الرحلات المجدولة */ $scheduledRides = ScheduledRide::all(); // المرور على كامل الرحلات المجدولة foreach ($scheduledRides as $scheduledRide) { $schedule->call(function() use($scheduledRide) { // التحقق من ما ان قبلت الرحلة من طرف السائق if($scheduledRide->ride->is_approved_by_driver){ // ان كانت الرحلة قد قبلت لن نحتاج ان تكون الرحلة مجدولة او معلقة فهي تامة $scheduledRide->delete(); }else{ // اما في غير ذلك // سنعدل الرحلة التي تمثل الرحلة المجدولة هاته ونسندها لسائق جديد $scheduledRide->ride->update(['driver_id' => 'NEW_DRIVER_ID']); // وبالطبع ننبه السائق الجديد ايضا event(new NotifyDriverByRideEvent($scheduledRide->ride)); // .. ولما لا اخبار السائق السابق بان الرحلة قد فاتته // او استعمال ذلك في حساب معدل ادائه في التطبيق } })->everyTenMinutes(); // ضع اي خيار تواتر يوافق حاجتك او حاجة العملاء } } طبعا الفكرة تحتاج تنظيما وتنظيفا اكثر، ولكن ستتجه بشكل او بآخر نحو ذات المفاهيم.
  21. ما هي حالة الاستخدام التي تحاول اختبارها تحديدا؟ ما تحاول القيام به غير واضح اساسا.
  22. هل قمت بكتابة اي شيفرات او بانشاء اي مهام يمكن توجيهها للطريقة الموصوفة؟
  23. لا، لا يقبل التابع assertDatabaseMissing ولا التابع assertDatabaseHas مصفوفة متعددة الابعاد Multi-dimensional، يجب تمرير مصفوفة ثنائية البعد بالخصائص والقيم المراد استبعادها او البحث عنها فقط.
  24. أظن أن معرفة بسيطة بجزئيتي جدولة المهام وطوابير الانتظار في لارافيل سيكون كافيا لتصور شيفرة كاملة عن العملية الموضحة اعلاه.
  25. ما تحاول القيام به هنا غير واضح جيدا. اذ يفترض من تابع الاختبار ان يعبر عن حالة استخدام واضحة وجلية. فلا نقول: public function testUserProduct() بل نقول: public function test_user_can_create_a_product() أو: public function test_user_can_archive_a_product() أو ما الى ذلك (بالطبع لا اقصد طريقة الكتابة). بالنسبة لحالة الاختبار الأولى فأنت تحاول التأكد ان قاعدة البيانات لا تمتلك اي سجل في جدول supervisors يمتلك قيمة فارغة في عمود sup_id. لا مشكلة بذلك. أما بالنسبة لحالة الاستخدام الثانية، فأنت تقوم بتحديد كورس معين ثم تقوم بالتأكد من ان الكورس غير موجود .. فالعملية هنا غير منطقية أساسا، أظنك تحتاج اعادة صياغة حالة الاختبار. بما أنك تقوم باختبار قواعد البيانات، فيفضل استعمال اتصال قاعدة بيانات in-memory مثل اتصال sqlite وذلك عن طريق الغاء تعليق الاسطر التالية في ملف phpunit.xml: <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/>
×
×
  • أضف...