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

Adnane Kadri

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

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

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

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

    51

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

  1. أرشح استعمال مكتبة 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.
  2. يوجد العديد من مكتبات الجافاسكربت التي تتولى مثل هاته العمليات، تسمى مكتبات عميل HTTP منها: مكتبة Axios-http مكتبة Node-fetch مكتبة Got مكتبة Needle يوجد حتى واجهة التطبيقات البرمجية المدمجة في جافاسكربت، واجهة fetch يمكن ايضا التعامل مع Ajax عن طريق الواجهة التي توفرها مكتبة jQuery
  3. وضع اكواد ذات مهام مختلفة ضمن نفس المجال شيء غير مقترح ابدا، حاول كشيء من التنظيم فقط فصل كل هاته المكونات واجعلها في ملف أو وظيفة منفصلة وهذا من اوجه تطبيق مبدأ يسمى بمبدأ فصل المهام Seperating of concerns. حاول ايضا الحفاظ على احتواء كل منها على مهمة واحدة يمكن التعبير عنها، وذلك كتطبيق لمبدأ المسؤولية الواحدة Single responsibility principle. أيضا لتلافي مشكلة التكرار حاول استخلاص المتشابه بينها واجعل المختلف متغيرا variables، الآن سيمكن تنظيم هاته العملية عن طريق دالة تقوم بأخذ المختلف وتستقبله كمعاملات ثم تحقنه تباعا في اماكن الاختلاف. ما تقوم به غير واضح جيدا، ولكن عموما، أظن انك تأخذ قيم قديمة ثم تعاود ادراجها بقواعد البيانات كطريقة لنسخ البيانات وانشاء صف جديد انطلاقا من آخر موجود بالفعل. حاول وصف دالة تستوفي نفس الشروط السابقة.
  4. مشكلتك تفتقر لتفاصيل أكثر، كيف تقوم بعرض هاته الصلاحيات مثلا؟ هل تقوم بالاستعلام عنها من قواعد البيانات؟ ان كان نعم، يفترض ان يكون هنالك علاقة ما بين المستخدم كنموذج بيانات والصلاحية كنموذج بيانات آخر. (عمود أجنبي foreign key يميز المستخدم في جدول الصلاحيات مثلا)، بعد هذا سيتحكم في طريقة عرض الصلاحية امتلاك المستخدم لصلاحية بنفس الاسم ونفس المعرف الخاص بالمستخدم في جدول الصلاحيات. نفس الشيء بالنسبة للمشكلة الثانية، يرجى ارفاق الشيفرة التي تظن انها مسؤولة عن المشكلة.
  5. يمكنك تطبيق هاته المقاربة عن طريق: انشاء جدول يعبر عن انموذج بيانات الدور 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.
  6. أظنك ستحتاج بشكل أو بآخر استعمال واحدة من مكتبات 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) سيمكنك استعمال هاته البيانات في تصيير المكونات واستعمالها كبيانات اختبارية.
  7. تأكد من ان الحساب الذي تستعمله في الدفع يمتلك مبلغا كافيا لاكمال عملية الدفع، ان كان البنك الخاص بك يشترط مصادقة باستعمال كود CVV (card verification value) لاكمال عملية الدفع فيحتمل ان تواجه مشكلة مشابهة، (هو الكود المكون من ثلاث ارقام الموجود خلف البطاقة). لأن AWS لا تدعمه، وتنصح بمراسلة الدعم الخاص بالبنك للتنازل عن هاته المصادقة. (على الأقل للتحويل الحالي). راسل خدمة عملاء AWS، واعرف اكثر عن المشكلة. حاول ايضا البحث عن مشاكل عملاء مشابهة عن طريق استعمال نص رسالة الخطأ: there was a problem with your payment information aws
  8. مرحبا محمد، يمكنك الاطلاع على هاته المقالة كدليل شامل لتعلم البرمجة: تصفح أيضا تفاصيل مختلف الدورات التي يتم عرضها: دورة تطوير المنتجات دورة علوم الحاسوب دورة تطوير واجهات المستخدم دورة تطوير التطبيقات باستخدام لغة Python دورة تطوير التطبيقات باستخدام لغة جافاسكربت دورة تطوير التطبيقات باستخدام لغة PHP دورة تطوير التطبيقات باستخدام لغة Ruby
  9. فكرتك غير واضحة. هل يمكنك التوضيح مع ارفاق الشيفرات بشكل مكتوبة او قابل للمعاينة؟
  10. ان كنت تستخدم هيروكو كخادم للتخزين فستواجه مشكلة لأن خوادم هيروكو توصف على أنها سريعة الزوال، ربما لن تواجه مشكلة في حالة استخدمت المسار العام لها. قد تكون مشكلتك مشابهة لـهاته:
  11. لا يبدوا من التفاصيل التقنية الموصوفة أن فشل الارسال راجع الى حظر عنوان IP فالأرجح هو أن المشكلة تتعلق بصندوق بريد المستلم the recipient mailbox. الحظ: تأكد أيضا من عنوان النطاق الخاص بك غير مستهلك expired وابحث عن دلالة كود الخطأ الذي يظهر ضمن التقرير: Socket error code 10061 جرب ايضا الاستفسار عن المشكلة في منتديات Microsoft او راسل الدعم بالمشكلة.
  12. ما هو نظام ادارة قواعد البيانات التي تستعملها؟ الأمر عادي، ويماثل اي طريقة أخرى لحذف وتحديث سجل من قواعد البيانات. فهو عموما سيتبع المنطق التالي: انشاء ملف عرض يصف الهيكلة المطلوبة، ويحتوي نموذجين كل منهما يوجه الى مسارين A و B. يمثل المساران A و B نقطتي وصول تشيران الى تابعي متحكم خاص بالمنشور وليكن delete و update. عند استهداف التابع الاول يتم تنفيذ شيفرة الحذف الخاصة بالمنشور. وعند استهداف التابع الثاني يتم تنفيذ شيفرة التحديث الخاصة بالمنشور. الآن لن تحتاج الا حماية هاذين المسارين وليكن عن طريق الطبقات الوسيطة Middlewares. اين ستحتاج التحقق من هوية المرسل للطلب ومن صلاحياته. بالطبع فإن هذا هو المنطق العام للعملية. لن تحتاج الا نمذجتها عن طريق الشيفرة الخاصة بك، وذلك يختلف بحسب اطار عمل الواجهة الامامية او محرك القالب المستعمل، نظام قاعدة البيانات وما الى ذلك.
  13. هل يمكنك الاشارة الى اطار العمل او اللغة التي تستعملها؟ ربما تبحث عن أحد مكتبات faker. مثل fakerphp في PHP أو fakerjs في جافاسكربت أو Faker في بايثون. وموجودة حتى في Perl و Ruby. على اختلاف هاته اللغات، كل هاته المكتبات توفر تابعا email يهتم بتوليد عناوين بريد الكتروني مزيفة او اختبارية. يمكنك بذرها الى قواعد البيانات واستعمالها لذات الغرض. قد تحتاج ايضا خادم SMTP اختباري من مثل Mailtrap، لاستقبال هاته الرسائل.
  14. أظن أن هاته التوابع تم التخلي عنها في نسخ متأخرة من PHPunit (اذكر انها كانت موجودة في النسخة الخامسة من لارافيل). فقد تم فصل عملية اختبار الواجهة الامامية أو اتمتة المتصفح عن الـ core الخاص بـ PHPunit فهي الآن تركز على: اختبارات HTTP اختبارات قواعد البيانات اختبارات Console بجانب تزييف الاحداث لغرض الاختبار او ما يسمى Mocking أما في يخص أتمتة المتصفح فيتوفر الآن Laravel dusk كحزمة خارجية والذي يتكامل بشكل جميل مع قوقل كروم. هو يوفر تقريبا نفس التوابع والادوات التي كانت متوفرة سابقا. اعرف أكثر عن اختبارات المتصفح (Laravel Dusk) في Laravel
  15. يمكنك استخدام ذات التابع السابق لعمل ذات الشيء. $targetID = 'YOUR_ID'; $this->assertDatabaseMissing('courses' ,['id' => $targetID]); ليست العملية معقدة كثيرا، نظم ذلك فقط. دورة الحياة داخل تابع الاختبار تكون دائما بشكل او بآخر كـ: مرحلة لتحضير البيانات مرحلة للقيام بأكشن والخروج بنتيجة مرحلة للقيام بالتوكيدات على اشياء او سلوكات معينة
  16. كتطبيق عملي للوصف السابق يمكنك القيام بالتالي: عند تقديم طلب من طرف الراكب او العميل يتم االتالي. <?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(); // ضع اي خيار تواتر يوافق حاجتك او حاجة العملاء } } طبعا الفكرة تحتاج تنظيما وتنظيفا اكثر، ولكن ستتجه بشكل او بآخر نحو ذات المفاهيم.
  17. ما هي حالة الاستخدام التي تحاول اختبارها تحديدا؟ ما تحاول القيام به غير واضح اساسا.
  18. هل قمت بكتابة اي شيفرات او بانشاء اي مهام يمكن توجيهها للطريقة الموصوفة؟
  19. لا، لا يقبل التابع assertDatabaseMissing ولا التابع assertDatabaseHas مصفوفة متعددة الابعاد Multi-dimensional، يجب تمرير مصفوفة ثنائية البعد بالخصائص والقيم المراد استبعادها او البحث عنها فقط.
  20. أظن أن معرفة بسيطة بجزئيتي جدولة المهام وطوابير الانتظار في لارافيل سيكون كافيا لتصور شيفرة كاملة عن العملية الموضحة اعلاه.
  21. ما تحاول القيام به هنا غير واضح جيدا. اذ يفترض من تابع الاختبار ان يعبر عن حالة استخدام واضحة وجلية. فلا نقول: 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:"/>
  22. جرب تحديد عنصر الفيديو المستهدف ثم قم بايقافه عن طريق الاستعانة بالوظيفة pause: let targetVideo = document.querySelector('#myVideo') targetVideo.pause() قد تحتاج ايضا اعادة عداد الوقت الى الصفر: targetVideo.currentTime = 0 العنصر <video>
  23. يمكنك معاملة هاته الدالة كميزة. واختبارها كحالة استخدام عن طريق اختبارات الميزة في لارافيل. لنقل ان الدالة الخاصة بك يتم الاشارة اليها عن طريق المسار: Route::get('/example/{byear}' , [MyController::class ,'countAge']) ستحتاج اول الأمر انشاء حالة اختبار Test case عن طريق تنفيذ: php artisan make:test CountAgeTest ستلاحظ انشاء ملف جديد بداخل مجلد tests/Feature الخاص بتطبيق لديك. محتوى الملف سيكون مشابها لـ: <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** * A basic test example. * * @return void */ public function test_basic_test() { $this->assertTrue(true); } } في العادة يعبر الصنف CountAgeTest عن مجموع حالات الاستخدام التي تندرج تحت هذا الهدف وهو حساب العمر. فعلى سبيل المثال يتفرع عن هذا الهدف: حالة ان يتم تقديم سنة اكبر من الحالية (2040 مثلا)، كيف نتوقع ان يتم التعامل معها؟ حالة ان يتم تقديم عدد سالب. حالة ان يتم تقديم سلسلة نصية بدل عدد. حالة ان يتم تقديم عدد عشري عوض عدد صحيح موجب. كل هاته الحالات تسمى حالات استخدام تتبع عن الهدف الأساسي الذي هو حساب العمر. (قد يمثل Task او Goal في مخططات حالات الاستخدام ان كنت معتادا على العمل في فرق). فأنت سنحتاج نمذجة هاته الحالات ومن بينها الحالة التي وصفتها. لنأخذ الخاصة بك كمثال: في لارافيل يتم وصف حالات الاختبار كتوابع تبدأ اما ب test : <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** * */ public function test_if_age_can_be_counted() { // } } او مميزة بتعليق @test ويسمى annotation: <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** @test*/ public function age_can_be_counted() { // } } بنية حالة الاختبار تتبع غالبا نمطا مشابها: /** @test*/ public function age_can_be_counted() { # 1 - تحضير البيانات # 2 - القيام بال action والخروج بنتيجة # 3 - استعمال التوكيدات assertions للتأكد من حصول شيء معين } مثال: /** @test*/ public function age_can_be_counted() { # 1 - تحضير البيانات $exampleByear = 1960; $ageNow = 62; # 2 - القيام بال action والخروج بنتيجة $response = $this->get('/example/'.$exampleByear); # 3 - استعمال التوكيدات assertions للتأكد من حصول شيء معين $response->assertStatus(200); // التأكد من ان كود حالة الطلب يعبر عن طلب ناجح $this->assertEquals( $response->getContent(), $ageNow ) } لاحظ استعمال التوكيد assertStatus و assertEquals وهما تابعان يوفرهما لارافيل ضمن سلسلة من التوابع يمكن الاستفادة منها لاختبار نتائج مختلفة. أخيرا، لن تحتاج الا طباعة الأمر: php artisan test أو: vendor/bin/phpunit أو: phpunit لتشغيل الاختبارات، خرج الأمر هو ما سيعبر عن اما نجاح او فشل حالة الاختبار. مقدمة إلى التعامل مع الاختبارات في Laravel
  24. يمكنك الاستعانة بمفهوم جدولة المهام Task scheduling و طوابير الانتظار Queue لتنفيذ او جدولة مهمة اسناد الراكب الى السائق المستهدف والتحقق من قبول ذلك. فيكون منطق العملية مشابها لـ: عند تقديم طلب من طرف الراكب او العميل يتم اضافة مهمة اسناد الراكب للسائق الى طابور انتظار يتم مباشرة التحقق من تنفيذ او قبول المهمة عن طريق ارفاق ما يسمى بخيار تواتر frequency option للمهمة المجدولة، اذ يتم التحقق من ما ان تمت المهمة المقصودة كل مدة n من الزمن. في حالة عدم قبول اسناد المهمة خلال المدة n يتم اعادة الاسناد الى سائق آخر وهكذا. بالطبع فإن هذا هو المنطق العام للعملية. يمكنك التوسع في الفكرة أكثر. جدولة المهام (Task scheduling) في Laravel
  25. للاستفادة قصوى من محتوى كل درس يفضل التطبيق العملي مع ما يقوم به المدرب خلال هذا الدرس. وهذا حتى بالنسبة للمسارات النظرية من مثل مسارات الأساسيات، على أنه سيتم فيما بعد مماررسة كل هاته الأساسيات في المسارات التطبيقية اللاحقة أين سيكون من الواجب عليك الممارسة العملية سواء للاستفادة من محتوى الدورة او كشرط لاجتياز الامتحان والتحصل على الشهادة فيما بعد.
×
×
  • أضف...