🔺 شرح Laravel

الواجهات الساكنة والعقود

الواجهات الساكنة (Facades)

توفّر وصولًا بسيطًا "ساكنًا" لخدمات Laravel المعقّدة. رأيتها كثيرًا:

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Cache;

Route::get('/', ...);
DB::table('users')->get();
Cache::put('key', 'value', 60);

رغم أنها تبدو دوالًّا ساكنة، فهي خلف الكواليس تستدعي كائنات حقيقية من حاوية الخدمات — تجمع بين بساطة الصياغة ومرونة الكائنات.

حاوية الخدمات (Service Container)

قلب Laravel — "صندوق" يصنع الكائنات ويحقن اعتمادياتها تلقائيًّا (Dependency Injection):

<?php
// Laravel يحقن الاعتماديات تلقائيًّا في المتحكّمات
public function store(Request $request, PostService $service)
{
    // $request و$service صُنعا وحُقنا تلقائيًّا
    $service->create($request->validated());
}

العقود (Contracts)

واجهات (interfaces) تحدّد ما تفعله الخدمة دون تحديد كيف. تتيح استبدال التطبيق دون تغيير الكود المعتمِد عليه:

<?php
use Illuminate\Contracts\Cache\Repository as Cache;

class ReportService
{
    public function __construct(private Cache $cache) {}

    public function generate()
    {
        return $this->cache->remember('report', 60, fn() => ...);
    }
}

ربط في الحاوية

<?php
// في AppServiceProvider
$this->app->bind(
    PaymentGateway::class,      // العقد/الواجهة
    StripeGateway::class         // التطبيق الفعلي
);

الآن أي صنف يطلب PaymentGateway يحصل على StripeGateway — ولتبديله إلى بوّابة أخرى تغيّر سطرًا واحدًا.

Facade أم حقن؟

  • Facade: أوضح وأسرع للكتابة (Cache::get(...)).
  • حقن الاعتماديات: أفضل للاختبار والكود القابل للاستبدال.

أخطاء شائعة

  • الإفراط في Facades في المنطق المعقّد بدل حقن الاعتماديات (أصعب اختبارًا).
  • الخلط بين العقد (الواجهة) والتطبيق (الصنف الفعلي).

🎯 التالي: التوطين والترقيم (Localization & Pagination).