Mahdi Jebraieili
3 سال پیش توسط Mahdi Jebraieili مطرح شد
8 پاسخ

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

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


ثبت پرسش جدید
رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
2

فرض کنید ما دو تا درگاه پرداخت داریم: 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 درگاهتو عوض کن و تمام.
امیدوارم مفید بوده باشه.
موفق باشید.


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
1

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


Mahdi Jebraieili
@jebraieili 3 سال پیش مطرح شد
0

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


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
2

فرض کنید ما دو تا درگاه پرداخت داریم: 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 درگاهتو عوض کن و تمام.
امیدوارم مفید بوده باشه.
موفق باشید.


Mahdi Jebraieili
@jebraieili 3 سال پیش مطرح شد
0

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


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
0

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


Mahdi Jebraieili
@jebraieili 3 سال پیش مطرح شد
0

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


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
0

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


Mahdi Jebraieili
@jebraieili 3 سال پیش مطرح شد
0

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


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

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