گیسو نصرالهی
گیسو نصرالهی
خواندن ۷ دقیقه·۱ سال پیش

مقایسه light house و rebing graphql در لاراول

وقتی داشتم منابع گراف رو برای لاراول میخوندم با این ۲ ابزار مواجه شدم که جزو پرطرفدار ترین ابزار های گراف کیو ال در لاراول هستند.اما نمیدونستم کدوم برای کار من میتونه مناسب باشه و بعد از امتحان جفتشون تصمیم گرفتم این نوشته رو بنویسم که اگه شماهم تو همون دوراهی موندین بتونین انتخاب درستی داشته باشین .


قبل اینکه بریم سراغ مقایسه بیاید اول بدونیم گراف کیو ال چیه و اصلا چرا باید این زحمت و به جون بخریم که ازش استفاده کنیم

مقدمه

گراف کیو ال یه زبان کوئری نویسی خیلی قدرتمند برای api هاست که تو خلاصه ترین حالت باعث میشه شما دقیقا همون دیتایی که نیاز دارین و از api بگیرین نه بیشتر نه کمتر! -بهشت فرانت اند دولوپر ها- و یک سری مشکلاتی که توی رست ای پی ای ها داشتیم رو به خوبی سازمان داده که ادامه میبینیم!

مثل ساختارهای داده ثابت که قابلیت انعطاف کمتری داشتن .

یا ورژن بندی ای پی ای ها و ادرس های مختلف، بخاطر اینکه گراف کیو ال فقط یه دونه endpoint داره(همه درخواست ها به یه آدرس میرن) دیگه نیازی به ورژن بندی نداره که همین باعث میشه حجم کد کمتری داشته باشیم و موقعیم که میخوایم api هامون رو توسعه بدیم دیباگ کردنش برامون راحت تر باشه.


ربینگ یکی از اولین پکیج هایی هست که برای پیاده سازی گراف کیو ال توی لاراول داشتیم و این پکیج به خوبی از فیچر های اساسی گراف کیو ال پشتیبانی میکنه .

لایت هاوس یک فریم ورکه و به نسبت جدیدتره ، همچنین از خیلی قابلیت های بیشتری پشتیبانی میکنه.

جفت این ابزارها درحال به روزرسانی هستند ولی یه سری تفاوتا باهم دارن که در ادامه با پارامترهای مختلف مقایسه میکنیم که به شما کمک میکنه به عنوان توسعه‌دهنده تصمیم بگیرین کدوم برای کار شما مناسب‌تره.


۱)یادگیری

اولین پارامتری که میخوایم مقایسه رو روش انجام بدیم روند یادگیری هست.

ربینگ قطعا توی یادگیری میتونه خیلی ساده تر باشه چون سینتکس شبیه تری به php داره و مفاهیم اولیه مثل mutationها query ها وtype ها رو به خوبی پوشش داده و اگه دارین تازه شروع میکنین تجربه روون تری تو کد نویسی بهتون میده، داکیومنت جمع و جوری هم داره و اگه به زبان فارسی دارین یادمیگیرین براش منابع بیشتری هم هست .

اما اگه با پلتفرم های دیگه ای مثل نود جی اس کار کردین احتمالا با سینتکس sdl راحت تر باشین . لایت هاوس یه فریم ورکه و طبعا قابلیت های خیلی بیشتری داره به نسبت یک پکیج و برای همین ممکنه یادگیریش زمان بیشتری ببره ،تا به امروز جامعه بزرگتری داره و داکیومنتش هم خیلی کامله .

بیاید یک مثال ببینیم از تعریف تایپ ها تو این ۲ تا که بهتر بتونیم سینتکس ها رو تصور کنیم

در این مثال میخوایم یک تایپ کاربر رو در جفت این ابزار ها بررسی کنیم که شامل ۴ تا فیلد هست.

اول با لایت هاوس شروع کنیم

type User { id: ID! name: String! family: String! email: String! image: String }

توی پکیج ربینگ ما مجبوریم از یک ساختاری پیروی کنیم که داخل پوشه http پوشه graphql و داشته باشیم و به جز کانفیگ همه چیزهایی که به ای پی های گراف مربوط هستند رو ،مثل تایپ ها،اونجا پیاده سازی کنیم.

همونطور که میبینید این نوع کد نویسی از اسکیما دورتره و بیشتر شبیه ساختار شی گرایی هست که توی لاراول تاحالا باهاش کار کردید.

class UserType extends GraphQLType { protected $attributes = [ 'name' => 'User', 'description' => 'A type', 'model'=>User::class ]; public function fields(): array{ return [ 'id'=>['type'=>Type::int()], 'name'=>['type'=>Type::string()], 'family'=>['type'=>Type::string()], 'email'=>['type'=>Type::string()], 'image'=>['type'=>Type::string()] ];}}

۲)اجرا

ربینگ خیلی سبک و به دردبخوره و بر اساس تجربه میتونه بهترین انتخاب باشه برای وقتی که پروژه تون کوچیکه ، اما لایت هاوس با تکینیک های بهتری تعداد رفت و برگشت کوئری بین کلاینت و سرور و کمتر میکنه و داده ها رو بهینه میکنه که باعث میشه زمان کمتری برای ریسپانس منتظر بمونید ،که اون رو برای پروژه های بزرگ تر و ساختار داده های پیچیده تر به انتخاب بهتری تبدیل میکنه .

