-
المساهمات
3552 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
34
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سمير عبود
-
إن كنت تريد مزامنة الملفات بين عدة أجهزة يُمكنك إستخدام برنامج syncthing وهو برنامج مفتوح المصدر يستخدم لمزامنة الملفات والمجلدات بين أجهزة متعددة بشكل آمن وسهل. يتيح لك البرنامج الحفاظ على نسخ متزامنة من الملفات عبر الأجهزة المختلفة، سواء كانت أجهزة كمبيوتر، خوادم، أو حتى أجهزة محمولة. من بين أهم المميزات أنه بسيط وسهل الإستعمال بالإضافة لأنه متعدد المنصات يعمل على معظم أنظمة التشغيل بما في ذلك Windows، macOS، Linux، و Android، تستطيع إستكشاف البرنامج وما يقدمه من مميزات من خلال يوتيوب يوجد عدة مقاطع تشرح ذلك. مستودع البرنامج على github : مستودع syncthing
- 3 اجابة
-
- 1
-
تحتاج إلى إضافة الحقل لإستمارة التسجيل: <div class="mt-4"> <x-label for="photo" value="{{ __('Photo') }}" /> <x-input id="photo" class="block mt-1 w-full" type="file" name="photo" /> </div> تحتاج التعديل على عُنصر الإستمارة بإضافة: <form method="POST" action="{{ route('register') }}" enctype="multipart/form-data"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ بعدها تحتاج إلى التعديل على التابع المسؤول عن إضافة السجل: بإضافة التحقق: Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], // إضافة التحقق ])->validate(); ثم بعد إنشاء المستخدم تقوم بتعديل الصورة في حالة ما إذا كان الطلب به ملف صورة: $user = User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]); if (isset($input['photo'])) { $user->updateProfilePhoto($input['photo']); } return $user; تستطيع حفظ الصورة بنفسك قبل حفظ المستخدم، لكن بإمكانك أيضاً إستخدام نفس الخاصية الموجودة في التعديل، أي التابع updateProfilePhoto كما هو موضح أعلاه، التابع سيقوم بحفظ الصورة في المجلد storage و يُعدل على حقل الصورة في قاعدة البيانات أيضاً.
-
خاصية تعديل الصورة الشخصية للمستخدمين متاحة كخاصية إفتراضية في Jetstream، لا تحتاج إلى إنشائها من الصفر فقط عليك تفعيلها من خلال ملف الإعدادات: config/jetstream.php ستجد بداخل المفتاح features السطر التالي: Features::profilePhotos(), مُعلق قم بإزالة التعليق. ثم ستتمكن من التعديل على الصورة الشخصية من خلال صفحة ال profile، إن أردت شيء مغاير يُمكنك الإشارة.
-
يُمكنك إستخدام الدالة unlink في php لحذف أي ملف، وتمرير مسار الملف الذي تريد حذفه كوسيط أول للدالة.
- 10 اجابة
-
- 1
-
نعم بإمكانك ذلك، لكن ستنسخ بعض الأكواد فقط جزء التحقق من المدخلات و التي من بينها الصورة، أما الإستعلام سيتغير لأنك في هذه الحالة ستقوم بإستعلام تعديل أيضاً قد تحتاج إلى حذف الصورة السابقة في حالة تعديل الصورة كي لا تتكدس الصور لديك في مجلد التخزين بدون حاجة لها
- 10 اجابة
-
- 1
-
إذا كان قصدك الخاصية alt و القيمة التي وضعتها فهي قيمة إختيارية فقط، أما الخاصية فهي تعني النص البديل وهذا النص يظهر في حالة تعذر الوصول إلى الصورة.
- 10 اجابة
-
- 1
-
لا يمكنك وضع الصورة من خلال حقل file عليك وضعها من خلال عُنصر الصورة (img) أي أن كود php ستضعه من خلال الخاصية src في عُنصر الصورة (img)، يعني ستقوم بتعديل التالي: <img width="180" height="150" src="https://placehold.co/180x150" alt="image preview" id="preview"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ بوضع مسار الصورة عن طريق php: <img width="180" height="150" src="<?php echo 'مسار الصورة' ?>" alt="image preview" id="preview"> أنا لا أعلم إسم الحقل الذي تخزن فيه مسار الصورة ولا كيف تقوم بتخزينها لكن أنت ملم بهذه المعطيات، فقط ستُعدل على ال 'مسار الصورة' بما يوافقها بعد جلبك للبيانات.
- 10 اجابة
-
- 1
-
لا يُمكنك وضع القيمة من خلال حقل الإدخال (input file) مباشرةً، تحتاج إلى إضافة عُنصر صورة (img) تحت الحقل file تعرض به الصورة من خلال المسار الخاص بها، ثم من خلال جافاسكربت يُمكنك إذا قام المستخدم بتغيير الصورة إلتقاط الحدث و التغيير على الصورة بحيث تظهر الجديدة التي اختارها، بعد ذلك إذا تم الضغط على زر التعديل ترسل الإستمارة إلى الخادم وتحفظ الصورة الجديدة: هنا شرح بسيط للعملية: <form action="" enctype="multipart/form-data"> <input type="file" id="file" name="file" accept="image/*" onchange="loadImage(event)"> <br><br> <img width="180" height="150" src="https://placehold.co/180x150" alt="image preview" id="preview"> </form> لاحظ العُنصر img (هو الذي نستخدمه لعرض الصورة، يُمكنك التعديل على الخاصية src بوضع مسار الصورة الخاصة بالسجل الذي تقوم بالتعديل عليه) أيضاً لاحظ عُنصر الإدخال استخدمنا الخاصية onchange لإلتقاط حدث التغيير وتنفيذ الدالة loadImage التي سنقوم بإنشائها عبر JavaScript: const loadImage = (event) => { const output = document.getElementById('preview'); output.src = URL.createObjectURL(event.target.files[0]); output.onload = function() { URL.revokeObjectURL(output.src) } } فقط نقوم بتحديد عُنصر الصورة من DOM ثم نُغير على الخاصية src بوضع الصورة الجديدة. المثال موجود على CodePen من هنا، هذه الفكرة بإختصار يُمكنك التعديل عليها حسب الحالة وإضافة التنسيقات المناسبة لك.
- 10 اجابة
-
- 1
-
إن كنت تقصد دورة مخصصة بشكل كامل لبناء تطبيقات الهاتف فهي غير موجودة، لكن توجد دورة تطوير التطبيقات باستخدام JavaScript التي تتكون من مسارات تم التطرق فيها إلى تطوير تطبيقات جوال بشكل كامل و شرح الأساسيات في بعض التقنيات وأطر العمل المستعملة في هذا المجال مثل React Native و Ionic. فإذا توجهت للصفحة الخاصة بهذه الدورة: دورة تطوير التطبيقات باستخدام لغة JavaScript ستجد المسارات التالية: تطوير تطبيق جوال باستخدام React Native تطبيق دردشة يشبه WhatsApp و هذا مسار يشمل تطبيق الويب بإستعمال node.js و react.js وتطبيق جوال بإستعمال React Native تطوير تطبيق جوال للتواصل الاجتماعي باستخدام Ionic وهذا المسار شامل لإطار العمل Ionic فهو يتكون من حوالي 111 درس موزعة على 16 ساعة لكن كما قلت فإن الدورة مخصصة للغة جافاسكربت والتطبيقات التي يمكن بناؤها بإستعمال هذه اللغة والتقنيات الخاصة بها، فستجد أنها تتكون أيضاً من مسارات إضافية لشرح أساسيات اللغة نفسها وشرح أساسيات NodeJs وأساسيات ReactJs، وأيضاً يوجد مسار لـ Typescript و مسار لإطار Electron.js المستعمل في بناء تطبيقات سطح المكتب و مسارات أخرى معظمها عملية تطبيقية يتم فيها بناء تطبيق معين. لذلك أعتقد أن هذه الدورة مناسبة لما تبحث عنه بقية الدورات تخص مجالات أخرى، لكن إن كنت تقصد شيئ آخر أو تقنيات أخرى غير التي ذكرتها يُمكن طرح تساؤلك أو تقديم إقتراحك على الإدارة من خلال مركز المساعدة، تحياتي.
- 1 جواب
-
- 1
-
دورة علوم الحاسوب هي عبارة عن حجر الأساس ونُقطة الإنطلاق لتعلم أحد المجالات والتخصص فيه، يُفترض أنه بعد إنهائك لهذه الدورة وفهم دروسها بالكامل أن تجد سهولة في إحتراف المجال الذي يناسبك وتبدأ رحلتك فيه. مسألة إختيار المجال تتعلق بك وبسوق العمل الذي تريد أن تستهدفه. أنصحك بالإطلاع على هذا المقال حتى تتضح لك الصورة وتُحدد الهدف الذي تريد بلوغه: تم التطرق في المقال لمعظم المجالات الموجودة وشرح مختصر للمجالات كما تم إرفاق مصادر لبداية تعلم كل مجال وإحترافه، بالتوفيق.
-
الموضوع مطول قليلاً لكنه بسيط فقط ستحتاج إلى إلمام بأساسيات الإطار يُمكنك الإطلاع على المقالات التي تخص لارافيل في الأكاديمية لفهم الموضوع بشكل أكبر. مبدئياً ستحتاج إلى نموذج بيانات (model) مربوط بجدول في قاعدة البيانات (migration)، مسارات (routes) تخص عمليات crud على النموذج يُمكن إستعمال مسار من النوع resource هنا لأنه يختصر كل المسارات في سطر واحد، متحكم (controller) لتحويل الطلبات إليه لمعالجتها وإرسال رد يوافق الطلب، من الممكن أن تحتاج إلى أشياء إضافية مثلاً كصنف مصنع (factory) وصنف بذر (seeder) للتعامل مع بيانات إختبارية أثناء التطوير (أي لبذر جدول البيانات ببيانات وهمية لإختبار العمليات) سأحاول شرح الموضوع بإختصار وعلى عمود واحد هو name، بإمكانك بعد ذلك تخصيص العمليات وإضافة الحقول التي تريدها بشكل كامل: 1 - إنشاء الملفات والأصناف، يمكنك هنا إستخدام أوامر artisan لهذا الأمر: php artisan make:model Student -mcsf الأمر السابق لإنشاء نموذج سميناه Student، و مررنا له الخيارات m وتعني migration و c تعني controller و s تعني seeder و f تعني factory. 2 - إنشاء مسار resource في ملف web.php: use App\Http\Controllers\StudentController; Route::resource('students', StudentController::class); السطر السابق سيمكننا من تعريف 7 مسارات كاملة ويُعطي لكل واحد منها إسم: /students -> name: students.index (GET) - controller method: index /students -> name: students.store (POST) - controller method: store /students/create -> name: students.create (GET) - controller method: create /students/{student} -> name: students.show (GET) - controller method: show /students/{student} -> name: students.update (PATCH) - controller method: update /students/{student} -> name: students.destroy (DELETE) - controller method: destroy /students/{student}/edit -> name: students.edit (GET) - controller method: edit 3 - ملء حقول جدول قاعدة البيانات (students) من خلال ملف التهجير الذي تم إنشاؤه: public function up(): void { Schema::create('students', function (Blueprint $table) { $table->id(); $table->string('name'); // add all fields later $table->timestamps(); }); } 4 - تنفيذ أمر التهجير: php artisan migrate سيقوم الأمر السابق بتهجير الملف السابق (إنشاء جدول students) وملئه بالحقول التي حددناها. 5 - تخصيص صنف المصنع وصنف البذر: من خلال صنف المصنع StudentFactory سنقوم بإضافة الحقل name وإسناد قيمة وهمية له عبر الدالة fake: public function definition(): array { return [ 'name' => fake()->name ]; } ومن خلال صنف البذر StudentSeeder سنستعمل النموذج والتابع factory لإنشاء 100 سجل مثلاً: use App\Models\Student; public function run(): void { Student::factory(100)->create(); } ثم من خلال الملف DatabaseSeeder سنضيف صنف البذر الخاص بالطلاب حتى يتم تنفيذه مع البذر: public function run(): void { $this->call([ StudentSeeder::class ]); } 6 - تنفيذ أمر البذر: php artisan db:seed الآن يُفترض أن تجد جدول الطلاب به 100 سجل. 7 - كتابة المنطق في وظائف المتحكم: <?php namespace App\Http\Controllers; use App\Models\Student; use Illuminate\Http\Request; class StudentController extends Controller { public function index() { $students = Student::latest()->paginate(10); return view('students.index', compact('students')); } public function create() { return view('students.create'); } public function store(Request $request) { $data = $request->validate([ 'name' => 'required|min:5|max:100', ]); Student::create($data); return redirect()->route('students.index') ->with('success', 'Student created successfully.'); } public function show(Student $student) { return view('students.show', compact('student')); } public function edit(Student $student) { return view('students.edit', compact('student')); } public function update(Request $request, Student $student) { $data = $request->validate([ 'name' => 'required|min:5|max:100', ]); $student->update($data); return redirect()->route('students.index') ->with('success', 'Student updated successfully.'); } public function destroy(Student $student) { $student->delete(); return redirect()->route('students.index') ->with('success', 'Student deleted successfully.'); } } 8 - ستحتاج إلى إضافة الحقل name إلى مصفوفة fillable في النموذج Student: protected $fillable = ['name']; 9 - إنشاء العروض (views) الأمر يعتمد على هيكلية ملفات العروض التي لديك وكيف تريد تنظيمها، لكن حسب الشيفرة التي كتبناها في المتحكم يُفترض أن يكون لدينا مجلد بالإسم students بداخل مجلد views وبداخله ملفات العروض (index - create - show - edit)، سأضيف ملف مخطط بالإسم main بداخل مجلد layouts لإستعماله كهيكل لبقية الملفات: views: - layouts: - main.blade.php - students: - create.blade.php - edit.blade.php - index.blade.php - show.blade.php في ملفات العروض ستقوم فقط بعرض البيانات المُرسلة من المتحكم، و ستوجه الروابط والإستمارات إلى المسارات التي أنشأناها، حتى لا يطول الجواب ستجد مُحتوى ملفات العروض والشرح ككل في مستودع github التالي: laravel11-crud يُمكنك بعدها تخصيص الحقول والقالب بالشكل الذي تريد.
-
كما تعلم فإن الحلقة التكرارية for تتكون من 3 أجزاء رئيسية، أول جزء يُسمى التمهيد و هو يُنفذ مرة واحدة فقط يتم من خلاله تمهيد متغيرات أو غيره، الجزء الثاني هو شرط إنتهاء الحلقة ويتم إختبار الشرط قبل تنفيذ ما بداخل الحلقة و يتم هذا الأمر بإستمرار مع كل تكرار، آخر جزء يتم تنفيذه بعد إنتهاء تنفيذ جسم الحلقة لكل تكرار ونقوم فيه بالغالب بزيادة العداد أو التغيير في قيمة المتغيرات التي تمت تهيأتها في أول جزء. يُمكننا التخلي عن أي جزء من هذه الأجزاء و كتابته قبل أو بداخل الحلقة، لكن يجب المحافظة على هيكلية الحلقة نفسها، يعني لو تخليت عن جزء تعريف الشرط في كتابة الحلقة نفسها ونقلته إلى الجسم كما هو الحال لديك يجب المحافظة على الفواصل المنقوطة كما هي بالشكل التالي: for (let current = 22; ; current+= 1) { if (current % 7 === 0) { console.log(current) break; } } أقصد هذا الجزء: for (let current = 22; ; current+= 1) ^^^ ما قبل الفاصلة المنقوطة الأولى يُمثل الجزء الأول من الحلقة وما بعدها إلى غاية الفاصلة المنقوطة الثانية يُمثل الجزء الثاني ثم يأتي الجزء الثالث والأخير. يُمكنك التخلي عن كل ذلك لكن يجب ترك الفواصل و هذا نفس المثال السابق: let current = 22 for (;;) { if (current % 7 === 0) { console.log(current) break; } current+= 1; } تم نقل جزء التمهيد إلى قبل الحلقة، التعليمة break ستُوقف الحلقة إذا تحقق الشرط، جزء زيادة العداد تم نقله إلى داخل الحلقة ليتم تنفيذه في آخر كل تكرار
- 3 اجابة
-
- 1
-
قد يتأخر الرد أحياناً من مركز المساعدة وذلك قد يكون بسبب الضغط أو مراجعة للمشاريع أو غير ذلك، وهذا شيء طبيعي يُرجى الإنتظار بعض الوقت وعدم القلق من هذا الأمر. سيتم الرد عليك في أقرب وقت ممكن، شكراً لتفهمك.
- 3 اجابة
-
- 1
-
يمكنك الإطلاع على الصفحة التالية الامتحان والحصول على الشهادة بها كل شيء يتعلق بموضوع الشهادة و الإمتحان و الخطوات مقتبسة من الصفحة: خطوات الامتحان 1. تواصل معنا أخبرنا برغبتك باجراء الامتحان مع تزويدنا بروابط مشاريعك التي طبقتها أثناء الدورة. يجب أن تكون قد طبقت المشاريع مع المدرب أثناء الدورة، ولا يمكن اجراء امتحان بمشاهدة المحتوى فقط. 2. محادثة صوتية سنحدد لك موعد لاجراء محادثة صوتية لمدة 30 دقيقة يطرح المدرب فيها أسئلة متعلقة بالدورة ويناقش معك ما نفذته خلالها. 3. مشروع التخرج سيحدد لك المدرب مشروعًا مرتبطًا بما تعلمته أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. 4. مراجعة المشروع والتخرج سيراجع المدرب المشروع الذي أنجزته، وإن سارت جميع الخطوات السابقة بشكل صحيح، ستتخرج وتحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل من جديد. الشروط التي يجب تحقيقها قبل التقدم للإمتحان: يمكنك التقدم إلى امتحان الدورة، من خلال التواصل مع مركز مساعدة أكاديمية حسوب، مع مراعاة الشروط التالية: إتمام أربعة مسارات تعليمية على الأقل التطبيق العملي مع المدرب، والاحتفاظ بالمشاريع العملية الناتجة لإرسالها للمراجعة رفع المشاريع على حسابك على GitHub أولًا بأول لمشاركتها معنا بالتوفيق.
-
أطر العمل الشهيرة في PHP والتي من بينها لارافيل تعتمد على ما يُسمى بحاوية الخدمات (Service Container) وهي عبارة عن حاوية يتم ملؤها بكافة الإعتماديات والتبعيات التي يحتاجها إطار العمل للإقلاع وتتم هذه العملية أثناء التمهيد (Bootstrapping)، تعتمد لارافيل كثيراً على مزودي الخدمات (Service Providers) لتحميل الأصناف و الكائنات وغيرها من إعتماديات، وأثناء التنفيذ إذا ما احتاج صنف معين إلى شيء ما يتم جلبه من تلك الحاوية إن كان موجود وإذا لم يكن كذلك يتم إنشاؤه و الإحتفاظ به في الحاوية لجلبه عند الطلب مرة أخرى. في الرابط التالي: DefaultProviders ستجد كل مزودي الخدمات الإفتراضية التي يستعملها إطار العمل، كل مزود خدمة به تابع register يقوم بتسجيل الخدمة التي يقدمها في حاوية الخدمات، أثناء عملية التمهيد يتم المرور عليها كلها وتنفيذ التابع register لتسجيل تلك الإعتماديات. بعد تسجيل مزود الخدمة يتم أيضًا إستدعاء التابع boot يُمكنك الإطلاع على المقال التالي للمزيد من المعلومات: مُعظم الحزم الشهيرة بها مزود خدمة يتم تسجيله بعد تثبيت الحزمة و هنا مثال عن FortifyServiceProvider ، بإمكانك إنشاء مزودو خدمة خاصين بتطبيقك الذي تبنيه، كل ما عليك هو تسجيلهم في الملف providers.php الموجود في مجلد bootstrap أو إستخدام AppServiceProvider الموجود بشكل إفتراضي المفهوم نفسه لم يتغير سواء في لارافيل 11 أو الإصدارات التي قبله، ما تغير هو فقط مكان تسجيل مزودي الخدمات الخاصة بالحزم أو تلك التي تُنشؤها بنفسك، سابقاً كان في ملف app.php بمجلد config و الآن أصبح يتم من خلال الملف providers.php الموجود في مجلد bootstrap. بالنسبة للحزم التي تقوم بتثبيتها يُفترض أن عملية التسجيل ستتم بشكل تلقائي أما إذا أنشأت مزود خدمة بنفسك فستسجله بنفسك وذلك فقط بإضافته إلى المصفوفة في الملف. ستجد في المساهمة التالية مثال عن الإستخدام لإنشاء نظام صلاحيات و أدوار:
- 4 اجابة
-
- 1
-
الطبقات الوسيطة التي ذكرتها (auth و geust) لا يتم إنشاؤها مع الحزمة Breeze فهي لا علاقة لها بالحزمة بشكل خاص وإنما تأتي مع إطار العمل نفسه و Breeze يستعملها عند تعريف المسارات الخاصة بعملية المصادقة والتسجيل وغيرها، كما هو الحال طبعاً مع Jetstream و Fortify ... الطبقة الوسيطة guest عملها هو عدم السماح للمستخدم المصادق عليه بالوصول إلى مسارات الزوار أو بشكل أدق المسارات المطبق عليها هذه الطبقة وأذكر هنا مسار تسجيل الدخول و مسار تسجيل مستخدم جديد على سبيل المثال. (يعني لو مستخدم x سجل دخوله في التطبيق وحاول تعديل الرابط لزيارة صفحة تسجيل الدخول لن يتمكن من الوصول لها بل سيتم إعادة توجيهه إلى صفحة dashboard نفس الأمر بالنسبة لبقية المسارات المطبق عليها هذه الطبقة). الطبقة الوسيطة auth تعمل عكس guest فهي تحمي مسارات المستخدم من الوصول من طرف الزوار، يعني لو زائر قام بتوجيه الطلب مباشرة إلى مسار dashboard على سبيل المثال من دون تسجيل الدخول هذه الطبقة ستُعيد توجيهه إلى مسار تسجيل الدخول ولن تسمح له بهذا الشيء. في غالب الأحيان لا نحتاج التعديل على هذا السلوك و إنما إذا احتجنا إلى التعديل سيكون في الأغلب المسار الذي نريد توجيه المستخدم أو الزائر له، يعني لو الحالة هي أننا نريد توجيه المستخدم المصادق عليه إذا أراد الوصول إلى مسارات guest إلى مسار غير dashboard فيمكن ذلك ببساطة عبر التابع boot في الصنف AppServiceProvider بالشكل التالي: use Illuminate\Auth\Middleware\RedirectIfAuthenticated; // in boot method RedirectIfAuthenticated::redirectUsing(fn($request) => route('my-space')); و تُحدد المسار الذي تريد، وإن كان لديك منطق معقد لتحديد مسار التوجيه يُمكنك من خلال تغيير الدالة السهمية إلى دالة مجهولة عادية وتنفيذ المنطق ثم إرجاع المسار use Illuminate\Auth\Middleware\RedirectIfAuthenticated; // in boot method RedirectIfAuthenticated::redirectUsing(function($request) { // do what you want return route('my-space'); }); بهذا الشكل إذا أراد مستخدم مصادق عليه الوصول إلى login مثلاً سيتم توجيهه إلى مسار my-space وليس الإفتراضي (dashboard)، بطبيعة الحال يجب تعريف هذا المسار وإلا سيعطيك خطأ أن المسار غير معرف. وهكذا نفس الأمر بخصوص الطبقة auth. أيضاً يُمكن تحقيق ما تم ذكره أعلاه من خلال التعديل في الملف app.php الموجود في مجلد bootstrap من خلال التابع withMiddleware عبر إستعمال التوابع redirectTo و redirectUsersTo و redirectGuestsTo على حسب الحالة، في الأسفل بعض الأمثلة: ->withMiddleware(function (Middleware $middleware) { // $middleware->redirectTo('/', '/my-space'); // $middleware->redirectUsersTo('/my-space'); // $middleware->redirectGuestsTo('/'); // $middleware->redirectUsersTo(fn ($request) => route('my-space')); }) أما إن كان لابد من تعديل الصنف الإفتراضي وتخصيصه بالشكل الذي ترغب فعليك إنشاء صنف Middleware مثلاً: pa make:middleware RedirectIfAuthenticated ثم عمل override للصنف الإفتراضي وذلك من خلال تسجيلها بنفس الإسم: ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ]); }) بعد ذلك تستطيع التعديل على الصنف الذي أنشأته بالشكل الذي تريد، كما يُمكنك عمل extends للصنف الإفتراضي وتخصيص الجزء الذي تريد فقط: <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class RedirectIfAuthenticated extends \Illuminate\Auth\Middleware\RedirectIfAuthenticated { protected function redirectTo(Request $request): ?string { return route('my-space'); } }
- 2 اجابة
-
- 1
-
لاحظ أنه لديك في ملف web.php : Auth::routes(); Auth::routes(); Auth::routes(['register' => false]); تحتاج حذف السطرين: Auth::routes(); Auth::routes(); و الإبقاء على آخر سطر فقط. كما أن المسار: Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); مكرر مرتين، تحتاج فقط إلى تسجيل المسار مرة واحدة.
-
موضوع التعلم وطريقة التعلم المناسبة لك بالإضافة لمتابعة الدروس و كم الوقت الذي تحتاجه في اليوم للتعلم يعتمد عليك وحدك و على الطريقة التي ترتاح لها فكل شخص و طبيعته البعض يحب تدوين المعلومات المهمة التي يشرحها المدرب أو المحاضر في الدروس بدفتر و يُنظمها بشكل يُسهل عليه فيما بعد مراجعة تلك المعلومات بسرعة يُمكنك إتباعها إن كنت ترتاح لها. ستجد في المساهمة التالية بعض النصائح ستساعدك في هذا الأمر: لكن أهم شيء هو فهم الدروس أولاً والتطبيق عليها ثانياً، سواء مع المدرب أو وحدك كتطبيق تمارين لزيادة وترسيخ الفهم في المسارات النظرية، أما المسارات التطبيقية فهي مسارات لبناء منتج متكامل والتطبيق عليها يتم بإستمرار مع المدرب ويجب الإحتفاظ بالملفات لتقديمها عند طلب الإمتحان: شروط التقدم للامتحان، أيضا أكاديمية حسوب توفر مجموعة من المدربين للإجابة على إستفسارات الطلاب ومساعدتهم فحاول قدر المستطاع الإستفادة من هذا الأمر، من خلال قسم الأسئلة و الأجوبة العام بطرح أسئلة لا تتعلق بمحتوى الدورة، أو من خلال صندوق التعليقات أسفل الدروس بطرح أسئلة تتعلق بالدروس لطلب شرح جزئية معينة أو مساعدة في تجاوز مشكلة ما.
- 3 اجابة
-
- 1
-
بإمكانك إستخدام برنامج Virt Manager فهو برنامج مفتوح المصدر و متاح للتحميل على مستودعات معظم التوزيعات فقط إستخدم مدير الحزم الخاص بالتوزيعة التي تستعملها لتثبيته. (رابط مستودع: virt-manager github repo )، البرنامج يُعتبر أفضل من ناحية الأداء. تأكد أن معالج جهازك يدعم خاصية Virtualization عبر تنفيذ الأمر: lscpu | grep Virtualization للتثبيت على توزيعة فيدورا مثلاً: sudo dnf install virt-manager qemu-kvm libvirt virt-viewer virt-install python3-libguestfs virt-top bridge-utils guestfs-tools libguestfs-tools libvirt-devel بعد تثبيت الحزم تأكد من إضافة المستخدم الخاص بك إلى المجموعات kvm و libvirt عبر تنفيذ الأمر: sudo usermod -aG kvm,libvirt $USER أخيرا قم بإعادة تشغيل الجهاز و سيصبح البرنامج جاهز للإستعمال.
-
نتأسف على التأخر في الرد، لكن يبدو من خلال الصور التي أرفقتها أنه لا يوجد أخطاء في الكود، يبدو فقط أنك تكتب في ملف database آخر إسمه power بدون لاحقة و تفتح ملف power.db حاول فقط تعديل السطر 3 إلى: let db = new sqlite3.Database('power.db', function(err) { ثم أغلق برنامج DB Browser، ثم أعد تنفيذ الملف: node powerjs.js بعد ذلك أعد تشغيل برنامج DB Browser ثم فتح ملف قاعدة البيانات power.db يُفترض أن تجد الجداول التي أنشأتها.
- 3 اجابة
-
- 1
-
المشكلة هنا بسبب أنك لم تضبط إعدادات البريد الإلكتروني، فعند تسجيل الدخول نستخدم ميزة التحقق من امتلاك الشخص الذي أنشأ الحساب لعنوان البريد الإلكتروني الذي أدخله، يمكنك تعطيل الميزة أو التعديل على ملف env بوضع إعدادات صحيحة. يُمكنك مثلاً إستخدام log: MAIL_MAILER=log وتعطيل باقي إعدادات البريد، في هذه الحالة عند إنشاء حساب سيتم إرسال رسالة التحقق إلى ملف laravel.log الموجود في المسار: storage\logs\laravel.log بعدها نسخ الرابط المُرسل هناك وفتحه على المتصفح ليتم تفعيل الحساب. بإمكانك أيضاً إستخدام أحد الخدمات مثل mailtrap بعد إنشاء حساب يمكنك ربط صندوق البريد الخاص بالحساب الذي أنشأته بالتطبيق الخاص بك عبر الإعدادات المتاحة في الحساب و الخدمة تتكامل مع عدة تقنيات ليس لارافيل فحسب.
- 4 اجابة
-
- 1
-
المشروع يستعمل في ملف AuthServiceProvider.php الجدول permissions لإنشاء بعض البوابات (Gates) لتعريف التصريح لبعض العمليات ('edit-post', 'delete-post', 'add-post') لذلك ستحتاج مبدئياً إلى فتح الملف و تعطيل الأسطر: Permission::whereIn('name', ['edit-post', 'delete-post', 'add-post'])->get()->map(function($per) { Gate::define($per->name, function($user, $post) use ($per) { return $user->hasAllow($per->name) && ($user->id == $post->user_id || $user->isAdmin()); }); }); Permission::whereIn('name', ['edit-user', 'delete-user', 'add-user'])->get()->map(function($per) { Gate::define($per->name, function($user) use ($per) { return $user->hasAllow($per->name) && $user->isAdmin(); }); }); أي تعليقها: /* Permission::whereIn('name', ['edit-post', 'delete-post', 'add-post'])->get()->map(function($per) { Gate::define($per->name, function($user, $post) use ($per) { return $user->hasAllow($per->name) && ($user->id == $post->user_id || $user->isAdmin()); }); }); Permission::whereIn('name', ['edit-user', 'delete-user', 'add-user'])->get()->map(function($per) { Gate::define($per->name, function($user) use ($per) { return $user->hasAllow($per->name) && $user->isAdmin(); }); }); */ ثم إكمال عملية تهيئة المشروع: php artisan key:generate إنشاء قاعدة بيانات ثم ربط معلومات الإتصال بها في الملف env. بعد ذلك تنفيذ أمر التهجير و البذر: php artisan migrate:fresh --seed يمكنك بعد ذلك الرجوع إلى الملف السابق وإزالة التعليق من الأسطر السابقة. و أخيراً تشغيل المشروع
-
إن كان المشروع قيد الإطلاق، يٌفضل أخذ نُسخ إحتياطية لقاعدة البيانات بشكل دوري، حتى يتم الرجوع لها عند الحاجة أو في حالة حدوث مشكلة ما. يمكنك الإستفادةمن هذه المساهمة لتحقيق ذلك: أيضاً إن كان المشروع قيد الإطلاق يُفضل العمل على نُسخة تجريبية بعيداً عن النُسخة الأساسية للمشروع، وعدم إيداع التعديلات الجديدة إلا عند التأكد من عملها بشكل سليم. لإضافة حقل جديد في جدول به بيانات يُمكنك إضافة الحقل بشكل يدوي من خلال البرنامج التفاعلي لإدارة قواعد البيانات الذي يتم إستخدامه أو عبر سطر الأوامر، أو يمكنك ذلك من خلال إضافة ملف تهجير جديد يقوم بهذه العملية ثم تنفيذ عملية التهجير و الشرح موجود في هذه المساهمة:
-
الخطأ بسيط ورسالة الخطأ توضح أنك قمت بفتح قوس معقوف { في السطر 72 أي: if(isset($_POST['login'])){ لكنك لم تقم بإغلاقه بعدها، فمفسر اللغة لم يجد قوس الإغلاق فأعطى الخطأ. يُفترض منك إضافة القوس في الأخير: if(isset($_POST['login'])){ } حاول دائما إحترام المسافة البادئة في الكتل البرمجية قبل سطر الكود لتجنب الوقوع في هذه المشاكل كما هو موضح في الصورة:
-
المشكلة غير واضحة، فالصورة التي أرفقتها لم تظهر، يمكنك إعادة طرح الإستفسار بتفاصيل أكثر و إن أمكن رفع الملفات حتى نستطيع المساعدة بشكل أفضل.