کانتینر لاراول با مثال واقعی


عبارت Container یکی از اصطلاحات پرکاربرد در فریم ورک لاراول است. اما همیشه برای همه روشن نیست که چیست و چگونه کار می کند. در این پست سعی می کنم مفهوم ظرف را با یک مثال واقعی توضیح دهم.

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

در این مثال:

  • کافی شاپ (Service Container): اینجاست که تمام منابع (خدمات) در دسترس است. این می داند که چگونه هر نوشیدنی (سرویس) قهوه ای را که شما سفارش دهید آماده کند.

باریستا (Service Resolver): به عنوان مکانیزمی در کافی شاپ عمل می کند که سفارش شما را درک می کند و می داند که چگونه آن را با استفاده از منابع موجود در فروشگاه انجام دهد.

  • نوشیدنی های قهوه (services): اینها خدمات مختلفی هستند که کافی شاپ ارائه می دهد، مانند کاپوچینو، لاته یا اسپرسو. تهیه هر نوشیدنی به فرآیند و منابع خاصی نیاز دارد.

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

ترجمه این به توسعه نرم افزار:

  • مفهوم Service Container: یک ابزار قدرتمند در یک چارچوب (مانند لاراول) است که ایجاد و توزیع سرویس ها (اشیاء) را مدیریت می کند. می داند چگونه اشیاء را بر اساس درخواست های شما نمونه سازی و پیکربندی کند.
  • مفهوم Services: اینها کلاس ها و اشیایی هستند که وظایف خاصی را در برنامه شما انجام می دهند، مانند ارسال ایمیل، ثبت پیام ها، یا مدیریت تعاملات پایگاه داده.
  • مفهوم Resolving Services: هنگامی که شما یک سرویس خاص درخواست می کنید، مانند سفارش یک قهوه ، نیازی به دانستن نحوه ساخت یا پیکربندی سرویس ندارید. این ابزار آن را برای شما مدیریت می کند و خدمات آماده استفاده را ارائه می دهد.

چرا از کانتینر سرویس استفاده کنیم؟

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

تئوری بس است حالا بیایید یک کد بنویسیم.

نوشتن Container در پروژه PHP

تعریف انواع قهوه (Services)

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

interface Coffee {
    public function serve();
}

class Espresso implements Coffee {
    public function serve() {
        return &quotServing an Espresso.\n&quot
    }
}

class Cappuccino implements Coffee {
    public function serve() {
        return &quotServing a Cappuccino with frothy milk.\n&quot
    }
}

class Latte implements Coffee {
    public function serve() {
        return &quotServing a Latte with steamed milk.\n&quot
    }
}

اجرای کافی شاپ (کانتینر خدمات)

اکنون CoffeeShopکلاسی را ایجاد می کنیم که به عنوان ظرف سرویس ما عمل می کند. قابلیت ثبت انواع قهوه و سرو آنها را خواهد داشت.

class CoffeeShop {
    protected $recipes = [];
    
    // Register a coffee type
    public function register($coffeeName, Callable $make) {
        $this->recipes[$coffeeName] = $make;
    }

    // Serve a coffee based on the registered recipe
    public function serve($coffeeName) {
        if (!isset($this->recipes[$coffeeName])) {
            return &quotSorry, we don't serve $coffeeName.\n&quot
        }
        
        $coffee = call_user_func($this->recipes[$coffeeName]);
        return $coffee->serve();
    }
}

انواع قهوه را ثبت کنید و آنها را سرو کنید

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

// Create the coffee shop (service container)
$coffeeShop = new CoffeeShop();

// Register coffee types (services)
$coffeeShop->register('espresso', function() { return new Espresso(); });
$coffeeShop->register('cappuccino', function() { return new Cappuccino(); });
$coffeeShop->register('latte', function() { return new Latte(); });

// Serve the coffee
echo $coffeeShop->serve('espresso');
echo $coffeeShop->serve('cappuccino');
echo $coffeeShop->serve('latte');
echo $coffeeShop->serve('mocha'); // This should return an error

خروجی

Serving an Espresso.
Serving a Cappuccino with frothy milk.
Serving a Latte with steamed milk.
Sorry, we don't serve mocha.

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

منبع: laravel school