در فرایند کشینگ هم وقتی این دوتارو مقایسه میکنیم ,لایت هاوس قابلیت های کش پیشرفته تری رو ارائه می ده،مثلا میتونین کش رو در سطح کوئری یا حتی فیلدهای خاص فعال کنید.یعنی شما می تونین تصمیم بگیرین که کدوم کوئری ها و فیلدها ، برای چه مدت در حافظه نگه داشته بشن. کشینگ لایت هاوس به شما این امکان رو میده که بر اساس نیاز خودتون شخصی سازیش کنید،اما ربینگ فقط از کش خود لاراول پشتیبانی میکنه و یکی از دلایلی که میتونه به یه انتخاب پردردسر توی پروژه های بزرگ تبدیلش کنه همینه، که فقط تو لایه http به شما قابلیت کش میده.

type Query { temperature: Int! @cache(maxAge: 300) }

۳)ویژگی های تخصصی

ربینگ ویژگی های اصلی گراف کیو ال رو به خوبی پیاده سازی کرده مثل میوتیشن ها ، کوئری ها ، تایپ ها و اینپوت ها اما ممکنه تو آخرین به روز رسانی ها و یا بعضی از ویژگی های پیشرفته تر خیلی حرفی برای گفتن نداشته باشه.

بریم یه قسمتی ازین ویژگی های لایت هاوس رو ببینیم که شاید هرکدوم به نوبه خودشون اهمیت زیادی تو پروژه شما داشته باشن!!!

  • بر اساس محیط پروژه (پروداکشن ، تست ، دولوپمنت)نتایج کوئری رو میتونین تغییر بدین!
//show:Specify which environments include this element type Query { testPayment: String! @show(env: ['staging']) } //hide:Specify which environments exclude this element type Query { testPayment: String! @hide(env: ['production']) }

  • قابلیت ردیابی !!!احتمالا دیدید که در پروداکشن بعضی وقتا چقدر میتونه کمک کننده باشه که نظارت کنید روی ریکوئست ها ! خبر خوب اینه که لایت هاوس از این فیچر تا لول فیلد هم پشتیبانی میکنه و مانیتورینگ بهتری داره کافیه که توی فایل config/app.php ، در providers این کد رو اضافه کنید
'providers' => [ \Nuwave\Lighthouse\Tracing\TracingServiceProvider::class, ],

  • میوتیشن های تو در تو

میوتیشن های تودرتو مفهومی در گراف کیو ال هست که به شما این امکان رو میده که چندین عملیات (ایجاد، به روز رسانی یا حذف) را روی مدل های مرتبط و ارتباط های اونا در یک میوتیشن انجام بدید. این باعث میشه داده هایی را که به صورت سلسله مراتبی به هم متصل هستند رو به راحتی تغییر بدید.


  • به نحو احسن میتونین از سافت دیلیت ها استفاده کنین! یعنی میتونین نتایج یه کوئری رو با داده های حذف شده یا بدون اونها یا فقط همون داده های حذف شده رو بازیابی کنید که این قابلیت توی ربینگ نیاز به این داره که خودتون کوئری بزنید اما لایت هاوس همینقدر آسون پیاده سازیش کرده که در ادامه میبینید!
type Query {flights(trashed: Trashed @trashed): [Flight!]! @all} enum Trashed { ONLY @enum(value: 'only') WITH @enum(value: 'with') WITHOUT @enum(value: 'without') } //query { flights(trashed: WITH) {id} }
  • پشتیبانی از شرط های پیچیده

قطعا تو پروژه های بزرگ که نیاز به کوئری های پرسرعت داریم این فیچر خیلی نمیتونه کاربردی باشه اما اگه یه کراد دارین و میخواین روش کلی شرط بذارید کاملا اینو میتونید به لایت هاوس بسپارید.

type Query {
people(where: _ @whereConditions(columns: ['age', 'type', 'haircolour', 'height'])):
[Person!]! @all}
type Person {
id: ID!
age: Int!
height: Int!
type: String!
hair_colour: String!
}
  • پشتیبانی از تست نویسی

لایت هاوس یه قابلیت دیگه ای هم که داره اینه که اضافه کردن تست رو از طریق phpUnit خیلی خوب هندل کرده و یه سری هلپر هم داره که بهتون کمک میکنه تست هایی بهتر رو بنویسین و اجرا کنین!

public function testCreatePost(): void{ $response = $this->graphQL(/** @lang GraphQL */ ' mutation ($title: String!) { createPost(title: $title) { id }}', [ 'title' => 'Automatic testing proven to reduce stress levels in developers' ]);}


خلاصه که جفت این ابزار ها هم کلی خوبی دارن هم معایب ، هدف ما این بود که با آگاهی بیشتری بریم سمت انتخاب بهترین گزینه به نسبت پروژه ای که داریم.معیار های اصلی رو بررسی کردیم ،چیزهایی که میتونن نقش مهمی تو پروژه ها داشته باشند. امیدوارم این مقاله بهتون کمک کرده باشه بهترین تصمیم رو بگیرید و برید سراغ بهترین گزینه.

کد نویسیلاراولgraphqllaravel
شاید از این پست‌ها خوشتان بیاید