رابط های PHP نحوه استفاده از آنها و اتصال رابط لاراول به سادگی توضیح داده شده است
رابط پی اچ پی چیست؟
یک رابط در PHP یک طرح اولیه برای کلاس ها است. قراردادی را تعریف میکند که هر کلاس پیادهسازی باید به آن پایبند باشد، روشهایی را مشخص میکند که باید پیادهسازی شوند، اما بدنههای متد را ارائه نمیدهند. اینترفیسها ساختاری سازگار را در بین کلاسهای مختلف تضمین میکنند و چندشکلی را با اجازه دادن به کلاسهای متعدد از طریق یک رابط مشترک درمان میکنند. در اینجا شما میتوانید اطلاعات بیشتری راجع به آن بخوانید
بدون اتصال استفاده کنید
بیایید ابتدا در مورد نحوه استفاده از رابط ها بدون اتصال در لاراول صحبت کنیم.
1. تعریف یک رابط:
یک رابط در فهرست App\Contracts ایجاد کنید.
// app/Contracts/PaymentGatewayInterface.php
namespace App\Contracts;
interface PaymentGatewayInterface {
public function charge($amount);
}
2. پیاده سازی رابط با روش های اضافی:
// app/Services/StripePaymentGateway.php
namespace App\Services;
use App\Contracts\PaymentGatewayInterface;
class StripePaymentGateway implements PaymentGatewayInterface {
public function charge($amount) {
// Logic to charge using Stripe
return "Charged {$amount} using Stripe";
}
}
3. پیاده سازی را به صورت دستی تزریق کنید:
هنگامی که کنترلر یا کلاسی را که به رابط نیاز دارد نمونه سازی می کنید، پیاده سازی را به صورت دستی ارائه دهید.
// app/Http/Controllers/PaymentController.php
namespace App\Http\Controllers;
use App\Contracts\PaymentGatewayInterface;
use App\Services\StripePaymentGateway;
class PaymentController extends Controller {
protected $paymentGateway;
public function __construct(PaymentGatewayInterface $paymentGateway) {
$this->paymentGateway = $paymentGateway;
}
public function charge($amount) {
return $this->paymentGateway->charge($amount);
}
}
// routes/web.php
use App\Http\Controllers\PaymentController;
use App\Services\StripePaymentGateway;
Route::get('/charge/{amount}', function ($amount) {
$paymentGateway = new StripePaymentGateway();
$controller = new PaymentController($paymentGateway);
return $controller->charge($amount);
});
مثال با الزام آور و مزایای رویکرد
ظرف سرویس لاراول می تواند به طور خودکار وابستگی ها را برای شما حل کند و کد دیگ بخار را کاهش دهد. این مثال را بررسی کنید.
// app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Contracts\PaymentGatewayInterface;
use App\Services\StripePaymentGateway;
class AppServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(PaymentGatewayInterface::class, StripePaymentGateway::class);
}
public function boot() {
//
}
}
// app/Http/Controllers/PaymentController.php
namespace App\Http\Controllers;
use App\Contracts\PaymentGatewayInterface;
use App\Services\StripePaymentGateway;
class PaymentController extends Controller {
protected $paymentGateway;
public function __construct(PaymentGatewayInterface $paymentGateway) {
$this->paymentGateway = $paymentGateway;
}
public function charge($amount) {
return $this->paymentGateway->charge($amount);
}
}
با وجود این اتصال، نیازی به نمونه سازی دستی StripePaymentGateway ندارید. بنابراین این کد در داخل مسیرها کافی است.
// routes/web.php
use App\Http\Controllers\PaymentController;
Route::get('/charge/{amount}', [PaymentController::class, 'charge']);
در این مثال استفاده کرده ایم الزام آور خدمات در لاراول Service binding برای ثبت یک پیادهسازی مشخص برای یک رابط یا کلاس انتزاعی در کانتینر سرویس لاراول استفاده میشود. این به لاراول اجازه می دهد تا به طور خودکار وابستگی ها را حل کند و در صورت نیاز پیاده سازی های مناسب را تزریق کند.