-
المساهمات
3552 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
34
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سمير عبود
-
بعد تثبيت الحزمة في مشروعك عن طريق الأمر: composer require laravel/horizon ثم تنفيذ أمر: php artisan horizon:install الذي سيقوم بتثبيت Horizon و نشر و تسجيل مزود الخدمة App\Providers\HorizonServiceProvider بالإضافة إلى نشر ملف الإعدادات config/horizon.php أين ستجد قائمة الإعدادات بالخيارات التي تريدها، إن لم تكن هذه القائمة كافية لك يُمكنك الذهاب إلى المصدر على مُستودع الحزمة في ملف SupervisorOptions.php من هنا أين ستجد كافة الإعدادات على شكل خصائص للكلاس SupervisorOptions.
- 2 اجابة
-
- 1
-
سبب الخطأ يتضح من خلال الرسالة أنه لم يجد الملف profitCalculation.php في المسار الذي كتبته: app/Helpers/Dashbaord/profitCalculation.php لاحظ كتابتك للكلمة Dashboard تأكد أن المُجلد إسمه Dashbaord و ليس Dashboard أعتقد أن هذا هو السبب و بالتالي يُصبح: "autoload": { "files": [ "app/Helpers/Dashboard/profitCalculation.php" ] } و تأكد من المسار بشكل كامل و أنك لا تُخطئ في شيء آخر ثم أعد تنفيذ الأمر: composer dump-autoload
- 3 اجابة
-
- 1
-
من المفروض أن تعمل الطريقة الموجودة في توثيق: Laravel ؛ * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 كما يُمكنك أيضاً إستخدام هذه الطريقة: * * * * * /usr/bin/php /var/www/html/sitename/Live/artisan schedule:run >> /dev/null 2>&1
- 2 اجابة
-
- 1
-
يُمكنك إعادة صياغة الكود بأحد الطرق التالية: <?php $cities = $cities ->sort() ->unique() ->groupBy(function (string $city): string { return strtolower(Str::limit(trim($city),1,'')); }, true); أو: <?php $result = City::pluck('title', 'id') ->sort() ->unique() ->groupBy(function (string $title): string { return strtolower($title[0]); }); // using php short closures $result = City::pluck('title', 'id') ->sort() ->unique() ->groupBy(fn (string $title): string => strtolower($title[0]));
- 1 جواب
-
- 2
-
إن كنت تريد إضافة ملف تنسيقات في صفحة القالب تُضيف الملف بشكل عادي: <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <!-- ... --> <link href="{{asset('dashboard_files/ltr/css/style.css')}}" rel="stylesheet"> <!-- ... --> </head> أما إن كنت تريد إضافة ملف تنسيقات في صفحة عرض غير صفحة القالب فتحتاج إلى إضافة: <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <!-- ... --> <!-- ... --> @stack('css') </head> و في صفحة العرض: @extends('layouts.shop.app') @push('css') <!-- تقوم بإستدعاء التنسيقات التي تحتاجها صفحة العرض هنا --> @endpush كما يُمكنك أيضا إستخدام yield بدل stack و في صفحة العرض تستخدم section بدل push
-
إضافة إلى ما تم ذكره في التعليقات أعلاه، دوال _mysql لم تعد مستخدمة لأن بها العديد من مشاكل الحماية، يٌفضل الإنتقال إلى دوال _mysqli أو إستخدام PDO: مثال عن إستخدام mysqli: <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM users"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 results"; } $conn->close(); ?> مثال عن إستخدام PDO: <?php try { $host = "your_host"; $dbname = "your_database"; $user = "your_user"; $pass = "your_pass"; $dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $category_id = 9; $statement = $dbh->prepare("SELECT * FROM posts WHERE category_id = ?"); $statement->execute([$category_id] ); // get all: $rows = $statement->fetchAll(); } catch(PDOException $e) { echo $e->getMessage(); // handle this better, this is just for the demo! }
-
بشكل افتراضي ، سيتحقق Livewire من صحة جميع عمليات تحميل الملفات المؤقتة بالقواعد التالية: file | max: 12288 إذا كنت ترغب في تخصيص هذا ، يمكنك تهيئة قواعد التحقق التي يجب تشغيلها بالضبط على جميع عمليات تحميل الملفات المؤقتة داخل config / livewire.php: return [ ... 'temporary_file_upload' => [ ... 'rules' => 'file|mimes:png,jpg,pdf|max:102400', // (100MB max, and only pngs, jpegs, and pdfs.) ... ], ]; إذا لم يكن ملف الإعدادات الخاص ب livewire موجود تحتاج إلى نشره عن طريق الأمر: php artisan livewire:publish --config
- 3 اجابة
-
- 2
-
يمكنك استخدام axios.delete بدلاً من axios.post فبدلاً من: deleteRequest: function (id, index) { axios.post('/admin/posts/' + id, { _method: 'DELETE' }) .then((response) => { }).catch((error) => { }); تُصبح: deleteRequest: function (id, index) { axios.delete('/admin/posts/' + id) .then((response) => { }).catch((error) => { });
- 2 اجابة
-
- 1
-
يساعدك Forge على بناء وإدارة الخوادم بجميع البرامج الضرورية التي تتطلبها معظم تطبيقات Laravel (خادم الويب ، قاعدة البيانات ، redis ، إلخ). يحتوي على ميزة نشر أساسية ، ولكن سيكون هناك بعض الوقت الضائع عند دفع خصائص جديدة إلى التطبيق الذي يكون في مرحلة الإنتاج الخاص بك. يمكن أن تتراوح المدة من بضع ثوانٍ إلى دقائق ، حسب حجم التطبيق الخاص بك. Envoyer هي أداة لا تسمح بأي توقف عند النشر. لا يقتصر الأمر على تطبيقات Laravel فقط لديهم ميزات تتكامل بشكل جيد مع بعضها البعض ، لكن كلاهما غير مطلوب. بالنسبة إلى أي تطبيقات "حقيقية" لها مستخدمون فعليون ، قم بإستخدام Envoyer. و لأية مشاريع تجريبية ، استخدم Forge.
- 2 اجابة
-
- 1
-
بإمكانك مسح ملفات التخزين المؤقت الخاصة بصفحات العرض عن طريق تنفيذ الأمر: php artisan view:clear أما إن كنت تريد مسح كافة ملفات التخزين المؤقت: php artisan optimize:clear
- 3 اجابة
-
- 1
-
السبب في هذه المشكلة أنك خالفت العُرف في تعريفك للمفاتيح الثانوية فلا يوجد مفتاح ثانوي بالإسم user_id في جدول المشتريات و بما أنك خالفت العُرف يجب أن تكون صريح بخصوص المفتاح الثانوي عند إنشائك لعلاقة user في النموذج Purshase و بما أن هناك حقلين created_by و updated_by فهناك حالات يكون فيها المُنشئ ليس هو المُعدل و بالتالي يوجد علاقتين بالشكل التالي: public function creator(){ return $this->belongsTo('App\Models\User', 'created_by'); } public function updater(){ return $this->belongsTo('App\Models\User', 'updated_by'); } و في صفحة العرض تقوم بالتالي: <h6><strong>Created By:</strong> {{ $purchase->creator->name }}</h6> <h6><strong>Updated By:</strong> {{ $purchase->updater->name ?? 'لم يتم التعديل' }}</h6>
- 1 جواب
-
- 2
-
السبب في المُشكلة أن بعض الحزم يجب تحديثها حتى تتوافق مع الإصدار الثامن يُمكنك معرفة ذلك من: Updating Dependencies: guzzlehttp/guzzle to ^7.0.1 facade/ignition to ^2.3.6 laravel/framework to ^8.0 laravel/ui to ^3.0 nunomaduro/collision to ^5.0 phpunit/phpunit to ^9.0 Horizon v5.0 Passport v10.0 Socialite v5.0 Telescope v4.0 و من بين الحزم حزمة Passport يجب أن تكون أعلى من 10.0 فقط قم بتغيير إصدار الحزمة إلى الإصدار الذي يتوافق مع الإصدار الثامن للارافل ثم قم بتنفيذ: composer update
- 1 جواب
-
- 2
-
يوجد أجوبة لهذا السؤال في هذه المشاركة:
-
يُمكنك الحصول على أجوبة لسؤالك من خلال هذا السؤال:
-
1 * * * * يعني أن الأمر سيعمل في الدقيقة الأولى من كل ساعة ، استخدم: * * * * * لتشغيل الأمر كل دقيقة. إذا كنت تقوم بتشغيل Laravel من حساب cPanel ، فيمكنك محاولة تحديد مسار PHP الكامل كالتالي: * * * * * /usr/local/bin/php /home/webminder/public_html/artisan schedule:run >> /dev/null 2>&1
- 1 جواب
-
- 1
-
بما أن الخاصية عملت بشكل جيد عند إستخدام mailtrap، يوجد نُقطة إضافية تأكد من أن كلمة مرور خادم البريد لا تحتوي على رموز # إذا كانت كذلك يُرجى وضع كلمة المرور بين علامتي إقتباس نظرًا لأن كل شيء بعد # سيتم اعتباره تعليقًا ( تم إضافتها بدئًا من لارافيل 5.8) MAIL_PASSWORD="your-pass#if-contains#"
- 2 اجابة
-
- 1
-
يمكنك تخزينها بنفسك ، بعد مصادقة المستخدم بنجاح و استدعاء رد نداء المصادقة من قبل ال provider، بمجرد حصولك على نسخة من المستخدم، يمكنك الحصول على بعض التفاصيل حول المستخدم: Route::get('/auth/callback', function () { $user = Socialite::driver('github')->user(); // OAuth 2.0 providers... $token = $user->token; $refreshToken = $user->refreshToken; $expiresIn = $user->expiresIn; // OAuth 1.0 providers... $token = $user->token; $tokenSecret = $user->tokenSecret; // All providers... $user->getId(); $user->getNickname(); $user->getName(); $user->getEmail(); $user->getAvatar(); }); يُمكنك الحصول على معلومات أكثر من خلال التوثيق: استرداد تفاصيل المستخدم
- 1 جواب
-
- 1
-
في الملف Handler الموجود في المسار: App\Exceptions\Handler قم بإضافة التالي للتابع render: if ($exception instanceof NotFoundHttpException) { return redirect('/'); } ليُصبح التابع بالشكل التالي: public function render($request, Exception $exception) { if ($exception instanceof NotFoundHttpException) { return redirect('/'); } return parent::render($request, $exception); } و لا تنسى تضمين الصنف NotFoundHttpException في الأعلى: use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
- 2 اجابة
-
- 1
-
إذا كنت تحاول إدراج قيم فارغة في قاعدة البيانات ، فعليك جعل الخانات تقبل ذلك: <?php Schema::create('accounts', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('email'); $table->text('access_token')->nullable(); $table->timestamp('deleted_at')->nullable(); $table->timestamps(); }); في الواقع ، يجب أن تحصل على أخطاء عند إجراء الاختبار .إذا لم تكن الخانات nullable بهذا الشكل: Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: وحتى تحصل على الخطأ جرب عمل التالي: <?php namespace Tests\Feature; use Tests\TestCase; use App\Models\Account; use Illuminate\Foundation\Testing\RefreshDatabase; class TestingTest extends TestCase { use RefreshDatabase; protected function setUp(): void { parent::setUp(); Account::factory()->count(50)->create(); } /** @test */ public function check_for_collection_test() { dd(Account::all()); // returns Illuminate\Database\Eloquent\Collection; } } إذا لم تكن الخانات nullable سيفشل الإختبار و يُعطي الخطأ أعلاه، أما إذا جعلت الخانات nullable سينجح الإختبار.
- 1 جواب
-
- 1
-
نعم يُمكنك إستخدام التابع insert لعمل تخزين لعدة سجلات لكن يجب أن تكون السجلات على شكل مصفوفة فمثلا هنا: $data = UserSubject::where('user_id', Auth::id())->select('subject_id')->get(); السجلات ستكون على هيئة collection بالتالي يجب عليك تغييرها إلى مصفوفة بإستخدام التابع toArray بهذا الشكل: $data = UserSubject::where('user_id', Auth::id()) ->select('subject_id') ->get() ->toArray(); ثم يُمكنك إستخدام insert: Model::insert($data); // أو DB::table('table_name')->insert($data); و إلا سيُعطيك الخطأ التالي: TypeError: Argument 1 passed to Illuminate\Database\Query\Builder::insert() must be of the type array, object given,
- 2 اجابة
-
- 1
-
بالطبع جواب هذا السؤال يعتمد عليك بالدرجة الأولى فكل إنسان لديه قدرة إستيعاب مُحددة خصوصاً في تعلم أشياء جديدة، لذلك لا تقيس الأمر بعدد الفيديوهات. بما أنه لديك وقت كافي في اليوم فأنصحك بالتعلم في الوقت الذي يكون ذهنك صافي و لديه قابلية لإستقطاب معلومات جديدة. و قم بتنظيم مسار التعلم الخاص بك، يُمكنك مثلا تعلم 4 ساعات يومياً و تُقسمها بالشكل الذي تريده على اليوم و تقوم بممارسة نشاطاتك الأخرى كممارسة رياضة او هواية أخرى تحبها و أهم شيء الإستمرارية في الخطة التي وضعتها لنفسك و الأهم من ذلك لا تُقيد نفسك بتاريخ مُحدد لتعلم شيء، أيضاً أهم شيء في البرمجة هو التطبيق العملي، كلما طبقت أكثر كلما تطور مُستواك. بالتوفيق.
- 2 اجابة
-
- 1
-
ليس عليك مشاهدة دروس أرشيف المسارات الأقدم، لأن هذه المسارات تم تعويضها بمسارات جديدة بإستخدام تقنيات أحدث و مكتبات بإصدارات أحدث كما هو الحال في مسار تطوير المتجر الإلكتروني في المسار القديم كنا نستخدم تقنية gulp بإصدار قديم في عملية أتمتة المهام أما في المسار المُحدث تم إستخدام تقنية webpack ، نفس المُلاحظة بخصوص مسار تطوير واجهة مُستخدم تُشبه موقع يوتيوب و مسار بناء لوحة التحكم، على العموم لست بحاجة لمُتابعة تلك الدروس و إنما يُمكنك الإكتفاء بالمسارات الجديدة فقط و هذا ليس في دورة تطوير واجهات المستخدم فقط و إنما في كل الدورات. و هذا هو الحال في دورات أكاديمية حسوب تُحدث بإستمرار حيث تُضاف مسارات جديدة أو يتم تحديث مسارات كانت موجودة بإستعمال تقنيات حديثة لمُواكبة التطور.
- 2 اجابة
-
- 1
-
هذا يعني أن التطبيق الذي ستبنيه يجب أن يدعم تعدد اللغات و من بين اللغات التي يجب أن يدعمها العربية و الإنجليزية، سيكون من الأفضل تسهيل إضافة أي لغة جديدة للتطبيق الذي ستبنيه بغض النظر عن ماهية التطبيق او التقنيات المستخدمة لبنائه.
-
يحتوي Jetstream على خاصية رفع صور الملف الشخصي مضمنة ويحتوي على الإعدادات الافتراضية المدرجة بالفعل. إذا كنت تريد أن تعمل هذه الخاصية عند التسجيل ، فيمكنك استدعاء الوظيفة المضمنة بعد استدعاء: $this->createTeam($user) أو قبلها مباشرة. ما عليك سوى القيام بذلك بعد إنشاء المستخدم حتى تتمكن من استخدام التابع updateProfilePhoto: return DB::transaction(function () use ($input) { return tap(User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]), function (User $user) { $this->createTeam($user); if (isset($input['image'])) { $user->updateProfilePhoto($input['image']); } }); }); هذه هي الطريقة التي يقوم Fortify بتنفيذها في صنف UpdateUserProfileInformation ، يمكنك إلقاء نظرة على هذا الصنف في app/Actions/Fortify. لا تنسى إضافة جزء التحقق من الصورة في : <?php Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'image' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '', ])->validate(); و إضافة حقل الصورة لإستمارة التسجيل.
- 1 جواب
-
- 1
-
بما أنك تستخدم النسخة 6 من Laravel mix فهناك بعض الإختلافات في ملف الإعدادت و لمعرفة كيفية الترقية لهذا الإصدار تستطيع ذلك من هنا لا داعي لتثبيت مُحمل vue بالرغم من أن الخطأ ينص على ذلك، بدلاً من ذلك تحتاج إلى إخبار mix أن تدعم vue بشكل صريح و يُمكنك ذلك من خلال: mix.js('resources/js/app.js', 'public/js') .vue() .postCss('resources/css/app.css', 'public/css', [ // ]); او الخيار الثاني إذا كنت تريد استخراج التنسيقات أيضًا mix.js('resources/js/app.js', 'public/js') .vue({ extractStyles: true, globalStyles: false }) .postCss('resources/css/app.css', 'public/css', [ // ]);