عدم إستدعاء Controller داخل Controller أخر

عدم إستدعاء Controller داخل Controller أخر

2024-11-23 وقت القراءه : 1 دقائق

تخيل إنه لدينا بعض الدوال في الـ Controller تقوم بعمل تنسيق معين للبيانات، ونريد إستخدامها في Controllers أخرى.

Bad Practice Example

class NotificationController extends Controller
{
    public static function formatNotifications()
    {
        return Notification::orderBy('created_at', 'desc')
                ->get(['id', 'content', 'created_at'])
                ->map(function($item) {
                    return [
                     'id' => $item['id'],
                     'content' => $item['content'],
                     'created_at' => $item['created_at']->diffForHumans()
                     ]; 
             });
    }

    public function index()
    {
        return view('notifications', [
            // it is relatively ok to call the method from the same controller
            'notifications' => self::formatNotifications();
            ]); 
     }
}

class HomeController extends Controller
{
    public function index()
    {
        return view('index', [
            'reffered_users' => User::where('referred_by', auth()->id())->count(),
            // But it's VERY bad to call Controller method from another Controller
            'notifications'  => NotificationController::formatNotifications()
            ]); 
     }
}

What To Do Instead

// Separate NotificationService:
namespace App\Services;
class NotificationService
{
    public function formatNotifications(){
       return Notification::orderBy('created_at', 'desc')
          ->get(['id', 'content', 'created_at'])
          ->map(function($item) {
              return [
                'id' => $item['id'],
                'content' => $item['content'],
                'created_at' => $item['created_at']->diffForHumans()
               ]; 
            });
    }
} 

// Controller 1:
class NotificationController extends Controller
{
    public function index(NotificationService $notificationService)
    {
        return view('notifications', [
            'notifications' => $notificationService->formatNotifications();
            ]); 
     }
}
// Controller 2:
use App\Services\NotificationService;
class HomeController extends Controller
{
    public function index(NotificationService $notificationService)
    {
        return view('index', [
            'reffered_users' => User::where('referred_by', auth()->id())->count(),
            'notifications' => $notificationService->formatNotifications()
            ]); 
     }
}

الـ Controllers بشكل عام يجب ان يكون خفيف قدر الإمكان، ويجب أن لا يحتوي على business logic، ذلك يعني أن أي دوال أخرى ( مشتركة ...)، يجب أن يتم وضعها في مكان ما مثل Service Class، وهذا الكلاس يمكن إستخدامة في أي Controller


التعليقات
زائر
منذ سنة

صح لسانك

إضافة تعليق
Loading...