تكرار السؤال: …
الإجابة المختصرة
تستخدم register() حصراً لربط الكائنات داخل الـ Container دون استدعاء أي خدمات أخرى، وتستخدم boot() لتنفيذ منطق يعتمد على خدمات أخرى اكتمل تسجيلها.
الشرح
ينفذ Laravel مرحلة التسجيل أولاً؛ فيمر على كل الـ Service Providers ويستدعي دوال register() الخاصة بها. لذلك، إذا حاولت استخدام مستمع أحداث أو استدعاء خدمة أخرى داخل register()، قد يفشل التطبيق لأن الخدمة المستهدفة لم تسجل بعد. بمجرد انتهاء تسجيل جميع الخدمات، يستدعي Laravel دالة boot() عبر جميع المزودات، حيث يصبح كل شيء جاهزاً للاستخدام الآمن.
مثال بالكود
class AppServiceProvider extends ServiceProvider {
public function register(): void {
$this->app->singleton(MyService::class, fn() => new MyService());
}
public function boot(): void {
// آمن تماماً: استدعاء نماذج، أحداث، وفحص صلاحيات
Gate::define('view-dashboard', fn($user) => $user->isAdmin);
}
}أخطاء شائعة
- تسجيل مستمعي الأحداث (Event Listeners) أو استدعاء نماذج قواعد البيانات داخل دالة register().
أسئلة متابعة
- ما هي دورة حياة الطلب (Request Lifecycle) في Laravel من لحظة وصوله لـ public/index.php وحتى خروج الاستجابة؟
- ما الفرق بين bind و singleton و scoped في Service Container الخاص بـ Laravel؟