دیزاین پترن repository در لاراول

ترجمه و تالیف : فاطمه شیرزادفر
تاریخ انتشار : 03 مرداد 99
خواندن در 3 دقیقه
دسته بندی ها : لاراول

دیزاین پترن repository یکی از الگوهای طراحی در پارادایم طراحی الگوی نرم‌افزار است. تا آنجا که می‌دانیم، الگوهای طراحی نرم‌افزار بهترین روش برای طراحی و نگهداری کد به روشی بهتر است که قابلیت استفاده مجدد را نیز دارد و توسعه نرم‌افزار را آسان‌تر می‌کند.الگوهای طراحی مستقل از زبان‌ها هستند. در‌واقع هر الگوی طراحی مارا راهنمایی می‌کند تا بهترین راهکارها را در حین توسعه نرم‌افزار در زبان‌های PHP , C ++ , Python , C # , Java و یا هر زبان دیگری، دنبال کنیم. 

در این مقاله از راکت، من قصد دارم در مورد الگوی طراحی ریپازیتوری یا Repository design pattern یا همان دیزاین پترن repository در لاراول، به روش پرسش و پاسخ صحبت کنم.

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

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

فهرست مطالب 

دیزاین پترن repository  یا الگوی طراحی مخزن چیست؟

چگونه دیزاین پترن repository را در لاراول پیاده‌سازی کنیم؟

چرا در دیزاین پترن repository به اینترفیس یا رابط نیاز داریم؟

آیا باید از دیزاین پترن repository در پروژه‌ی خود استفاده کنم؟

دیزاین پترن repository یا الگوی طراحی مخزن چیست؟

 دیزاین پترن repository  یک بخش انتزاعی از لایه داده است، که به عنوان یک واسطه یا لایه‌ی میانی بین داده و دسترسی به منطق عمل می‌کند.

مزایا

  • باعث می‌شود کد قابلیت استفاده مجدد داشته باشد و همچنین کدی تمیز با قابلیت نگهداری بالا داشته باشید.
  • یک مکان واحد برای ایجاد تغییرات در دسترسی به داده‌هاست.
  • این یک انتزاع (abstraction) است، بنابراین جزئیات چگونگی دستیابی به داده‌ها را از پایگاه پنهان می‌کند.

یکم بیشتر بدونیم!

abstraction چیه؟ هم معماران کامپیوتر و هم برنامه نویسان، باید تکنیک‌هایی را بهره‌وری ابداع کنند و گرنه زمان طراحی همانند منابع مطابق قانون مور، به طول می‌انجامد. یکی از تکنیک‌های اصلی بهره‌وری برای سخت‌افزار و نرم‌افزار استفاده از abstraction برای ارائه طراحی در سطوح مختلف است؛ جزئيات سطح پایین‌تر برای ارائه‌ی مدل ساده‌تر،‌از دید سطح بالاتر مخفی می‌ماند. (از کتاب طراحی و معماری کامپیوتر نوشته پروفسور پترسون )

  • این کار کد را به راحتی قابل تست می‌کند (این ساده است که repository را با اجرای فیک و جعلی برای انجام تست، جابه‌جا یا جایگزین کنیم، بنابراین نیازی نیست که یک دیتابیس در دسترس برای انجام یونیت تست خود داشته باشید.)

چگونه دیزاین پترن repository را در لاراول پیاده‌سازی کنیم؟

سناریو: فرض کنید، ما یک مدل post و یک PostControler داریم؛ در یک پروسه توسعه معمولی کدهایی که در زیر به ما داده شده است را دنبال می‌کنیم.

برای گرفتن لیستی از پست و گرفتن یک پست با یک آیدی منحصر به فرد.

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;


class PostController extends Controller
{
	public function index(){
		$data = Post::all();
		return view('posts.index')->with('data', $data);
	}

	public function show($id){
		$data = Post::findOrFail($id);
		return view('posts.show')->with('data', $data);
	}
}

مشکل

اگر چند کنترلر دیگر در اختیار داشته باشیم که در آن به یک پست با آیدی یا لیست پست نیاز داشته باشیم، دقیقاً همین کار را همان‌جا تکرار می‌کنیم. نگاه کنید، در این مثال، ما با استفاده از eloquent model در دیتابیس خودمان داده‌ها را fetch کرده‌ایم. در آینده اگر پروژه ما نیاز به تغییر سورس داده‌ها داشته باشد که توسط eloquent پشتیبانی نشود؛ مجبوریم آن قسمت‌ها را به صورت دستی تغییر دهیم که در نتیجه نگهداری از آن نرم‌افزار بسیار سخت خواهد شد. در بعضی مواقع هم این کار غیر ممکن خواهد بود و همچنین قابلیت تست هم از ما گرفته می‌شود چراکه model و controller کاملاً به هم متصل نشده‌اند. post controller به post model متصل است.

راه‌حل

