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

سمير عبود

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

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

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

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

    34

كل منشورات العضو سمير عبود

  1. هناك عدة أخطاء حيث أن projects هو عبارة عن مُتغير يتم تمريره من المتحكم: $projects = auth()->user()->projects; في الأخير أنت تنادي على العلاقة projects لكن في النموذج User قمت بتسمية العلاقة ب project لذلك يجب تصحيح ذلك لتُصبح العلاقة: public function projects() { return $this->hasMany(Project::class); } أنت لا تقوم بتحديد ماهو المفتاح الثانوي في العلاقة لذلك يجب أن تحترم العُرف و تقوم بتسميته user_id و ليس users_id و في هذه الحالة لديك طريقتين: تغيير users_id إلى user_id في كل من ملف التهجير: $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); تنفيذ أمر التهجير: php artisan migrate:fresh ثم تغيير الحقل من users_id إلى user_id في مصفوفة fillable في النموذج Project ثم تغيير التابع store في المتحكم ProjectController ليُصبح: <?php public function store(Request $request) { $data = request()->validate([ "title" => 'required', "description" => 'required', ]); $data['user_id'] = auth()->id(); Project::create($data); return redirect('/projects'); } و بهذا الشكل ستعمل. الطريقة الثانية بترك الحقل كما تريد users_id لكن تحتاج إلى تغيير العلاقة بحيث تُحدد المفتاح الثانوي بهذا الشكل: public function projects() { return $this->hasMany(Project::class, 'users_id'); } و بطبيعة الحال تجعل الدالة store بالشكل التالي: <?php public function store(Request $request) { $data = request()->validate([ "title" => 'required', "description" => 'required', ]); $data['users_id'] = auth()->id(); Project::create($data); return redirect('/projects'); }
  2. طريقة الإقتطاع كالتالي: x[start:stop:step] # start: فهرس البداية للشريحة ، سيتضمن العنصر في هذا الفهرس و إفتراضياً يكون 0 أي الفهرس الأول # stop: فهرس النهاية للشريحة ، لا يشمل العنصر في هذا الفهرس # step: المقدار الذي يزداد به المؤشر ، يتم تعيينه افتراضيًا على 1. إذا كان سالبًا ، فأنت تقوم بتقسيم العنصر القابل للتكرار في الاتجاه المعاكس. مثلا: x = [1,2,3,4,3,2,3,4] print(x[1:3]) # [2, 3] print(x[-1]) # آخر عنصر في القائمة 4 print(x[-2]) # العُنصر ما قبل الأخير في القائمة 3 print(x[-2:]) # آخر عنصرين في القائمة print(x[:-2]) # كل العناصر ماعدا آخر عنصرين
  3. لقد قمت بفتح ملفات مشروعك و لم أجد في صفحة المسارات إلا التالي: Route::get('/', function () { return view('welcome'); }); //Route::get('posts/craete', function () { // return view('posts.craete'); //}); Route::get('/', function () { return view('welcome'); }); فكما تلاحظ يوجد فقط مسار مكرر للصفحة الرئيسية و مسار آخر تم تعليقه و بالتالي لن يعمل هذا المسار. إذا كنت تريد أن يعمل ذلك المسار قم بحذف التعليق و أجعله: Route::get('posts/create', function () { return view('posts.create'); }); لأنه لديك خطأ في كتابة الكلمة create. ثم قم بالذهاب إلى الرابط: posts/create إذا ظهرت معك الصفحة 404 عليك تنفيذ الأمر: php artisan route:clear لحذف الكاش الخاص بالمسارات. أو تنفيذ الأمر: php artisan optimize:clear لحذف كل الكاش. و في هذه الحالة إذا ذهبت إلى الرابط posts/create سيظهر معك الخطأ: View [posts.create] not found. أي أن صفحة العرض غير موجودة و بالتالي عليك إنشاؤها بنفس الإسم create.blade.php بداخل مجلد posts و الذي بدوره يكون داخل مجلد views.
  4. يُمكنك عمل ذلك بإستخدام الطريقة التالية: $users = User::withCount(['articles as article_max_price' => function ($query) { $query->selectRaw('max(price)')->where('active', true); }])->get(); كما يُمكنك أيضاً تمرير مصفوفة للتابع withMax بحيث تستطيع عمل التالي للحصول على ما تريد: $users = User::withMax(['articles' => function ($query) { $query->where('active', true); }], 'price')->get();
  5. نعم يُمكنك تعلم البرمجة مادامت لديك الرغبة و الإرادة في التعلم تحتاج فقط إلى بعض الأبجديات في الرياضيات كالأولوية و العمليات الرياضية و المنطقية ... مجال البرمجة مفيد جدا لأنها ستجعل تفكيرك يتطور و ستُساعدك في حل المشاكل و العراقيل التي تواجهك و كبداية أنصحك بالإطلاع على هذا المقال المُقدم من أكاديمة حسوب الذي سيرشدك و سيُوضح لك الطريق في بداية التعلم: بالتوفيق.
  6. بعد تثبيت الحزمة في مشروعك عن طريق الأمر: composer require laravel/horizon ثم تنفيذ أمر: php artisan horizon:install الذي سيقوم بتثبيت Horizon و نشر و تسجيل مزود الخدمة App\Providers\HorizonServiceProvider بالإضافة إلى نشر ملف الإعدادات config/horizon.php أين ستجد قائمة الإعدادات بالخيارات التي تريدها، إن لم تكن هذه القائمة كافية لك يُمكنك الذهاب إلى المصدر على مُستودع الحزمة في ملف SupervisorOptions.php من هنا أين ستجد كافة الإعدادات على شكل خصائص للكلاس SupervisorOptions.
  7. سبب الخطأ يتضح من خلال الرسالة أنه لم يجد الملف profitCalculation.php في المسار الذي كتبته: app/Helpers/Dashbaord/profitCalculation.php لاحظ كتابتك للكلمة Dashboard تأكد أن المُجلد إسمه Dashbaord و ليس Dashboard أعتقد أن هذا هو السبب و بالتالي يُصبح: "autoload": { "files": [ "app/Helpers/Dashboard/profitCalculation.php" ] } و تأكد من المسار بشكل كامل و أنك لا تُخطئ في شيء آخر ثم أعد تنفيذ الأمر: composer dump-autoload
  8. من المفروض أن تعمل الطريقة الموجودة في توثيق: 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
  9. يُمكنك إعادة صياغة الكود بأحد الطرق التالية: <?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]));
  10. إن كنت تريد إضافة ملف تنسيقات في صفحة القالب تُضيف الملف بشكل عادي: <!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
  11. إضافة إلى ما تم ذكره في التعليقات أعلاه، دوال _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! }
  12. بشكل افتراضي ، سيتحقق 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
  13. يمكنك استخدام 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) => { });
  14. يساعدك Forge على بناء وإدارة الخوادم بجميع البرامج الضرورية التي تتطلبها معظم تطبيقات Laravel (خادم الويب ، قاعدة البيانات ، redis ، إلخ). يحتوي على ميزة نشر أساسية ، ولكن سيكون هناك بعض الوقت الضائع عند دفع خصائص جديدة إلى التطبيق الذي يكون في مرحلة الإنتاج الخاص بك. يمكن أن تتراوح المدة من بضع ثوانٍ إلى دقائق ، حسب حجم التطبيق الخاص بك. Envoyer هي أداة لا تسمح بأي توقف عند النشر. لا يقتصر الأمر على تطبيقات Laravel فقط لديهم ميزات تتكامل بشكل جيد مع بعضها البعض ، لكن كلاهما غير مطلوب. بالنسبة إلى أي تطبيقات "حقيقية" لها مستخدمون فعليون ، قم بإستخدام Envoyer. و لأية مشاريع تجريبية ، استخدم Forge.
  15. بإمكانك مسح ملفات التخزين المؤقت الخاصة بصفحات العرض عن طريق تنفيذ الأمر: php artisan view:clear أما إن كنت تريد مسح كافة ملفات التخزين المؤقت: php artisan optimize:clear
  16. السبب في هذه المشكلة أنك خالفت العُرف في تعريفك للمفاتيح الثانوية فلا يوجد مفتاح ثانوي بالإسم 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>
  17. السبب في المُشكلة أن بعض الحزم يجب تحديثها حتى تتوافق مع الإصدار الثامن يُمكنك معرفة ذلك من: 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
  18. يوجد أجوبة لهذا السؤال في هذه المشاركة:
  19. يُمكنك الحصول على أجوبة لسؤالك من خلال هذا السؤال:
  20. 1 * * * * يعني أن الأمر سيعمل في الدقيقة الأولى من كل ساعة ، استخدم: * * * * * لتشغيل الأمر كل دقيقة. إذا كنت تقوم بتشغيل Laravel من حساب cPanel ، فيمكنك محاولة تحديد مسار PHP الكامل كالتالي: * * * * * /usr/local/bin/php /home/webminder/public_html/artisan schedule:run >> /dev/null 2>&1
  21. بما أن الخاصية عملت بشكل جيد عند إستخدام mailtrap، يوجد نُقطة إضافية تأكد من أن كلمة مرور خادم البريد لا تحتوي على رموز # إذا كانت كذلك يُرجى وضع كلمة المرور بين علامتي إقتباس نظرًا لأن كل شيء بعد # سيتم اعتباره تعليقًا ( تم إضافتها بدئًا من لارافيل 5.8) MAIL_PASSWORD="your-pass#if-contains#"
  22. يمكنك تخزينها بنفسك ، بعد مصادقة المستخدم بنجاح و استدعاء رد نداء المصادقة من قبل ال 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(); }); يُمكنك الحصول على معلومات أكثر من خلال التوثيق: استرداد تفاصيل المستخدم
  23. في الملف 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;
  24. إذا كنت تحاول إدراج قيم فارغة في قاعدة البيانات ، فعليك جعل الخانات تقبل ذلك: <?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 سينجح الإختبار.
  25. نعم يُمكنك إستخدام التابع 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,
×
×
  • أضف...