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

Adnane Kadri

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

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

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

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

    51

كل منشورات العضو Adnane Kadri

  1. يبدوا أن سبب الخطأ كان إما في نسيان إنشاء نوع أو خطأ في تسجيله . فالexception يقول أن العائد من الدالة type داخل ملف ال queries ليس متوافق مع المتوقع فالأرجح هو أن الدالة الاخيرة تقوم باعادة null في حين أنها يجب أن تقوم بارجاع النوع المرادف للQuery التي يتم العمل عليها . فطبقا للتوثيق الرسمي للحزمة على الجيت هب فان انشاءgraphql query يتطلب الخطوات التالية : 1 - أولاً ، تقوم بإنشاء نوع تريد إرجاعه من الاستعلام : <?php namespace App\GraphQL\Types; use App\Item; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Type as GraphQLType; class ItemType extends GraphQLType { protected $attributes = [ 'name' => 'Item', // لاحظ تعريف المودل في النوع 'description' => 'An Item of Graphql Type', 'model' => Item::class, ]; // يتطلب تعريف الحقول في النوع public function fields() { return [ 'id' => [ 'type' => Type::nonNull(Type::int()), 'description' => 'The id of the item' ], ]; } public function resolve($root, $args) { return Item::findOrFail($args['id']); } } 2 - ثم تحتاج الى اضافة النوع المنشئ حديثا و تسجيله . اما باضافته مباشرة الى المخطط الخاص بك schemas : <?php 'schemas' => [ 'default' => [ // ... 'types' => [ App\GraphQL\Types\ItemType::class, ], او اضافته بشكل عام globally في ملف الاعداد graphql.php : <?php .. 'types' => [ App\GraphQL\Types\ItemType::class, ], او باستعمال الواجهة GraphQL : <?php GraphQL::addType(\App\GraphQL\Types\ItemType::class); 3 - الان وبعد اضافة النوع يمكنك انشاء الqueries الخاصة بك والتي تنتمي لهذا النوع على هذا النحو : <?php namespace App\GraphQL\Queries; use Closure; use App\Item; use Rebing\GraphQL\Support\Facades\GraphQL; use GraphQL\Type\Definition\ResolveInfo; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Query; class ItemsQuery extends Query { protected $attributes = [ 'name' => 'items', ]; public function type() // يجب أن تعيد instance من Type المرافق { return Type::nonNull(Type::listOf(Type::nonNull(GraphQL::type('Item')))); } public function args() { return [ 'id' => [ 'name' => 'id', 'type' => Type::int(), 'rules' => ['required'] ], ]; } public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields) { return Item::findOrFail($args['id']); } } 4 - يتبقى فقط تسجيل الQuery المنشئة حديثا بملف الاعداد graphql.php : <?php .. 'schemas' => [ 'default' => [ 'query' => [ App\GraphQL\Queries\ItemsQuery::class ], // ... ] ] و الان المفروض كل شيء سيعمل بشكل سليم .
  2. مرحبا . إن كانت حاجتك لعمل slug فأقترح إستعمال الدالة slug ضمن المساعد Str كالتالي : <?php use Illuminate\Support\Str; $slug = Str::slug('make a good slug', '-'); // make-a-good-slug لكن ان احتجت تعميم العملية على الكثير من الموديلات و الاستفادة من باقي الـأشياء التي تقدمها مكتبة cviebrock/eloquent-sluggable فتأكد أن تستعمل الTrait الصحيح <?php use Cviebrock\EloquentSluggable\Sluggable; .. class myModel extends Model{ use Sluggable; .. } وبدل تعريف الsluggable attributes في attribute يجب عليك استعمال الabstract method التي اسمها sluggable() ضمن الTrait المستعمل , ومن ثم تعريفها بداخلها فيكون : <?php use Cviebrock\EloquentSluggable\Sluggable; class myModel extends Model { use Sluggable; /** * قم بتعريف القيم هنا * * @return array */ public function sluggable() { return [ 'slug' => [ 'slugable_column' => 'title' ] ]; } } و الان قم بتجريب إنشاء item جديد وسيتم حفظ الslug بشكل عادي .
  3. بداية يجب عليك حسم موقفك و توضيح جيدا لما قد تريد الإنتقال من لغة برمجية إلى أخرى , و لا يكفي هذا أيضا بل ويجب التحقق إن كانت هاته الأسباب بالفعل تدفعك إلى التخلي عن اللغة التي قد تعلمتها و تعلم أخرى جديدة . و شيء جميل أنك قد اوضحت هدفك من الانتقال من الـ php , لكن لا أرى أنها بأسباب فعلية و لنأخذ على سبيل المثال إطار العمل الغني عن التعريف Laravel و لنسقط عليه هاته الأسباب . - فلو كنت تريد تطبيقات متزامنة فإطار العمل هذا يمتلك الكثير من الأشياء التي تسهل فعلا التعامل مع تقنيات الويب سوكيتس و الويب ار تي سيز ( socket.io , pusher , Laravel echo system .. وغيرها الكثير ) - أما لو كانت تريد بناء Restuful API قوية فكثير من الأشياء تجعل Laravel في الصدارة في هذا الأمر ( الـ Restful Controllers , Laravel Passport , jwt auth .. وغيرها ) . و كون لارافل مفتوح المصدر فهو أيضا يعطيك تحكم كامل بدون محدوديات ولك أن تعدل حتى الcore الخاص بإطار العمل . - وطبعا لم أتحدث عن مزايا إطار العمل هذا التي تجعل حوالي مليون و نصف موقع تقوم عليه , فقد اختصصت قولي بالنقاط التي أردت التغيير من أجلها . بجانب أن تعلم لارافيل يختصر عليك طريقا طويلا أنت على وشك أن تسلكه , فقبل التوغل في منصة أو اطار عمل ما ينبغي عليك تعلم اللغة أولا . ومن ثم تعلم أشياء تعطيك نظرة تبسط لك التعامل مع أطر العمل على هاته اللغة ككل كالبرمجة الكائنية و معماريات التصميم بهاته اللغة ومن ثم فقط يأتي إختيار إطار العمل . فأنا أدعوك الى جدية أكثر في توضيح لنفسك الأسباب التي تريد بها الإنتقال و من ثم مراجعتها و التحقق منها قبل الحسم في موضوع قد يأخذ الكثير من الوقت . و أرشح لك دورة تطوير تطبيقات الويب بلغة الphp من حسوب فبها قسم كامل عن كيف تقوم ببناء تطبيقات إعتمادًا على إطار العمل Laravel . وكملاحظة بسيطة فان الوردبرس ليس إطار عمل و انما هو نظام إدارة محتوى , والفرق بينهما ببساطة هو : أن نظام إدارة المحتوى هو عبارة عن برمجية تساعدك على إيجاد حلول رقمية كأن تقوم ببناء تطبيق ويب أو صفحة هبوط , وأمثلة عن ذلك : الووردبرس , جوملا , ويكس وغيرها . أما إطار العمل فهو شيء اخر تماما فهو إضافة على لغة ، يجمع مجموعة من المكتبات و الحزم . و يوفر الأساس الذي يبني عليه مطورو الويب التطبيقات. و أمثلة عن ذلك : لارافل , روبي ان ريلز , دجانقو . فبإطار العمل تستطيع حتى بناء نظام إدارة محتوى كامل ومتكامل اما العكس فغير ممكن . وهذه هي ميزة إستعمال أطر العمل , أي غير المحدودية في مقابل نظم إدارة المحتوى . بالتوفيق
  4. للأسف سرفرات هيروكو تمتلك تخزين " سريع الزوال " , أي انك تستطيع اضافة الملفات والصور الى القرص غير أن هاته الملفات لن تكون حاضرة في حالة رفع جديد أو اعادة تشغيل التطبيق وهذا خلال 24 ساعة فحل المشكلة هو اما بـ : 1 . استعمال التخزين العام بداخل مجلد الpublic مباشرة , وهذا بالتعديل على ملف config/filesystems.php : <?php 'heroku_public' => [ 'driver' => 'local', 'root' => public_path() . '/uploads', ], ومن ثم استعمال نمط التخزين على هذا النحو : <?php use Illuminate\Support\Facades\Storage; ... Storage::disk('heroku_public')->put($your_path, $your_file_content) غير أن هذا لن يحل المشكلة ككل و ستبقى الملفات عامة و ظاهرة و هذا لن يكون في الصالح في حال ما أردت حماية خصوصية المستخدمين . فالحل النهائي هو باستخدام تخزين خارجي تماما . مثل : cloudinary , aws s3 . وخصوصا مع الكثير من الأشياء التي يجعل لارافل العملية بها سهلة . و اقترح بقوة استعمال cloudinary cloud storage فسرفرات هيروكو تتوفر على اضافة add-ons تسهل ذلك باسم cloudinary . و من جانب اللارافل موجود على الgithub باكج مفتوحة المصدر تسهل ربط التطبيق بتخزين الكلاود الخاص بك على كلاوديناري باسم laravel-cloudinary .
  5. - أولا قم بالتأكد أنك تستعمل الTrait الصحيح ففي النسخة الثامنة من المكتبة تم تغيير الtrait من HasMediaTrait الى InteractsWithMedia . فيكون هكذا : <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; class myModel extends Model implements HasMedia { use InteractsWithMedia; // use HasMediaTrait; تم التخلي عنه } و بكل حال من الاحوال , لا يزال عليك تخصيص وسط واحد فالدالة toMediaCollection معرفة بكلاس الوسط في حين أنك تقوم بتطبيقها على مجموعة من الوسائط و بطبيعة الحال فان الدالة غير معرفة على هذا النحو و سيتم رمي خطأ حالما قمت باستدعاءها . و كحلان مقترحان يمكنك : 1 . اما تخصيص وسط واحد و تطبيق الدالة toMediaCollection عليه و ذلك بـ : <?php public function update(Request $request, Channel $channel) { if($request->hasFile("image")){ // بدل هذا // $blog->addAllMediaFromRequest('image')->toMediaCollection('images'); // قم بهذا $blog->addMediaFromRequest('image')->toMediaCollection('images'); } } ?> وهذا بحالة ما كنت تقوم برفع وسط واحد على الاكثر 2 . تطبيق دور حول مجموعة الوسائط و تطبيق الدالة على كل منها مثل ما هو موصوف بالتعليق السابق , وهذا بحالة ما كنت تقوم برفع مجموعة وسائط , أي اثنان فأكثر .
  6. بقراءة متمعنة للخطأ الظاهر نجده يشير الى خطأ بسياق اللغة فهو لم يتوقع ادراج المتغير الذي اسمه $admin و الجائز في اللغة أن يعرف اما ثابت const أو دالة function : أي كلاس class و بداخله دوال methods و بداخل هاته الدوال يكون الكود و الlogic لا خارجها فالتخلص من هاته المشكلة بسيط و هو باضافة هذا الكود : $admin = new Role(); $admin->name = 'admin'; $admin->display_name = 'Project Admin'; $admin->description = 'admin is the owner of a project'; $admin->save(); الى داخل دالة معينة ننشئها . لكن هذا قد يحل المشكلة لكنه لن يجعل الباكاج تعمل بشكل صحيح و لربما قد يضيف مشاكل اخرى فالحل هو : بعدما قمنا بانشاء كلاس باسم Role الان نحتاج الى انشاء ادوار , أي انشاء نماذج من هذا الكلاس فالأصح ليس استعمال الكود السابق داخل الكلاس , بل استعمالها في أي مكان ثان غير داخل هذا الكلاس حتى يكون سهل الوصول و قابل للاستنتساخ منه . فالان أنت قد قمت بعمل الكلاس , وقد قمت بتوريثه دوال معينة باستعمال extends و لا تحتاج الى تعريف دوال اخرى , فتحتاج فقط الى انشاء هاته النماذج و عن نفسي احبذ انشاءها داخل ملف التهجير الخاص بالمستخدمين بدالة خاصة يتم استدعاءها قبل انشاء المستخدم الافتراضي أو السوبر ادمن ومن ثم اعطاء الدور له . فيكون ملف Role.php هكذا : <?php namespace App; use Zizaco\Entrust\EntrustRole; class Role extends EntrustRole { // } و يكون ملف التهجير الخاص بالمستخدمين هكذا : <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Hash; use App\Role; // لا تنسى تضمين الكلاس بشكل صحيح class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); // استدعاء الدالة التي تقوم بانشاء الادوار الافتراضية $adminRole = $this->createeSuperAdminRole(); // انشاء العضو الافتراضي او السوبر ادمن $user = App\Models\User::create([ 'name'=>'SuperAdmin', 'email'=>'super@admin.co', 'password' => Hash::make('12345678'), ]); // اضافة الدور للعضو $user->attachRole($adminRole); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } private function createeSuperAdminRole() { $admin = new Role(); $admin->name = 'admin'; $admin->display_name = 'Project Admin'; $admin->description = 'admin is the owner of a project'; $admin->save(); return $admin; // نقوم باعادته حتى يسهل اعطاء العضو الافتراضي هذا الدور } } و يمكنك معاملة الاذونات و الملف باسم Permission.php بنفس المنطق و انشاء الاذونات واضافتها للادوار بمنطق مشابه
  7. السلام عليكم الاخوة الكرام قمت بالتعامل مع احد العملاء بموقع Freelancer (كان بناء على طلبه), الشغل انتهى واستلمت المال على الموقع ولكنه بقى محجوز و تحويله يطلب تأكيد الهوية KYC تأكيد الهوية يطلب تأكيد العنوان , العنوان حاولت بالكارت البيومترية ولكنه اترفض , يطلب اشيا مثل رخصة سياقة , كشف كهرباء و حاجات هك وكلها تقريبا ما عنديش خفت استعمل الخاصة بالوالد او الاخ الاكبر و ينقفل الحساب خصوصا وانو مطلعلي مسج انو اي محاولة احتيال هوية ينقفل بيها الحساب يا ريت اللي عدا الاختبار يخبرني كيف عملها وقام بتأكيد الادراس, وحبذا لو من الجزائر بالضبط
  8. الثغرة الأمنية أو الـ Security Bug هي أوسع من تحصر في موقع أو تطبيق , قد نجد الثغرات في أنظمة التشغيل أو السيرفرات أيضا , أما عن الثغرات الأمنية في مواقع الويب أو تطبيقاته هي << غالبا >> ما تكون مرتبطة بحقول الادخال ( الـ Forms ) و أغلب الهجمات تكون عن طريق الفورمز تلك . اما بتحميل فايل ملغم على السيرفر عن طريقها وهي ما تعرف بهجمات الـ Remote File Uploads , أو عن طريقة كتابة سكربت أو كود يقوم بعملية تخريبية ما (هجمات الـ Cross Site Scripting) أو عن طريق حقن أمر SQL (ولعلها الأشهر على الاطلاق , الـ Sql Injections), فالفورمز ومدخلاتها هي المدخل الوحيد الذي يستطيع الاتصال بالسرفر و هو ما يستغله المخرب او المخترق . وهنا يأتي دور الـ Validation و الـ sanitizing على السرفر سايد وعلى الكلاينت سايد . فالثغرة الأمنية بموقع تكون اما بثغرة على السيرفر نفسه , او ربما على نظام التشغيل . أو في ضعف أو ربما غياب التعقيم و توثيق المعلومات قبل وبعد وأثناء ارسالها الى السيرفر , و قبل أي عملية حقن في قاعدة البيانات أو التعامل مع ملفات السيرفر . بعض المفاهيم والأساليب في البرمجة الكائنية التوجه OOP قد يكون لها دور كبير ايضا في الامن المعلوماتي مثل مفهوم التغليف أو الـ Encapsulation . وهو الاتجاه البرمجي الذي يتجه نحوه العالم . فالثغرة الأمنية قد لا تكون غالبا خطأ في السكريب أو خطأ في كتابة الكود , بل في الغفلة عن تغليف المعلومات أو معالجتها وتوثيقها و تعقيمها من أي ما قد يكون مضرا بالموقع. أي بصف جميع الاحتمالات الممكن عملها بحقل ما و معالجتها (وهو نفسه ما قاله الاخ في تعليق سابق) تحياتي
  9. اما ان العميل يثبت لوكل هوست ويجرب الموقع لو كان الموقع بقاعدة بيانات و باك اند . وهذا رح يتعب العميل و يشتتو خصوصا لو كان خارج المجال. أو تعمل تريك بسيطة , وهي الأفضل . ترفع الموقع على استضافة مجانية , وتضيف فورم دخول للموقع مثلا وتسلملو بيانات الدخول (ولو حقل واحد , رقم تسلسلي مثلا) وبعد الاتفاق على المطلوب تزيل الفورم و تحذف بيانات الموقع من السي بانل للمستضيف المجاني . استضافات مثل نتلفاي Netlify (لو كان الموقع ستاتيك) أو 000webhost أو freewha (ان كان الموقع بقاعدة بيانات و سرفر سايد) ستكون مناسبة جدا
  10. <form> Age : <input type='number' class='ageField' /> nationality : <select class='nationalityField'> <option value='Saudian'>Saudian</option> <option value='American'>American</option> <option value='Algerian'>Algerian</option> </select> <input type='submit' class='submitBtn'> </form> var btn =document.querySelector('.submitBtn'); // function called when submitting the button function checkForUser(){ // declaring variables var nationality=document.querySelector('.nationalityField'), age =document.querySelector('.ageField'); // check : if(nationality.value=='saudian' && age>=18){ window.alert('Welcome'); }else{ window.alert('sorry'); } } // Add event handler btn.addEventListener('click',checkForUser()); بعد ما يدخل المعلومات تأخذ قيم الفيلدس وتعمل اللي حابه بالجافاسكربت
  11. وعليكم السلام , سأجيبك من داخل مجالي (الويب) , تحريك الـ Illustrations في المتصفح أغلب الـ Illustrations مثل تلك التي يوفرها موقع unDraw او موقع Ouch تتوفر على صيغة الـ SVG . ببرامج مثل الFigma أو الفوطوشوب يمكنك التعديل على الـ SVG وتجميع أجزاءه ( Vectors ) و تعريفها جزءا جزءا بID معين . صيغة الـSVG بواسطة المتصفح تقرأ على أنها أجزاء مجمعة ولها خصائصها في اصدار الـ HTML5 , تتذكر الأجزاء اللي عرفتها منذ قليل؟ بالـ CSS3 Animations تقدر تبتكر أي انيميشن تجي فبالك . وبالـ Javascript رح تقدر تبتكر ما لا يأتي بال .
×
×
  • أضف...