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

Sam Ahw

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

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

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

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

    16

كل منشورات العضو Sam Ahw

  1. يمكنك الفصل بين المتغيّرات في رابط http عن طريق استخدام الرمز & بحيث يسبق أول متغيّر فقط رمز إشارة الاستفهام ؟ وبعدها في حال وجود متغيّرات أخرى يجب أن تضع قبل كل متغيّر الرمز & مثال: http://test.com/?id=123&name=anyname&vriable=vkkllk فيصبح مثالك بالشكل التالي: https://**********/list.php?id=' + widget.id.toString()+ '&state=' + widget.state.toString();
  2. باستخدام Pulk في لارافل يمكنك تنفيذها كالتالي: $sellers = Seller::with('user')->get()->pluck('user.first_name', 'id') ثم المرور على المتغيّر sellers وطباعة الحقول اللازمة منه. وأيضاً يوجد طريقة أخرى عن طريق استخدام join مع pulk: $s = Seller::join('users', 'sellers.user_id', '=', 'users.id') ->pluck('sellers.id', 'users.id') ->all(); عندها سيتم الدمج بين المستخدمين والبائع عن طريق الرقم الفريد المعرّف id. والحصول على مصفوفة بشكل مشابه للتالي: [ 'seller_1' => 'user_1', 'seller_2' => 'user_2', 'seller_3' => 'user_3', .... ]; كما ويمكنك بشكل مباشر تعريف العلاقة بداخل المودل: Class Seller extends Model { ... public function user() { return $this->hasOne(user::class, 'id') ->select('id', 'first_name'); } } ويمكنك تغيير نوع العلاقة إلى hasMany أو النوع الذي يناسب مشروعك
  3. يمكنك إزالة التحقق من CSRF في لارافل من خلال طريقتين: لبعض من المسارات routes محددة، يمكنك التوجه إلى App\Http\Middleware\VerifyCsrfToken ، ثم إضافة المسارات إلى except التي ترغب بتجنّب التحقق من csrf فيها كالتالي: $except = ['/test','/hello'] وأيضاً يمكنك إيقاف عمله بشكل كلي في كل المشروع من خلال app/http/Kernel.php عن طريق تعليق السطر التالي: // \App\Http\Middleware\VerifyCsrfToken::class, ويوجد أيضاً طريقة أخرى عن طريق السماح لكل المسارات بالدخول دون التحقق من csrf أيضاً من خلال \App\Http\Middleware\VerifyCsrfToken.php كالتالي: protected $except = [ '*', ]; ولكن ينصح بعدم إلغاء csrf كونها ميزة هامة من المزايا التي تقدمها لارافل فيما يخص الحماية وأمن التطبيقات. وإلغائها قد يسمح بالخروقات الأمنية للمشروع في حال لم يتم معالجة ذلك بطريقة أخرى.
  4. إن عدد المكتبات له تأثير على أداء المشروع ولكن لا يتم احتسابها بهذه الطريقة، فعند ربط مكتبة معيّنة أنت تقوم باستخدام صفوف من هذه المكتبة وبالتالي ليس بالضرورة تحميل كامل المكتبة واستخدامها في JVM. وإن العدد الكبير للمكتبات يمكن أن يؤثر على المشروع ولكن بفوارق بسيطة وحسب عدّة متغيرات منها الشيفرة المصدرية للمكتبة وأدائها بشكل مستقل وأيضاً في المشاريع الكبيرة والتي تعتمد على عدد كبير من المكتبات يتم اختبار تنفيذ عملية ما على عدة مكاتب والتي بدورها توفر نفس الوظيفة ليتم بعدها اختيار المكتبة الأنسب للمشروع والتي تنفّذ المطلوب بأداء أفضل. ولكن معظم المكاتب المعتمدة من قبل الجافا هي مكاتب تم اختبارها لتحقق أفضل أداء وفعالية عند استخدامها في المشاريع ولذلك قد لا تؤثر على مشروعك بشكل ملحوظ وخاصة عند استخدام صفوف معيّنة منها. مثال على ذلك، إن استخدام التالي: import java.util.*; يختلف عن استخدام صف معيّن: import java.util.Set; وبالمجمل قد تؤثر على أداء compiler ولكن ليس لها تأثير ملحوظ كما ذكرت سابقاً على أداء البرنامج أثناء التشغيل run-time
  5. إن معظم الاستخدامات تبيّن فقط البرمجة من طرف React لأنه البرمجة الخلفية أو من (جهة الخادم) مختلفة تماماً عن React حتى ولو كانت بنفس لغة البرمجة مثل الجافاسكريبت في Node JS. ولكن بالإجابة على سؤالك بالطبع يمكنك وضع مجلّدين ضمن مشروعك الأول يحوي تطبيق React والثاني يحوي الملفات اللازمة لعمل الخادم بشكل منفصل واستضافتهم معاً وعندها سيقوم الخادم بتزويد الملفات الثابتة التابعة لتطبيق React وبعدها سيتم التنقل بين الصفحات عبر التطبيق React دون العودة إلى الخادم إلا عند الحاجة لجلب البيانات اللازمة أو المعالجة المطلوبة للطلبات، مثال: // server/index.js const path = require('path'); const express = require('express'); ... // سيقوم هنا الخادم بتزويدنا بالملفات الثابتة ضمن التطبيق والموجودة ضمن مجلد منفصل app.use(express.static(path.resolve(__dirname, '../client/build'))); // وبنفس الوقت يتلفى الطلبات القادمة إليه لمعالجتها والتعامل مع قواعد البيانات app.get("/api", (req, res) => { res.json({ message: "Hello from server!" }); }); // 404 وأيضاً هذه الإضافة مهمة لأنها ستعيد جميع الطلبات الغير موجودة ضمن الخادم ليقوم التطبيق بمعالجتها مثل صفحة app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, '../client/build', 'index.html')); }); ولكن يجب عليك الانتباه لنوع الاستضافة أن تكون تدعم node js وكذلك عليك استخدام الطريقة المناسبة لتشغيل الملف الأساسي لعمل الخادم مثل pm2 وغيرها.
  6. باستخدام التعليمة setenforce 0 يتم إيقاف selinux وتسمح بدورها بالكتابة ولكن ذلك يقوم بإيقاف الحماية اللازمة على الخادم، يجب إعادة تشغيل SELinux مجدداً باستخدام الأمر: setenfroce 1. ثم عن طريق SELinux سيتم السماح بالكتابة على الملفات من جديد باستخدام الأمر التالي: chcon -R -t httpd_sys_rw_content_t storage من الحلول الأخرى تطبيق الأوامر التالية على المجلّد الرئيسي لمشروع لارافل في SElinux: sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/site/laravel/storage(/.*)?" sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/site/laravel/bootstrap/cache(/.*)?" ومن الممكن أيضاً أن تحتاج في بعض الأحيان إلى تطبيق سماحيات الوصول على ملف config: sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/site/laravel/config(/.*)?" وبعدها يجب أن نقوم بالتحديث على مجلد المشروع لإجراء التغييرات: restorecon -Rv /var/www/myProject
  7. غير واضح في السؤال ماهي لغة البرمجة التي يتم استعمالها، فيختلف تعريف المتغيّرات من لغة لأخرى، ففي بعض اللغات يجب ذكر نوع البيانات التي سيتم تخزينها في المتغيّر مثال لغة الجافا: String name = "myName"; وفي لغات أخرى يتم فقط وضع القيمة بشكل مباشر ضمن المتغيّر دون الحاجة لذكر نوع البيانات، مثال في الجافاسكريبت: var name = "myName"; --> (string) وأيضاً في بايثون: name = "Hello" عموماً، طريقة تعريف المتغيّر المذكورة في السؤال ليست خاطئة، ولكن قد تختلف من لغة برمجة لأخرى.
  8. أولاً يجب إنشاء mock للمستخدم واستدعائه على Socialite: $abstractUser = Mockery::mock('Laravel\Socialite\Two\User') ثم يمكن إضافة القيم المتوقع الحصول عليها من التجربة: $abstractUser ->shouldReceive('getId') ->andReturn(rand()) ->shouldReceive('getName') ->andReturn(str_random(10)) ->shouldReceive('getEmail') ->andReturn(str_random(10) . '@gmail.com') ->shouldReceive('getAvatar') ->andReturn('https://en.gravatar.com/userimage'); ........ وبعدها، يجب استخدام shouldReceive لقيم المستخدم بالشكل التالي: Socialite::shouldReceive('driver->user')->andReturn($abstractUser); وأخيراً يمكننا تنفيذ هذا الإجراء كالتالي: $this->visit('/auth/github/callback') ->seePageIs('/') ومن الممكن أيضاً دمج آلية الاختبار ضمن كتلة واحدة بالشكل التالي: $provider = Mockery::mock('Laravel\Socialite\Contracts\Provider'); $provider->shouldReceive('redirect')->andReturn('Redirected'); $providerName = class_basename($provider); //استدعاء المودل $socialAccount = factory('test\User')->create(['provider' => $providerName]); $abstractUser = Mockery::mock('Laravel\Socialite\Two\User'); // الحصول على المستخدم من API $abstractUser->shouldReceive('getId') ->andReturn($socialAccount->provider_user_id) ->shouldReceive('getEmail') ->andReturn(str_random(10).'@gmail.com') ->shouldReceive('getNickname') ->andReturn('Laztopaz') ->shouldReceive('getAvatar') ->andReturn('https://en.gravatar.com/userimage'); $provider = Mockery::mock('Laravel\Socialite\Contracts\Provider'); $provider->shouldReceive('user')->andReturn($abstractUser); Socialite::shouldReceive('driver')->with('github')->andReturn($provider); // بعد التحقق والتوثيق من المستخدم سيتم إعادة التوجيه $this->visit('/auth/facebook/callback') // زيارة الصفحة بعد تسجيل الدخول للمستخدم ->seePageIs('/'); ويجب أيضاً تضمين الصف use Laravel\Socialite\Facades\Socialite عند استخدامه في الملف المطلوب.
  9. من الممكن ظهور هذه الأخطاء عند التعامل مع github أو عند تحديث إصدارات لارافيل، فيحدث تضارب مع النسخ المستخدمة في المكتبات ضمن المشروع. من الممكن حل هذه الأخطاء عن طريق التأكد من الإصدارات التموافقة مع الإضافات المستخدمة وبأنها معرّفة بشكل جيّد ضمن المسار config/app.php: 'providers' => [ .. AnyProvider\Support\Laravel\AnyServiceProvider::class, 'aliases' => [ .. 'AnyProvider' => AnyProvider\Support\Laravel\Facade::class, وضمن الملف composer.json في Envoyer بأن المكتبات مضمّنة في كل من require و require-dev في حال بيئة التطوير. والمكان الأخير هو app/Providers/AppServiceProvider.php، يجب أيضاً تسجيل أي serviceProvider في حال احتاج ذلك: public function boot() { $env = config('app.env'); if ($env === 'local' || $env === 'testing') { .. dev only libraries $this->app->register(\AnyProvider\Iseed\AnyProvider::class); } } وبعدها يمكن إجراء الأوامر التالية للتأكد من إجراء التحديثات اللازمة: rm -rf bootstrap composer dump-autoload ولكن بعد تنفيذ هذه الأوامر يجب إجراء git revert لإعادة الملفات bootstrap الموجودة بين ملفات المشروع في github
  10. لإزالة token الخاص بمستخدم محدد، يمكنك الاستعلام عن طريق الرقم الفريد المعرف لهذا المستخدم: Auth::user()->tokens()->where('id', $id)->delete(); ثم يجب عليك تحديد المستخدم عند استقبال الطلب، ويمكنك تنفيذ ذلك بحيث يصبح الكود كالتالي: // الحصول على المستخدم الذي يرغب بتسجيل الخروج من الموقع $user = request()->user(); //or Auth::user() // حذف token $user->tokens()->where('id', $user->currentAccessToken()->id)->delete(); ويمكنك أيضاً بشكل مختصر ومباشر استخدام currentAccessToken كالتالي: $request->user()->currentAccessToken()->delete(); ولكن عندها يجب عليك إضافة HasApiTokens ضمن مودل المستخدم.
  11. في حال قمت بإيقاف موقعك فلا يمكنك تنفيذ أي إجراء آخر، فالذي يحصل تحديداً عند إيقاف الموقع هو إضافة ملف باسم down ضمن المسار: storage/framework. وبالتالي عند تنفيذ الأمر: php artisan up يتم إزالة الملف السابق ويعود الموقع للعمل من جديد. يمكنك بشكل مماثل إنشاء وحذف الملف في المسار التالي بشكل غير مباشر: storage/framework وعند الحاجة لإعادة تشغيل الموقع فقط قم بحذف هذا الملف من جديد. ومن الطرق الأخرى هو إنشاء عنوان IP كاستثناء أثناء إيقاف الموقع، بحيث يبقى باستطاعتك زيارة الموقع وتنفيذ الأوامر: php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16 وفي نسخة لارافيل 8، تم إضافة الخاصية secret بحيث يمكنك تمرير token حتى ولو كان الموقع بحالة maintenance: php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515" وعندها يمكنك زيارة الموقع عن طريق رابط مماثل للتالي: https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
  12. يمكنك الاطلاع على الإجابات المذكورة في هذا السؤال ضمن الأكاديمية:
  13. إن السؤال مكرر ضمن الأكاديمية ويمكنك الاطلاع على الحلول الموجودة هنا:
  14. بعد إجراء الحفظ يمكنك استعادة آخر رقم معرف ID تم إدخاله إلى الجدول في قاعدة البيانات بحيث يكون ترتيب العمليات كالتالي: $data->save(); $data->id; وتستطيع استخدام الآلية بالشكل التالي: return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200); ويمكنك أيضاً عن طريق استخدام Eloquent: DB::Company()->lastInsertId(); كما تتيح لارافيل طريقة مباشرة لاستعادة الرقم المعرّف بعد إدخال سجل محدد إلى قاعدة البيانات بالشكل التالي: $id = DB::table('company')->insertGetId([ 'number' => 'name', 'address' => 'anyaddress' ]); ويمكنك أيضاً تنفيذه بشكل مباشر عن طريق استخدام المودل: $id = Company::insertGetId(["address"=>"anyaddress","number"=>"44444"]);
  15. تظهر هذه المشكلة عادةً نتيجة لخطأ بتعريف المسارات الصحيحة للمشروع. حاول أولاً تنفيذ الأمر التالي: homestead up --provision والتأكد من مسارات الملف، وإلا لن يستطيع لارافيل ربط الملفات إلى المجلد /vagrant. وفي حال كان نظام التشغيل Ubuntu، يمكن أن يتم حل المشكلة عن طريق تعديل الإعدادات الموجوة كالتالي: sudo vi /etc/nginx/sites-enabled/homestead.app وتعديل المسار لتوجيهه إلى المجلّد الجذر root الخاص: root "/Users/MYUSERNAME/myproject/public"; ثم نقوم بإعادة التشغيل كالتالي: sudo service nginx reload
  16. يجب عليك التأكد أولاً من تحميل المكتبة Socialite عن طريق تنفيذ الأمر: composer require laravel/socialite وبعدها في ملف config/services.php نقوم بإضافة بيانات التطبيق في فيسبوك: 'facebook' => [ 'client_id' => env('FACEBOOK_CLIENT_ID'), 'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 'redirect' => env('FACEBOOK_CALLBACK_URL'), ], مع تغيير رابط redirect إلى الرابط الذي سيتم تحويل المستخدم إليه بعد تسجيل الدخول، ويمكننا وضع القيم ضمن .env: FACEBOOK_CLIENT_ID=paste_client_id_here FACEBOOK_CLIENT_SECRET=paste_client_secret_here FACEBOOK_CALLBACK_URL=https://www.example.com/auth/facebook/callback ونتأكد من إضافة مسارات التوجيه الصحيحة: Route::get('auth/facebook/', 'Auth\FacebookController@redirect')->name('auth.facebook'); Route::get('auth/facebook/callback', 'Auth\FacebookController@callback')->name('auth.facebook.callback'); وأخيراً في المتحكم الخاص نقوم باستدعائها عن طريق Socialite::driver('facebook')->user() وتنفيذ باقي العمليات الخاصة بك لمعالجة عملية تسجيل الدخول والتعامل مع قاعدة البيانات وجدول المستخدمين بالشكل التالي: <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\User; use Socialite; class FacebookController extends Controller { /** * Create a new controller instance. * * @return void */ public function redirect() { return Socialite::driver('facebook')->redirect(); } /** * Create a new controller instance. * * @return void */ public function callback(Request $request) { try { $facebookAccount = Socialite::driver('facebook')->user(); // نضع هنا عمليات تسجيل الدخول أو التعامل مع قاعدة البيانات return redirect()->route('your.route.name'); } catch (Exception $e) { return redirect()->route('auth.facebook'); } } } وفي حال بقي ظهور الخطأ: "Invalid Argument Exception" يجب عليك التأكد من تفعيل Status: Live للتطبيق ضمن حساب المطورين في فيسبوك.
  17. في نسخة لارافل 8 في حال كنت تستخدم النسخة laravel-mix 6 فيوجد فيها إعدادات مختلفة ضمن webpack.mix.js فيجب إضافة .vue() على الملفات التي يتم الإشارة إليها كالتالي: const mix = require('laravel-mix'); /* |-------------------------------------------------------------------------- | Mix Asset Management |-------------------------------------------------------------------------- | | Mix provides a clean, fluent API for defining some Webpack build steps | for your Laravel applications. By default, we are compiling the CSS | file for the application as well as bundling up all the JS files. | */ 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', [ // ]);
  18. العمليتين load و with متشابهتين وستحصل على نفس النتيجة فلا يوجد فارق بالنتيجة النهائية لكل منها. ولكن الفرق الوحيد هو بترتيب التنفيذ عند استخدامها: فعند استخدام with يتم أولاً تحميل المودل المرتبط عند تهيئة الاستعلام المراد تنفيذه (مثل: all أو first أو find...) $users = User::with('comments')->get(); كأننا نقوم بتنفيذ: select * from `users` select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) أما عند استخدام load يتم أولاً تهيئة الاستعلام والحصول على السجلات، ثم يتم بعدها تحميل سجلات المودل المرتبطة بها. بحيث يتم تقسيمها إلى مرحلتين: $users = User::all(); كأننا نقوم باستعلام عادي select * from `users` ثم يتم تنفيذ: $users = $users->load('comments'); والتي تقوم بدورها بتنفيذ استعلام آخر منفصل select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)
  19. في حال كانت القيم مرتبطة مع بعضها بشكل ما، يمكنك تمريرها ضمن مصفوفة: $data = [ 'var1' => 'somevalue', 'var2' => 4000, 'anyvar3' => 'new-value' ]; return View::make('user')->with($data); أو يمكن تمرير المصفوفة نفسها بشكل مباشر ضمن with: return $view->with('data', ['var1' => $var1, 'people' => $people])); يوجد طريقة أخرى عن طريق استخدام compact: function view($view) { $people = People::where('name', '=', 'Name')->first(); $p2 = People::order_by('list_order', 'ASC')->get(); return $view->with(compact('people', 'p2')); } حيث سيتم دمج المتحولين وإرسالهم ضمن بنفس الرد.
  20. يمكن إضافة الصلاحيات لكل مستخدم ضمن التابع boot في AuthServiceProvider بالشكل التالي: Passport::tokensCan([ 'manage-order' => 'Manage order scope' 'read-only-order' => 'Read only order scope' ]); وضمن مسارات التوجيه نقوم بإضافة guard ضمن الوسيط يتضمن السكوب على حسب الصلاحيات التي يمكن استخدامها من قبل المستخدم: ->middleware(['auth:api', 'scopes:your-scope=key-here']); فتصبح مسارات التوجيه بالشكل التالي: Route::get('/api/orders', 'OrderController@index') ->middleware(['auth:api', 'scopes:manage-order']); Route::post('/api/orders', 'OrderController@store') ->middleware(['auth:api', 'scopes:manage-order']); Route::get('/api/orders/{id}', 'OrderController@show') ->middleware(['auth:api', 'scopes:manage-order, read-only-order']); وللتحقق من صلاحيات المستخدم، يمكننا ضمن المتحكّم الخاص بعملية تسجيل الدخول إضافة التالي: $role = $user->checkRole(); if ($role == 'admin') { $request->request->add([ 'scope' => 'manage-order' // نقوم هنا بإضافة السكوب الخاص بنوع المستخدم ]); } else { $request->request->add([ 'scope' => '.....' ]); } // تحويل الطلب وإضافة token $tokenRequest = Request::create( '/oauth/token', 'post' ); return Route::dispatch($tokenRequest); حيث سيتم التعرّف على صلاحيات المستخدم بعد إنشاء token الخاص به وتمريره مع الطلبات الواردة إلى خادم الويب باستخدام الترويسة Bearer بشكل مشابه للتالي: $response = $client->request('GET', '/api/endpoint', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken, ], ]);
  21. إن Eloquent في لارافيل تقوم تلقائياً بتحويل الأنماط التابعة للـ timestamps أي الحقول: (created_at, updated_at) إلى غرض من نوع carbon، وللسهولة عندما نقوم بإضافة حقل تاريخ جديد نقوم بإضافة السطر التالي ضمن المودل ليتم تحويله من قبل لارافيل بشكل مماثل لباقي حقول التاريخ: protected $dates = ['last_visit']; الآن وبالنسبة للمقارنة فيوجد العديد من عمليات المقارنة التي تقدمها carbon مثل: eq() equals ne() not equals gt() greater than gte() greater than or equals lt() less than lte() less than or equals ويمكننا استخدامها بالشكل التالي مثلاً: if($model->last_visit->gt($model->created_at)){ .... }
  22. يمكنك استدعاء السكوب ضمن الاستعلام مع with بالشكل التالي: $departments = Department::with(['users' => function ($q) { $q->available(); }])->get(); ويمكنك أيضاً بطريقة مماثلة تعريف علاقة: public function usersAvailable() { return $this->hasMany('User')->available(); // أو // return $this->users()->available(); } ثم عند الاستدعاء: //جميع المستخدمين $department->users; // المستخدمين المتاحين $department->usersAvailable; // eager loading $department->with('usersAvailable')->get();
  23. يجب أن تقوم بتمرير المتغيّر أثناء الإشارة إلى المسار بالشكل التالي: <li><a href="{{ route('user.profile', $username) }}">Profile</a></li> والسبب في ذلك هو أنك قمت أثناء تعريف المسار بإضافة متغيّر ضمن الرابط: Route::get('{username}/settings') ولكن عندما يتم الضغط على زر الحساب الشخصي أو غيره لا يتم تمرير قيمة هذا المتغيّر مع الرابط ولذلك يمكن أن يظهر لك الخطأ أو من الممكن ألا يتم التعرّف على المسار في حالات أخرى. وفي حال كنت تريد في حالتك تمرير اسم المستخدم الذي قام بتسجيل الدخول إلى مسار التوجيه ليتم بعدها معالجته في المتحكّم الخاص، يمكنك تنفيذ ذلك كالتالي: <li><a href="{{ route('user.profile', auth()->user()->username) }}">Profile</a></li>
  24. في لارافيل عند التعامل مع الملفات الثابتة static مثل الصور و ملفات التنسيقات CSS وملفات الجافاسكريبت يجب الإشارة لها دوماً عن طريق asset لتجنب ظهور أي مشاكل عند تغيير المسار أو اسم النطاق في المشروع أو عند نشره واستخدام اتصال آمن https، لذلك ربط الملفات ضمن صفحات blade يجب أن يكون كالتالي: لملفات التنسيقات CSS: <link href="{{ asset('css/main.css') }}" rel="stylesheet" type="text/css" > أو <link href="{{ URL::asset('css/main.css') }}" rel="stylesheet" type="text/css" > لملفات الجافاسكريبت: <script type="text/javascript" src="{{ asset('js/custom.js') }}"></script> أو <script type="text/javascript" src="{{ URL::asset('js/custom.js') }}"></script> وللصور: {{ asset('img/photo.jpg'); }} وفي بعض الأحيان قد تظهر لك هذه المشكلة ليس بسبب سوء عملية الربط وإنما بسبب صلاحيات الوصول على المجلّدات الحاوية على هذه الملفات في ويندوز أو نظام التشغيل الذي تقوم باستخدامه، لذلك يمكنك تجربة تشغيل المشروع في لارافيل عن طريق استخدام الأمر التالي: php -S localhost:9000 -t public
  25. يمكنك تحديد النسخة بنفس الأمر عن طريق وضع العلامة : ثم رقم الإصدار، على سبيل المثال في حال أردنا إنشاء مشروع جديد باستخدام نسخة لارافيل 7 نقوم بتنفيذ الأمر بالشكل التالي: composer create-project --prefer-dist laravel/laravel:^7.0 project-name حيث يفيد أيضاً أضافة --prefer-dist لتسريع عملية إنشاء المشروع بحيث يقوم composer بمحاولة تحميل وفك ضغط الملفات من عدة مصادر مثل github إن أمكن أو أي API أخرى وأيضاً ستقوم بالاستغناء عن ملفات مؤرشفة لديك بالفعل بدلاً من تحميل كامل المكتبات من الصفر.
×
×
  • أضف...