سلام خدمت دوستان
چندوقتی هست دارم درمورد قابلیت service container در لاراول تحقیق میکنم راستش هر مقاله ای که میخونم شبیه هم اومدن توضیح دادن یا اومدن همون داکیومنت لاراول رو ترجمه کردن، دوست داشتم اگر کسی واقعا عملی استفاده کرده زحمت بکشه بیاد توضیح بده که مثلا چه گره ای از کارمون باز میکنه و یا چه چالشی رو حل میکنه ،به طور مثال میخواستیم یک فیچر رو پیاده سازی کنیم از راه معمول میخواستیم بریم به این صورت هست و این مشکلات رو داشت اما ما از سرویس کانتینر استفاده کردیم و این قابلیت هارو بهمون داد و این مزیت هارو داشت
سپاس
فرض کنید ما دو تا درگاه پرداخت داریم: 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 درگاهتو عوض کن و تمام.
امیدوارم مفید بوده باشه.
موفق باشید.
سلام به شما دوست عزیز.
فرض کنید در ابتدا سایت ما قرار هست فقط یک درگاه پرداخت داشته باشد ولی در آینده قصد اضافه کردن درگاه های دیگر را نیز داریم.
حالا اگر ما به طور معمول کد نویسی کنیم هر زمان که درگاه جدید اضافه کردیم، باید تمام کدهای پرداخت رو تغییر داده و به درگاه جدید اعمال کنیم ولی زمانی که ما از Service Container استفاده میکنیم دیگه نیازی به تغییر کدها در جاهای مختلف نداریم و فقط درگاه پرداخت جدید رو داخل AppServiceProvider تغییر میدیم.
اگر نیاز به کد داشتین بگید تا با نمونه کد خدمتتون توضیح بدم.
موفق باشید.
فرض کنید ما دو تا درگاه پرداخت داریم: 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 درگاهتو عوض کن و تمام.
امیدوارم مفید بوده باشه.
موفق باشید.
خیلی ممنون از وقتی که گذاشتی عزیز واقعا کمک کردی
فقط ببخشید یه سوال برام پیش اومد با همین مثالی که زدی اگر بخوایم هردو درگاه رو داشته باشیم باید چیکار کنیم؟ مثلا برای پرداخت های داخلی از زرین پال استفاده کنیم برای پرداخت های ارزی از پی پال
سلام مجدد و عذرخواهی بابت تاخیر در پاسخ.
ببینید کلا ما از دیزاین پترن ها زمانی استفاده میکنیم که اگر قرار بود تغییری در کدمون ایجاد کنیم به جای اینکه بیایم و کلی تغییر ایجاد کنیم با تغییر دادن قسمت مورد نظر کدها همچنان جواب بدن و از کثیفی کد جلوگیری کنیم.
موضوعی که مدنظرتون هست رو شما زمانی که میخواین عمل پرداخت رو انجام بدین با یه شرط ساده این مورد رو کنترل کنید.
موفق و پیروز باشید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