راکت
حل شده

استفاده عملی از service container در لاراول

8 پاسخ

سلام خدمت دوستان
چندوقتی هست دارم درمورد قابلیت service container در لاراول تحقیق میکنم راستش هر مقاله ای که میخونم شبیه هم اومدن توضیح دادن یا اومدن همون داکیومنت لاراول رو ترجمه کردن، دوست داشتم اگر کسی واقعا عملی استفاده کرده زحمت بکشه بیاد توضیح بده که مثلا چه گره ای از کارمون باز میکنه و یا چه چالشی رو حل میکنه ،به طور مثال میخواستیم یک فیچر رو پیاده سازی کنیم از راه معمول میخواستیم بریم به این صورت هست و این مشکلات رو داشت اما ما از سرویس کانتینر استفاده کردیم و این قابلیت هارو بهمون داد و این مزیت هارو داشت
سپاس

ثبت پرسش جدید

پاسخ‌ها

8
رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

بهترین پاسخ

فرض کنید ما دو تا درگاه پرداخت داریم: 1- زرین پال 2- پی پال
در ابتدا باید یه اینترفیس به صورت زیر تعریف کنیم:

<?php

namespace App\Billing;

interface PaymentGetWayContract
{
    public function setDiscount($amount);

    public function pay($amount);
}

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

<?php

namespace App\Billing;

class ZarinPalPaymentGetWay implements PaymentGetwayContract
{
    protected $currency;
    protected $discount;

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

    public function setDiscount($amount)
    {
        $this->discount = $amount;
    }

    public function pay($amount)
    {
        return [
            "getWay" => "Zarin Pal",
            "amount" => $amount - $this->discount,
            "currency" => $this->currency,
            "discount" => $this->discount
        ];
    }
}

کلاس پی پال:

<?php

namespace App\Billing;

class PayPalPaymentGetWay implements PaymentGetwayContract
{

    protected $currency;
    protected $discount;

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

    public function setDiscount($amount)
    {
        $this->discount = $amount;
    }

    public function pay($amount)
    {
        return [
            "getWay" => "Pay Pal",
            "amount" => $amount - $this->discount,
            "currency" => $this->currency,
            "discount" => $this->discount
        ];
    }
}

یه کلاس هم برای جزییات سفارش درست میکنیم:

<?php

namespace App\Orders;

use App\Billing\MellatPaymentGetWay;
use App\Billing\PaymentGetWayContract;

class OrderDetails
{
    private $paymentGetWay;

    public function __construct(PaymentGetWayContract $paymentGetWay)
    {
        $this->paymentGetWay = $paymentGetWay;
    }

    public function all()
    {
        $this->paymentGetWay->setDiscount(500);
        return [
          "order_id" => 1
        ];
    }
}

کلاس مربوط به پرداخت رو هم به صورت زیر مینوسیم:

<?php

namespace App\Http\Controllers;

use App\Billing\PaymentGetWayContract;
use App\Orders\OrderDetails;

class PayOrderController extends Controller
{
    public function store(OrderDetails $orderDetails, PaymentGetwayContract $paymentGetWay)
    {
        $orderDetails->all();
        dd($paymentGetWay->pay(2500));
    }
}

و در آخر داخل متد boot فایل AppServiceProvider.php کد زیر رو قرار میدیم:

public function boot()
    {
        $this->app->singleton(PaymentGetWayContract::class, function () {
            return new ZarinPalPaymentGetWay("USD");
        });
    }

حالا اگه بخوای از درگاه دیگه استفاده کنی دیگه نیاز نیست همه جا بیای کداتو تغییر بدی و فقط داخل AppServiceProvider.php درگاهتو عوض کن و تمام.
امیدوارم مفید بوده باشه.
موفق باشید.

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

سلام به شما دوست عزیز.
فرض کنید در ابتدا سایت ما قرار هست فقط یک درگاه پرداخت داشته باشد ولی در آینده قصد اضافه کردن درگاه های دیگر را نیز داریم.
حالا اگر ما به طور معمول کد نویسی کنیم هر زمان که درگاه جدید اضافه کردیم، باید تمام کدهای پرداخت رو تغییر داده و به درگاه جدید اعمال کنیم ولی زمانی که ما از Service Container استفاده میکنیم دیگه نیازی به تغییر کدها در جاهای مختلف نداریم و فقط درگاه پرداخت جدید رو داخل AppServiceProvider تغییر میدیم.
اگر نیاز به کد داشتین بگید تا با نمونه کد خدمتتون توضیح بدم.
موفق باشید.

Mahdi Jebraieili
Mahdi Jebraieili
@jebraieili

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

شاید پاسخ شما همین‌جا باشد

Mahdi Jebraieili
Mahdi Jebraieili
@jebraieili

خیلی عالی
حالا اوکی شدم😊
ممنون دوست عزیز

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

خوشحالم که مفید بوده.
خواهش میکنم.
با آرزوی بهترین ها برای شما

Mahdi Jebraieili
Mahdi Jebraieili
@jebraieili

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

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

سلام مجدد و عذرخواهی بابت تاخیر در پاسخ.
ببینید کلا ما از دیزاین پترن ها زمانی استفاده میکنیم که اگر قرار بود تغییری در کدمون ایجاد کنیم به جای اینکه بیایم و کلی تغییر ایجاد کنیم با تغییر دادن قسمت مورد نظر کدها همچنان جواب بدن و از کثیفی کد جلوگیری کنیم.
موضوعی که مدنظرتون هست رو شما زمانی که میخواین عمل پرداخت رو انجام بدین با یه شرط ساده این مورد رو کنترل کنید.
موفق و پیروز باشید.

Mahdi Jebraieili
Mahdi Jebraieili
@jebraieili

سپاس دوست عزیز

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

ورود یا ثبت‌نام