سلام خدمت جناب آقای علیمحمدی و سایر اساتید سون لرن
آقای علیمحمدی من چند ماه پیش از شما یک سوالی در رابطه با ریپازیتوری پترن و تفاوتش با مدل پرسیده بودم ، شما خیلی اونجا تفاوت این دو رو توضیح ندادید و صرفا گفتید که توی وردپرس استفاده از ریپازیتوری نیاز نمیشه .
اما الان علاوه بر اون موارد چند تا سوال دیگه هم دارم ، لطف کنید و یه توضیح نسبتا کاملی رو در مورد این موارد بگید ، ما در حال نوشتن یه پروژه خیلی بزرگی هستیم که قطعا ساختار پروژه و توسعه پذیر بودن اون خیلی مهمه . برای همین باید دقیقا تفاوت بعضی قسمتهای مختلف رو بدونم تا خروجی خوبی رو از پروژه داشته باشم .
1 - سوال اولم دقیقا مربوط به اون تفاوت ریپازیتوری و مدل میشه ، ما تا وقتی ریپازیتوری نبود همه درخواستهای ما با دیتابیس توسط مدلها هندل میشد و این قسمت بود که عملیات کار با دیتابیس رو انجام میداد ، اما وقتی بحث ریپازیتوری میاد وسط و یک لایه ای بین persistense و logic کدهای ما قرار میگیره وظیفه مدل این جا چیه ؟ ... من کدهای شما رو که توی گیت لب بررسی میکنم توی وردپرس برای پروژههای همین دورههای متخصص اصلا مدل تعریف نکرده بودید وصرفا از همون ریپازیتوری برای دیتابیس استفاده کرده بودید ، ما برای پروژههای لاراول کمی تفاوت وجود داشت و یه جورایی ریپازیتوری از مدل استفاده میکرد تا داده بگیره از دیتابیس ، و همه مدلهای موجود از کلاسی ارث بری کرده بودند که خود اون هم از طریق Eloquent laravel داده از دیتابیس میگرفت ... لطف کنید تفاوت این دو مورد رو توضیح بدید
2 - مورد دوم در مورد service layer است ، چیزی که میدونم کلا همه login اپلیکیشن ما باید توسط این لایه انجام بشه و هر عملیاتی که بخوایم انجام بدیم باید توی این لایه انجام بشه و کنترلر و قسمتهای دیگه هم از این لایه استفاده میکنند ، حالا سوال اصلی اینجاست که با این حساب ما اصلا نباید از قسمتهای دیگه مستقیما استفاده کنیم توی جاهای مختلف ؟ و هر کاری که میخوایم انجام بدیم باید توسط این سرویسها انجام بشه ؟ .... یه مثال عرض میکنیم ، فرض کنید ما اومدیم توی یکی از کنترلرها و از یکی از ریپازیتوریهای موجود یه ابجکتی ساختیم و استفاده کردیم ازش ، الان این کار اشتباهه ؟ و منطق درستش به این شکله که این بره داخل یک سرویس و اون سرویس بیاد این کار رو انجام بده ؟ و ما صرفا از سرویس استفاده کنیم
3 - یه سوال دیگه ای هم توی نحوه پیاده سازی ریپازیتوریها دارم ، ما معمولا یه کلاس base داریم که اون کارهای اصلی ( CRUD ) مارو انجام میده ، حالا میایم توی ریپوهای مربوط به هر Entity مثلا productRepository کلیه درخواستهای که مربوط به product میشه رو اینجا قرار مدیدیم . حالا این چیزی که من گفتم درسته ؟ یعنیی هررر درخواستی که قرار به دیتابیس زده بشه باید بیاد این قسمت ؟ یا نه باز توی همین productRepository صرفا عملیات اصلی تعریف میشه و درخواستهای دیگه که کلی نیستن میره توی بخش سرویس ؟
4 - و به عنوان سوال آخر ، اگر قراره که ما صرفا با لایه سرویس توی قسمتهای مختلف سر و کار داشته باشیم و این ریپازیتوری و ... از طریق اون فراخوانی بشن باید بیایم تمامی متدهای ریپازیتوری رو توی سرویس هم دوباره بنویسیم ؟
برای مثال ما توی productRepository یک متد داریم به اسم getLatestProducts حالا میخوایم از این استفاده کنیم باید توی productService یک متدی به همین نام داشته باشیم که خروجی getLatestProducts رو برای ما بده ؟
و در آخر اول تشکر میکنم از شما و بعدش هم معذرت میخوام که طولانی شد ، واقعا خودتون هم در جریانید من 4 5 ماهی میشه درگیر این مباحث هستم و هنوز جواب دقیقی رو براش نگرفتم ، ممنون میشم اگر کامل پاسخ بدید