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

لوحة المتصدرين

  1. Yahia Nasrallah

    Yahia Nasrallah

    الأعضاء


    • نقاط

      3

    • المساهمات

      66


  2. Abdulhamid Hamsho2

    Abdulhamid Hamsho2

    الأعضاء


    • نقاط

      3

    • المساهمات

      862


  3. Wael Aljamal

    Wael Aljamal

    الأعضاء


    • نقاط

      3

    • المساهمات

      6975


  4. Yomna Raouf

    Yomna Raouf

    الأعضاء


    • نقاط

      2

    • المساهمات

      2193


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 01/01/21 في كل الموقع

  1. مرحباً @عبد الواحد الحدادي بالحقيقة ليس هناك ضرورة لإنشاء كل هذه الأمور دوماً مع بعضها , من الممكن إنشاء ال model لوحده أو migration لوحدها أو مع بعضهم وهكذا , فيمكنك مثلاً : php artisan make:model NewModel -m فهذه التعليمة ستنشأ model و migration فقط . وبالطبع يمكنك استخدام غيرها من التعليمات حسب حاجتك , فهذه الحروف mcr تستخدم مع بعضها أو كل واحدة على حدى ,وبالنسبة لما قلته : فهو صحيح تماماً , بالمناسبة ال CRUD تشمل ال store وهي اختصار ل Create, Read, Update , Delete تحياتي .
    2 نقاط
  2. مرحباً عبد الواحد، لارافيل هو أحد أطر العمل المبنية على لغة php و هي عبارة عن MVC Framework أي أنها تعتمد على معمارية MVC تُعتبر هذه الأخيرة نمط تصميم في مجال البرمجيات ككل فهو ليس خاص بلغة برمجة مُعينة او إطار عمل مُحدد، و هو إختصار ل Model, View, Controller و يُستخدم لفصل الإهتمامات و هدف مُحدد، Model هو النموذج الذي يتعامل مع قاعدة البيانات و في لارافيل تجد أن كل نموذج يتعامل مع جدول مُحدد و يُعتبر الواجهة البرمجية لهذا الجدول و عندما نريد ربط الجداول مع بعض لتكوين علاقات فإننا نستخدم هذا النموذج view: هو عبارة عن الواجهة او صفحة العرض التى يتعامل معاها المستخدم فى التطبيق مثل القوائم و حقول البحث و السليدات وغيرها controller : هو الوسيط بين view و model فهو يعالج العمليات المنطقية والطلبات القادمة (requests) وكذلك التعامل مع البيانات القادمة من قواعد البيانات لاخراجها على view فى صورة ملائمة فهو يتحكم و يربط بين العرض و النموذج فتلاحظ أن هذا النمط سهل علينا العملية و فصل الإهتمامات و نظم العملية أكثر، في لارافيل هذا النمط موجود و تم تسخيره لك لتستعمله فأنت لست مُجبر لتعلم ما الذي يجري خلف الكواليس و كيف تم تطبيق النمط لكن إن كنت مُهتم بذلك فيُمكنك مستقبلا البحث و التعمق أكثر حول تطبيق أنماط التصميم أو بناء إطار عمل بسيط على MVC بخصوص الMigration فهي بكل بساطة ملفات تُساعدنا على بناء و التعديل على جداول قاعدة البيانات و الأعمدة المُكونة لهذه الجداول قد يبدو الأمر مُعقّدا بعض الشيء، لكنه في الحقيقة بسيط، وبمُجرد أن تفهم الآلية ستُلاحظ أنه مفيد جدا يُمكنك الإطلاع على هذا المقال لمعلومات أكثر: بالتوفيق.
    1 نقطة
  3. مرحبا محمد، يمكننا فهم الشكل العالم لشجرة النجوم بتقسيمه لـ 3 أجزاء. الجزء الأول على اليسار : يمثل عدد الفراغات قبل النجوم. الجزء الثاني الأوسط : يمثل رسم النجوم و عددهم حسب رقم السطر الذي نحن فيه. الجزء الثالث الأيمن: مسؤول عن رسم سطر جديد (نهاية السطر) شرح البرنامج: #include <iostream> using namespace std; // إجرائية رسم النجوم void pattern(int n) { int i, k, flag = 1; // سنقوم بالاعتماد على حلقة واحدة ستعبر عن عدد الأسطر و الأعمدة // عدد المحارف المطلوبة للرسم إن كانت فراغات أو نجوم for (i = 1, k = 0; i <= 2 * n - 1; i++) { // الحالة الأولى على اليسار // نحن في موقع بعيد عن الشجرة ويجب رسم فراغ if (i < n - k) cout << " "; // الحالة الثانية في الوسط علينا هنا رسم نجمة // الشجرة متناوبة في مكان النجوم لذلك استعملنا متغير بولياني else { // ستتناوب قيمة العلم في كل مرة ندخل إلى هذا الجزء من الشيفرة البرمجية if (flag) cout << "*"; else cout << " "; flag = 1 - flag; } // الحالة الثالثة // نحن خارج الشجرةننهي السطر الحالي و نبدأ سطر جديد if (i == n + k) { k++; cout << endl; // N الشرط التالي يحدد نهاية الرسم في حال وصولنا للسطر رقم // 2 * n- 1 والعمود الأخير فيه أي الخلية صاحبة الرقم if (i == 2 * n - 1) break; // في حال كنا لم نصل للسطر الأخير فنكون في بداية سطر جديد ونعيد تهيأة المتغيرات i = 0; flag = 1; // لنرسم نجمة في بداية الشجرة للسطر الجديد } } } // تنفيذ البرنامج int main() { int n = 6; // استدعاء الإجرائية الخاصة بالرسم pattern(n); return 0; } بالتوفيق
    1 نقطة
  4. أهلاً بك عبدالواحد, يوجد في Laravel شيء يسمى Eloquent ،وهو مخطط ارتباط كائني يجعل التعامل مع قاعدة البيانات الخاصة بك ممتعًا وسهلاً. وعند استخدام Eloquent ،يحتوي كل جدول في قاعدة البيانات على نموذج أو Modal مطابق يُستخدم للتفاعل مع هذا الجدول. بالإضافة إلى استرجاع السجلات من قاعدة البيانات ، تسمح لك نماذج Eloquent بإدراج وتحديث وحذف البيانات من الجدول أيضًا. يعني باختصار هو كيان يساعدنا في التعامل مع قاعدة البيانات. قبل هذا يجب توضيح الموجه أو route وهو عبارة عن كيان يحتوي على جميع الروابط أو الوجهات التي يمكن للنظام التوجه لها حيث أنه في كل صفحة تقوم بفتحها في مشروع لارافيل يجب أن تحتوي أولاً على موجه route, وغالباً يتم إستخدام ال controller مع ال route حيث أنه الكيان الذي يحدد الصفحات لل route والبيانات التي تحملها الصفحة ,أي يمكن تسميته أنه حلقة الوصل بين ال Modal و ال view والتي هي الصفحات التي يتم عرضها للمستخدم النهائي. حيث في حال قمت بتعريف UserController فهذا الكائن سيتعامل مع الطلبات التي لها علاقة بال user من عرض المستخدمين إنشاء ,تعديل وحذف وغيرها. هو المخطط الخاص بقاعدة البيانات حيث أنه يتم التحديد بداخله أسماء الجداول و الأعمدة ونوع البيانات التي ستحملها وغيرها من الخصائص الخاصة بكل عمود في قاعدة البيانات وتوفر لارافيل Schema بداخل هذه ال Migration التي توفر دعمًا غير محدد لقاعدة البيانات لإنشاء الجداول ومعالجتها عبر جميع أنظمة قواعد البيانات المدعومة من لارافيل مثل MySQL ,PostgreSQL وغيرها. وبعد إنشاء يتم عمل عملية migration أو ترحيل لها لإنشاء الجداول والأعمدة وتعديلها. مثال توضيحي بسيط لما يحدث عندك فتحك مثلاً صفحة تعرض بها جميع المنتجات الخاصة بمتجر ما ,في البداية يجب أن يكون لدينا migration وقمنا بتهجيره إلى قاعدة البيانات ليتم إنشاء الجداول والأعمدة بداخله ثم وبسبب وجود route لهذه الصفحة ستفتح الصفحة وال route يقوم بالتوجه إلى controller مع تحديد الدالة المراد التوجه لها ثم وبداخل هذه الدالة يتم استخدام ال Model لجلب جميع المنتجات في المتجر ويتم تحويل هذه المنتجات من ال Controller إلى view ليتم عرضها للمستخدم النهائي على شكل جدول. في حال كنت تريد أي شيء متعلق في لارافيل فعليك مباشرة التوجه إلى التوثيق الرسمي فهو يحتوي على كل المعلومات المتعلقة في لارافيل بشكل منظم وجميل وسهل وهو المرجع في أي معلومة أو مشكلة تواجه أي شخص يعمل على لارافيل.
    1 نقطة
  5. مرحبا عبد ااواحد، إن هرمية MVC قائمة على توزيع المهام البرمجية إلى 3 أقسام، وهي MODEL أي نماذج قواعد البيانات، وما تحتويه من صفوف و بيانات و استعلامات، آليات الإضافة و التعديل وكل ما يتعلق بقواعد البيانات، مهمتها الأساسية في التطبيق هي تزويدنا بالمعلومات التي نطلبها. تقوم Eloquent في إطار العمل Laravel بمخاطبة قاعدة البيانات وتنفيذ تعليمات SQL بشكل يتناسب مع ما قد كتبناه عند تعريفنا للأصناف التي ترث الصف Model. ((القسم الثاني، العرض VIEW، وهو كل ما يظهر للمستخدم على الشاشة، أساسه صفحات HTML و ماتتضمنه من تنسيقات و ايضا جافا سكربت وإطارات العمل خاصتها.)) القسم الثالث، المتحكم Controller وهو عنصر الربط بين ماسبق، حيث أنه يستلم طلبية الزبون/المستخدم و يطلب بعدها البيانات المتوافقة من MODEL و بعدها يوجه البيانات بالشكل الصحيح لواجهة العرض المناسبة VIEW. أما Migration: التهجير، هي المرحلة الوسيطة بين تعريف النماذج (الأصناف ضمن Model)، وعملية بناء قاعدة البيانات وما تحويه من جداول. إن بناء ملفات التهجير (بشكل تراكمي بدون تعديل الملفات السابقة) يسمح لنا بشكل ما بالتحكم بالتعديلات التي نقوم بها على قاعدة البيانات، حيث إن عمل ملف تهجير جديد مع تعديلات جزئية (إضافة حقل جديد مثلا أو تغيير نمط حقل) يسمح لنا بالتراجع عن هذه التعديلات أي عمل Rollback لآخر تعديل أو أكثر (التراجع عن تعديل كبير مثل حذف عمود من بنية الجدول سيؤدي لخسارة جميع البيانات) أي تسمح لنا بتعقب التعديلات على قاعدة البيانات (تفيد أكثر في حالة أنك تعمل مع فريق). تسمح لك عمليات التهجير بإضافة أو حذف الحقول في قاعدة البيانات الخاصة بك دون حذف السجلات الموجودة بالفعل.
    1 نقطة
  6. أهلا بك عبدالواحد, ويوجد إضافة إلى هذه s- التي تعود على Seeder و f- والتي تعود على Factory ويوجد ما يجمعها جميعاً كل من Migration, Resource Controller, Seeder and Factory وهو إضافة a- ويصبح الأمر php artisan make:model Name -a ,ويجب الأخذ بعين الإعتبار تسمية ال model حيث يكون أول حرف كبير ويكون بالصيغة المفردة مثل User Post وفي حال كانت ال model يتكون من كلمتين أو أكثر يبدأ كل أول كلمة بحرف كبير. وفي حال كنت تستخدم لارافيل 8 سيكون لديك مجلدأ جاهزاً باسم Models يحتوي على كل ال Models أما قبل النسخة 8 لم يكن هناك هذا المجلد وكان ينفذ الأمر كالتالي لإدخال الModel بشكل تلقائي في المجلد ووضع ال namespace المناسبة php artisan make:model Models/Name -a ولكن من أجل الترتيب ففي الغالب كان يتم إنشاء هذا المجلد ليحتوي جميع ال Models من أجل ترتيب المشروع وتنظيمه.
    1 نقطة
  7. السلام عليكم ورحمة الله وبركاته من يمكن الحصول على قوالب سياسة الخصوصية وقوانين المشاركة هل يوجد لدى احدكم قوالب جاهزة يمكن استخدامها لتطبيق هاتف ؟
    1 نقطة
  8. اهلا اخي لا توجد مشكله يعني في الاقتباس؟ مع تغير اسم التطبيق وما شابه طبعا؟
    1 نقطة
  9. مرحبا صديقي يمكنك البحث عن تطبيق مشابه لفكرة تطبيقك و اقتباس سياسة الخصوصية مع التعديل بما يناسب تطبيقك -اتبع الخطوات التالية 1-على جهازك، افتح تطبيق Google Play . 2-افتح أي تطبيق تريد الاطّلاع على سياسة الخصوصية الخاصة به. 3-ابحث عن معلومات الاتصال بمطوّر التطبيق في صفحة تفاصيل التطبيق وانقر عليها. 4-انقر على سياسة الخصوصية. https://support.google.com/googleplay/answer/2666094?hl=ar
    1 نقطة
  10. وعليكم السلام ورحمة الله تعالى، مرحبًا @Marwan800، يجب عليك في البدايية التعرف على من سيستهدف تطبيقك ولماذا؟ ما نوع الأشخاص الذين يرغبون في إجراء هندسة عكسية لتطبيقك؟ لماذا ا؟ ماذا سيخرجون منه؟ هل هم هواة يستمتعون بتطبيقك ومن المحتمل أن يساعدوا عملك من خلال تعزيز مجتمع من المتحمسين للقراصنة؟ هل هم منافسون في العمل؟ إذا كان الأمر كذلك ، فمن؟ ما هو دافعهم؟ كم سيكسبون؟ هذه الأسئلة كلها مهمة جدًا لطرحها لأنه في نهاية اليوم، كلما زاد الوقت الذي تستثمره في قفل الكود الخاص بك، زادت تكلفة ذلك عليك وزادت تكلفة الهندسة العكسية للخصم. يجب أن تجد المكان المناسب بين قضاء بعض الوقت في تقوية التطبيق إلى الحد الذي يجعل معظم الأشخاص الفنيين لا يرغبون في قضاء الوقت في محاولة إحباط دفاعات تطبيقك. يمكنك اتباع الاقتراحات الآتية، قم بإنشاء ما يسمى "نموذج التهديد Threat Model". هذا هو المكان الذي تجلس فيه وتفكر في وحدات ومكونات التطبيق الخاص بك، وتجري بحثًا حول المجالات التي من المرجح أن تتعرض للخطر وكيف. يمكنك تحديدها عدة مرات في رسم تخطيطي، ثم استخدام نموذج التهديد هذا لمعالجتها بأفضل ما يمكنك في التنفيذ. ربما تصيغ 10 تهديدات ، لكنك قررت أن 3 فقط هي الأكثر احتمالًا ، وتعالج تلك الثلاثة في الكود أو البنية. اعتماد بنية تثق في تطبيق العميل بأقل قدر ممكن. بينما يمكن لمالك الجهاز دائمًا عرض رمز التطبيق وحركة مرور الشبكة، لا يمكنه دائمًا الوصول إلى الخادم. هناك أشياء معينة يمكنك تخزينها على الخادم مثل مفاتيح واجهة برمجة التطبيقات الحساسة والتي لا يمكن للمهاجم الوصول إليها. ابحث في "AWS Secrets Manager" أو "HashiCorp Vault" على سبيل المثال. لكل وحدة عميل ، اسأل نفسك "هل سيكون من الجيد أن يرى المهاجم الأعمال الداخلية لهذا؟" "لما لا؟" وإجراء التعديلات اللازمة. قم بتطبيق التعتيم إذا كان نموذج التهديد الخاص بك يتطلب ذلك. الحقيقة هي أنها آلية حماية فعالة في كثير من الحالات. علاوة على ذلك، فإن الحجة المذكورة أعلاه لا معنى لها. لا يمنع التشفير الأشخاص من الحصول على بياناتك، بل يؤدي فقط إلى إبطائهم ... . يتم اختيار معظم أقفال الأبواب بسهولة بواسطة منتقي أقفال ماهر في ثوانٍ، ويمكن إطلاق النار على الأشخاص من خلال سترات واقية من الرصاص ، ويموت الأشخاص أحيانًا في حادث سيارة عند ارتداء حزام الأمان ... لذلك لا ينبغي لنا قفل الأبواب، وارتداء السترات، وارتداء أحزمة المقاعد لدينا؟ لا، سيكون ذلك سخيفًا، لأن هذه الأجهزة تقلل من احتمالية حدوث مشكلة ، تمامًا مثل التشويش ، وتجريد الرموز ، وتطوير بنية أكثر أمانًا، واستخدام خدمة Secrets Manager لتخزين أسرار واجهة برمجة التطبيقات الخاصة بك.
    1 نقطة
  11. مرحبا مروان، إن عملية حماية اي تطبيق مهما كانت المنصة المبرمج فيها وبنسبة 100% هو أمر مستحيل. دائما يوجد طريقة للاختراق وإعادة تشكيل الشيفرة البرمجية الأصلية بعملية عكس الترجمة decompile. هل يمكن جعل عملية الهندسة العكسية غير مفيدة إلى حد ما؟ نعم، عن طريق جعل الشيفرة البرمجية أصعب للفهم من قِبل المخترق. تتم هذه العملية عن طريق تغيير اسماء الصفوف و المتحولات و الإجرائيات في الشيفرة البرمجية و إعطائها أسماءً طويلة و غير مفهومة. تدعى هذه العملية ب Obfuscating Dart code مثل إزالة الوضوح عن الشيفرة البرمجية، فبعد عملية الهندسة العكسية، ينتج برنامج غير واضح المعالم وصعب الفهم و التعقب. توفر Flutter طريقة خاصة لعمل هذا الأمر بشكل بسيط يمكنك تعلم الطريقة بتنفيذ تعليمة محددة أثناء بناء التطبيق من هنا: Obfuscating Dart code. هي طريقة سهلة وتعتبر تمرير بارامترات لعملية بناء التطبيق وليس أكثر بالنسبة للمستخدمين. بالنسبة لمنع حصول الهندسة العكسية، هو أمر غير ممكن. بالتوفيق
    1 نقطة
  12. لتلقي أو الحصول على مدخلات من المستخدم ، استخدم cin. هنا ، المدخلات هي المتغير الذي يخزن قيمة رقم أو حرف أو سلسلة معينة. في هذا المثال سوف نجعل المستخدم يدخل رقم ثم نخزنه في متغير val ثم نعرضه على الشاشة باستخدام cout: #include<iostream> using namespace std; int main() { int val; cout<<"Enter the Number: "; cin>>val; cout<<"\nThe Value is "<<val; cout<<endl; return 0; في هذا البرنامج نجعل المستخدم يدخل حرف ثم طباعة الحرف على الشاشة: #include<iostream> using namespace std; int main() { char ch; cout<<"Enter the Character: "; cin>>ch; cout<<"\nYou've entered: "<<ch; cout<<endl; return 0; } في هذا البرنامج سوف يدخل المستخدم سلسلة من المدخلات باستخدام cin ثم عرضها على الشاشة باستخدام cout: #include<iostream> using namespace std; int main() { char str[200]; cout<<"Enter the String: "; cin>>str; cout<<"\nYou've entered: "<<str; cout<<endl; return 0; }
    1 نقطة
  13. مرحبًا @Abdul Rahman Saleh، يمكنك أخذ مدخلات من المستخدم بسهولة من خلال لغة ++C وذلك من خلال الكود << cin، إليك المثال التالي الذي يقوم بجمع رقمين يقوم المستخدم بإدخالهم: #include <iostream> using namespace std; int x, y; /*تعريف متغيريين x و y */ int sum; /* تعريف متغير لجمع الرقمين*/ cout << "Type a number: "; /*طلب من المستخدم إدخال الرقم الأول*/ cin >> x; /*وضعه في المتغير x */ cout << "Type another number: "; /* الطلب من المستخدم إدخال الرقم الثاني */ cin >> y; /*وضعه في المتغير y */ sum = x + y; /*جمع الرقمين*/ cout << "Sum is: " << sum; /*إظهار المجموع للمستخدم*/
    1 نقطة
  14. تنتشر العديد من لغات البرمجة في جميع أنحاء الإنترنت ، مما يجعل الكثير من الناس في حيرة من أمرهم لاختيار أي منها. تم إنشاء كل لغة برمجة تقريبًا لمجموعة متنوعة من الأغراض ، لا يوجد شيء خاص وهناك شيء مشترك. بما في ذلك التشفير والعديد من لغات البرمجة المستخدمة في تنفيذ التشفير. أهم اللغات المستخدمة في التشفير : 1. بايثون: لا تزال بايثون هي المفضلة لتطبيق التشفير ، ولا سيما للتحليل. مع الراحة المتوفرة في Python ، يمكننا تنفيذ التشفير بسهولة. 2. Golang: لغة برمجة جديدة نسبيًا. تم تطوير Golang بواسطة Google ، يوجد العديد من المبرمجين الذين يستخدمونها لتنفيذ التشفير. 3. Ruby: من المتوقع أن تكون Ruby هي خليفة بايثون ، والتي توفر سهولة الترميز ، أصبحت Ruby بديلاً آخر لـ Python لتنفيذ التشفير بشكل مريح. 4. C/C++: اللغة البرمجة الرسمية للتشفير . لا يزال يحتفظ C / C ++ بأفضل أداء. 5.C#: لا عجب في أن العديد من مكتبات التشفير مبنية باستخدام لغة البرمجة C # ، لأنها توفر نظام التشغيل الذي يستخدمه الناس على نطاق واسع في جميع أنحاء العالم. من الممكن استخدام Java أيضا.
    1 نقطة
  15. وعليكم السلام ورحمة الله تعالى مرحبًا @Ahmed Labadi، إختيارك للغة الأنسب يعتمد على توع المشروع والبيانات التي سوف تقوم بتشفيرها، حيث أنك إذا كنت تستخدم المفتاح العمومي (public-key) ، فإن bignums المدمجة في Python مريحة للغاية. ولكن بالنسبة للأصفار والتجزئة التقليدية، والاهتمام بالأداء، فأنت تريد وصولاً منخفض المستوى (low-level language) للغاية إلى الجهاز. تعد C و++C هي الأكثر شيوعًا ، إن لم تكن لغة التجميع الأولية. بالطبع ، هذه فقط الأساسيات. يمكنك بعد ذلك تغليفها وتنفيذ الجزء الأكبر من العمل من Python أو أي لغة أخرى. أتمنى لك التوفيق..
    1 نقطة
  16. مرحبا اخي اقرا هذا المقال من موقع upwork https://freelancetowin.com/upwork-profile-not-approved/
    1 نقطة
  17. لا، فالأرشيف يحتوي على النسخ الأقدم للدورات أي أنها تستخدم تقنيات قديمة، و بمجرد تحديث الدورات و استخدام تقنيات حديثة أفضل فأنت لست بحاجة إلى تعلم التقنيات الأقدم.
    1 نقطة
  18. معنى العرض مستبعد هو أن صاحب المشروع قام باختيار مستقل آخر للعمل على مشروعه، فبمجرد أن يقبل صاحب المشروع عرض أحد المستقلين يظهر للباقين أنه تم اسبعاد عرضهم، و عدم اختيارك للعمل على المشاريع لا يظهر في البروفايل الخاص بك كما أنه لا يعني أن المستقل ليس كفئًا أو ما شابه ففي بعض الأحيان يكون لأصحاب العمل معايير مختلفة لاختيار مستقلين لمشاريعهم منها السعر أو المكان الجغرافي مثلًا. ما يؤثر في بروفايلك حقًا هو التسليم بعد الموعد، أو تسليم عمل بجودة غير جيدة تجعل صاحب العمل يعطيك تقييم سئ و ما إلى ذلك.
    1 نقطة
  19. تخيّل معي الوضع التالي. أنت عضو في فريق تطوير تطبيق باستخدام Laravel 4. يستخدم أعضاء الفريق git لإدارة إصدارات التطبيق وفي كل مرة يقوم عضو من أعضاء الفريق بإضافة خصائص أو إدخال تعديلات جديدة على المشروع يقوم بإيداع التغييرات في مُستودع التطبيق. إلى هنا يبدو الوضع عاديا (بل مثاليا) لكن ماذا لو قام أحد أعضاء الفريق بإدخال تعديل يتطلب إضافة جداول جديدة إلى قاعدة البيانات أو تعديل حقول وحذف أخرى، فما الحل هنا؟ هل يستطيع git مثلا أن يفي بالغرض؟ أم أنه سيتم تصدير قاعدة البيانات في كل مرة ويُطلب من كل عضو في الفريق استيرادها؟ ماذا عن البيانات التي تحتويها قاعدة البيانات؟ وهل يجب فعلا أن نتخلص من قاعدة البيانات القديمة واستبدالها بأخرى في كل مرة؟ إن كنت تستخدم إطار عمل لارافل فالحل يكمن في استخدام التهجير migrations والذي يُعتبر نظاما لإدارة الإصدارات الخاصة بقواعد البيانات، حيث أنه لن تعود هناك حاجة إلى إنشاء أي جداول أو إضافة حقول والتعديل عليها بشكل مُباشر/يدوي، وإنما يتم وصف تلك الجداول وحقولها بصيغة تجعل من التعامل مع قواعد البيانات أسهل. قد يبدو الأمر مُعقّدا بعض الشيء، لكنه في حقيقة الأمر بسيط، وبمُجرد أن تفهم آلية عمله وتشرع في استخدامه حتى تستغرب كيف ضيعت كل الوقت السابق في إدارة قواعد البيانات يدويا. خاصية migrations مُفيدة لك حتى ولو كنت تعمل على مشروعك بشكل فردي. بطبيعة الحال ستحتاج إلى إنشاء قاعدة بيانات للمشروع، ومن ثم التعديل على ملف app/config/database.php بما يتوافق مع ذلك. إنشاء ملفات migrationsلإنشاء ملف migration جديد نحتاج إلى استخدام artisan لتنفيذ الأمر migration:make على النحو التالي مع استبدال اسم عملية التهجير بما يتوافق مع ما تقوم به (بطبيعة الحال ستحتاج إلى تنفيذ هذا الأمر بسطر الأوامر لما تكون داخل مُجلد المشروع): php artisan migrate:make create_users_tableسيقوم laravel بإنشاء ملف جديد داخل مُجلد app/database/migrations يحمل الاسم الذي حددته في الأمر السابق ( create_users_table) مسبوقا بترقيم يُمثل تاريخ إنشائه حتى يتسنى لـ laravel معرفة الترتيب الذي يجب اتباعه لدى تنفيذ التهجيرات. يُفضل استخدام أسماء للتهجيرات تدل على ما تقوم به. ففي المثال السابق أردنا إنشاء عملية تهجير جديدة لإنشاء جدول مُستخدمين، وبالتالي كان الاسم create_users_table. ينتج عن تنفيذ الأمر السابق ملف يحتوي: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // } /** * Reverse the migrations. * * @return void */ public function down() { // } } كما هو ظاهر هنا فإن الصنف CreateUsersTable يحتوي على دالتين الأولى up والتي تُبين ما الذي يجب القيام به لدى تنفيذ التهجير، والثانية down والتي نُحدد فيها ما الذي يجب القيام به لدى إلغاء التهجير في حال ما إذا أردنا العودة بقاعدة البيانات إلى الحالة التي كانت عليها قبل تنفيذ التهجير. هذا الملف لا يُحدد أي جدول نعمل عليه أو نرغب في إنشاءه. يُمكن إضافة ذلك يدويا، كما أنه يُمكن القيام بذلك عبر تحديد اسم الجدول لدى تنفيذ أمر إنشاء عملية التهجير وذلك باستخدام --create التي تُحدد اسم الجدول الذي نرغب في إنشاءه أو --table التي تُحدد اسم الجدول الذي نرغب في التعديل عليه. فمثلا لو حذفنا عملية التهجير السابقة ورغبنا في إعادة إنشاء أخرى مع تحديد اسم الجدول فسيكون ذلك على النحو التالي: php artisan migrate:make create_users_table --create=usersوالذي سينتج عنه ملف مثل الملف السابق، لكن هذه المرة نجد أن دالتي up و down تحتويان أوامر أولية: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('user', function(Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('user'); } } لاحظ هنا أن users هي اسم الجدول المُراد إنشاؤه والذي يكون عادة جمع اسم الـ model الذي تتعامل معه (بمعنى إن كان user هو اسم الـ model فسيكون اسم الجدول الخاص به users) أما لو أردنا التعديل على نفس الجدول السابق وإضافة حقل جديد إليه فيكفي تنفيذ الأمر التالي: php artisan migrate:make add_votes_to_user_table --table=users تنفيذ عمليات التهجيرإلى حد الآن كل ما قمنا به هو إنشاء ملفات التهجير، حيث أنك لو تحققت من قاعدة البيانات لوجدتها فارغة. لتنفيذ عمليات التهجير نستعمل الأمر php artisan migrateوبعد ذلك ستلاحظ ظهور جدول جديد على قاعدة البيانات. أما لو رغبت في التراجع عن آخر عملية تهجير (أو بالأحرى عن آخر جملة تهجيرات تم تنفيذها مع بعض) فإننا نستعمل الأمر: php artisan migrate:rollbackوفي حال ما إذا رغبت في التراجع عن جميع عمليات التهجير والرجوع إلى الحالة الأولى لقاعدة البيانات فإن الأمر التالي كفيل بالقيام بذلك: php artisan migrate:resetويُمكن أيضا استخدام الأمر التالي للتخلص من جميع عمليات التهجير وإعادة تنفيذها من جديد بشكل مُباشر بعد ذلك: php artisan migrate:refreshأنواع الحقولرأينا في الفقرة السابقة بأن عمليات التهجير تسمح لنا بإنشاء معرف autoincrement إضافة إلى حقلي created_at و updated_at بفضل دالة timestamps. يسمح Laravel بإنشاء شتى أنواع الحقول التي قد تحتاجها في مشروعك إلى جانب إضافة خصائص للحقول وإعطائها قِيمًا أوليّة. المثال التالي يُبين بعض هذه الحقول والخصائص: $user->string('name', 64); $user->integer('age')->nullable(); $user->boolean('active')->default(1); $user->integer('role_id')->unsigned(); $user->text('bio');والذي يقوم بإنشاء: حقل name يكون نصيا يكون أقصر من أو يُساوي 64 محرفا.حقل age يكون رقميا، كما أنه يقبل القيمة NULLحقل active يكون منطقيا ويحمل قيمة أولية 1حقل role_id رقميا ويكون موجباحقل bio يكون نصيابإمكان الاطلاع على جميع أنواع الحقول المُمكنة من هنا حذف الحقولستحتاج إلى حذف الحقول في دالة down ويتم ذلك على النحو التالي: Schema::table('users', function($table) { $table->dropColumn('votes'); });بذر قواعد البيانات database seedingالمقصود ببذر قواعد البيانات هو إدخال البيانات الأولية التي نحتاجها لتجربة التطبيق. بالرغم من أن تطبيقك يسمح بإنشاء مُستخدمين جدد فإنك سترغب في استخدام مُستخدمين تجريبيين في كل مرة تُحدث تغييرات في التطبيق، وإنشاء عدد من المُستخدمين يدويا في كل مرة مضيعة للوقت. الحل يكمن في إعلام Laravel بالبيانات الأولية التي ترغب في بذر قاعدة البيانات بها بعد إنشائها ويتم ذلك عبر إنشاء ملفات بذر داخل مُجلد app/database/seeds يحتوي الأوامر التي يجب تنفيذها. مثال على ملف بذر يقوم بإضافة مُستخدم جديد: class UserTableSeeder extends Seeder { public function run() { DB::table('users')->delete(); User::create(array('email' => 'foo@bar.com')); } } لتنفيذ عملية البذر التي قمنا بإنشائها فإننا نستخدم الأمر التالي: php artisan db:seed --class=UserTableSeederوإن كان لديك أكثر من ملف بذر وترغب في تنفيذها كاملة بأمر واحد فإنه يكفي القيام بذلك عبر تحديد أسماء عمليات البذر المُراد تنفيذها في صنف/ملف DatabaseSeeder الذي ستجده داخل مُجلد app/database/seeds على النحو التالي: class DatabaseSeeder extends Seeder { public function run() { $this->call('UserTableSeeder'); $this->call('PostTableSeeder'); } }وبعد ستحتاج إلى تنفيذ الأمر php artisan db:seedالذي سيقوم بقراءة الملف واستدعاء عمليات البذر بشكل مُتوال بإمكانك أيضا تنفيذ عمليات البذر مُباشرة بعد تحديث عمليات التهجير على الشكل التالي: php artisan migrate:refresh --seedتوليد بيانات تجريبية باستخدام Fakerبالرغم من أن هذه الخُطوة ليست ضرورية، إلا أنه في الكثير من الحالات ستحتاج إلى بيانات تجريبية أقرب ما تكون إلى البيانات الحقيقية للتجريب عليها. فمثلا سترغب في استخدام أسماء مُستخدمين "حقيقيين" وعناوين بريد إلكتروني، وعناوين منازل، إضافة إلى أسماء المُدن وأرقام هواتف وما إلى ذلك. بطبيعة الحال فإنه بالإمكان الاكتفاء بملفات البذر وإدخال تلك البيانات بطريقة شبه يدوية، إلا أن هناك حلا آخر يُسهّل عليك ذلك إن استعنت بمكتبة Faker للحصول على هذه البيانات. بداية سنحتاج إلى "تنصيب" Faker وذلك على النحو التالي: قم بالتعديل على ملف composer.json وإضافة التالي: "require-dev":{ "fzaninotto/faker": "1.5.*@dev" },أو قم بإضافة "fzaninotto/faker": "1.5.*@dev" إن كان حقل require-dev مُتوفرا في الملف. بعدها قم بتنفيذ الأمر php artisan update ليقوم artisan بتحميل الملفات المطلوبة. في غالب الأحوال ستحتاج إلى إنشاء مُستخدم غير عشوائي إلى جانب البيانات التجريبية، وعليه يُفضل إنشاؤه أولا قبل توليد البيانات العشوائية. $user = User::create(array( 'username' => 'djug', 'first_name' => 'Youghourta', 'last_name' => 'Benali', 'email' => 'djug@someNewProject.com', 'password' => Hash::make('MySuperPassword') )); $faker = Faker\Factory::create(); for ($i = 0; $i < 25; $i++) { $user = User::create(array( 'username' => $faker->userName, 'first_name' => $faker->firstName, 'last_name' => $faker->lastName, 'email' => $faker->email, 'password' => Hash::make('Password') )); في هذا المثال قمنا بإنشاء 25 مُستخدم يحملون أسماء بشر (وليس مُجرد حروف عشوائية) إضافة إلى عناوين بريد إلكتروني. تسمح مكتبة Faker بتوليد شتى أنواع الحقول التي قد تحتاجها والتي يُمكن الحصول على نُسخ مُوطنة ومُترجمة منها، فمثلا يُمكن توليد أسماء عربية وعناوين فرنسية وما إلى ذلك. للمزيد حول مكتبة Faker قم بإلقاء نظرة على مُستودع المشروع على github وللمزيد حول جميع أنواع العمليات التي يُمكن القيام بها على الهجرات: Schema Builder
    1 نقطة
×
×
  • أضف...