در این سناریو، ما به راحتی می‌توانیم با استفاده از دیزاین پترن repository در لاراول، این نوع مشکل را حل کنیم. ما برای دسترسی به داده‌ها از رابط repository به controller استفاده خواهیم کرد. بنابراین controller ما کاملاً جفت شده و مستقل خواهد بود و نیازی نیست که بدانیم داده‌ها از کجا آمده و منطق اجرا شده در پشت آن چگونه است. بنابراین، در آینده درایور داده خود را تغییر می‌دهیم که دیگر نیازی به تغییر کد controller برای تنظیم تغییرات نیست. باحاله نه؟! 

خب اجازه دهید دیزاین پترن repository را در این مورد خاص پیاده‌سازی کنیم.

مرحله ۱: یک رابط یا اینترفیس بسازید

 یک نام رابط با PostRepositorylnterface در دایرکتوری app\Repositories ایجاد کنید.

<?php namespace App\Repositories;

interface PostRepositoryInterface{
	
	public function getAll();

	public function getPost($id);

	// more
}

مرحله ۲ : حالا یک repository class بسازید 

 نام repository class را با PostRepository توسط PostRepositorylnterface در دایرکتوری app\Repository پیاده‌سازی کنید.

<?php namespace App\Repositories;

use App\Post;

class PostRepository implements PostRepositoryInterface
{
	public function getAll(){
		return Post::all();
	}

	public function getPost($id){
		return Post::findOrFail($id);
	}

	// more 

}

مرحله ۳: یک controller بسازید

اینترفیس و repository class ما تمام شد. اکنون ما می‌خواهیم آن را در  Post Controller class خود استفاده کنیم؛ بیایین انجامش بدیم.

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Repositories\PostRepositoryInterface;

class PostController extends Controller
{
	private $repository;

	public function __construct(PostRepositoryInterface $repository)
	{
	   $this->repository = $repository;
	}

	public function index(){
		$data = $this->repository->getAll();
		return view('posts.index')->with('data', $data);
	}

	public function show($id){
		$data = $this->repository->getPost($id);
		return view('posts.show')->with('data', $data);
	}
}

مرحله ۴: repository را Register کنید

ما فقط ماژول Post repository را تمام کردیم. post controler ما از آن استفاده کرده است اما لاراول نمی‌شناسد. برای ثبت با ریجستر کردن ماژول post repository، این مورد را در AppService Provider اضافه کنید.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    
    public function register()
    {
        $this->app->bind(
            'App\Repositories\PostRepositoryInterface',
            'App\Repositories\PostRepository'
        );
    }

   
    public function boot()
    {
        //
    }
}

اجرای ما تمام شد! اگر امروز یا فردا نیاز به استفاده از دیتا سورس‌های مختلف برای post خود داشتیم، دیگر نیازی به تغییر Post Controller یا هر controller دیگری که در PostRepositoryInterface مورد استفاده قرار گرفته، نداریم. این می‌تواند بسته به اندازه و بزرگی پروژه شما در ۱۰ یا ۱۰۰ مکان دیگر نیز باشد. برای مثال، در آینده اگر ما دیتا سورس را با فایربیس استفاده کنیم به جای eloquent model برای دیتابیس MySQL (در اینجا PostRepository از eloquent model استفاده می‌کند.) در آن زمان فقط باید دو مکان را تغییر دهیم! ابتدا کلاس جدیدی را که پیاده‌سازی PostRepositoryInterface را اجرا می‌کند اضافه کنید و binding را در AppServiceProvider که در register method قرار دارد به روزرسانی کنید. این مثال در زیر آورده شده است:

<?php namespace App\Repositories;


class PostRepositoryFirebase implements PostRepositoryInterface
{
	public function getAll(){
		// example: http request to get all the post data and return;
	}

	public function getPost($id){
		// example: http request to get specific post data and return;
	}

	// more 

}

اکنون ما فقط باید bindings را در AppService Provider تغییر دهیم. خودشه!

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    
    public function register()
    {
        $this->app->bind(
            'App\Repositories\PostRepositoryInterface',
            'App\Repositories\PostRepositoryFirebase'
        );
    }

   
    public function boot()
    {
        //
    }
}

چرا رابط یا اینترفیس در دیزاین پترن repository نیاز است؟

در اینجا اینترفیس یا رابط به تصویر می‌آید زیرا امکان را برای ما فراهم می‌کند تا هر چه دوست داریم اجرا کنیم. ما فقط در دو مکان تغییر ایجاد می‌کنیم برای اجرای سورس دیتای جدید به جای اینکه به صورت دستی هر مکانی که از آن استفاده شده است را تغییر دهیم.

آیا باید از دیزاین پترن repository در پروژه‌ي خود استفاده کنیم؟

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

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

منبع

گردآوری و تالیف فاطمه شیرزادفر
آفلاین
user-avatar

تجربه کلمه‌ای هست که همه برای توصیف اشتباهاتشون ازش استفاده میکنن، و من همیشه دنبال اشتباهات جدیدم! برنامه‌نویس هستم و لینوکس‌ کار

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
هیچ دیدگاهی تا به این لحظه برای این موضوع ثبت نشده است