Controller sottile: creare un servizio controller per includere altri servizi?

1

Supponiamo che tu abbia un HomepageController che "suppone di mostrare tutti i blog, gli utenti, la galleria e alcune informazioni riservate ai membri (per gli utenti che hanno effettuato l'accesso)

Normalmente, assomiglia a questo:

<?php

class HomepageController
{
    public function index()
    {
        $blogService = new BlogService();       
        $data['blogs'] = $blogService->getAll();

        $userService = new UserService();       
        $data['users'] = $userService->getAll();

        $galleryService = new GalleryService();     
        $data['users'] = $userService->getAll();

        $data['membersOnlyInfo'] = [];

        if ($userIsLoggedIn)
        {
            $membersOnlyService = new MembersOnlyService();
            $data['membersOnlyInfo'] = $membersOnlyService->getTopSecretInfo();
        }       

        Render($data);
    }
}

Questa cosa è probabilmente già grassa ma può diventare più grassa ad un certo punto nel futuro. In questo caso, è meglio racchiuderlo all'interno di un "Servizio controller"? Per esempio:.

class HomepageService
{
    public function index()
    {
        $blogService = new BlogService();       
        $data['blogs'] = $blogService->getAll();

        $userService = new UserService();       
        $data['users'] = $userService->getAll();

        $galleryService = new GalleryService();     
        $data['users'] = $userService->getAll();

        $data['membersOnlyInfo'] = [];

        if ($userIsLoggedIn)
        {
            $membersOnlyService = new MembersOnlyService();
            $data['membersOnlyInfo'] = $membersOnlyService->getTopSecretInfo();
        }       

        return $data;
    }
}

In modo che il controller assomigli a questo:

class HomepageController
{
    public function index()
    {
        $data = new HomepageService();      

        Render($data);
    }
}

C'è un po 'di logica nel primo controller (cioè if ($userIsLoggedIn) ) e poiché i controller non dovrebbero avere alcuna logica di business, immagino che questo abbia senso. È una buona pratica o è eccessivo?

Nota: per semplicità dipendenza, l'iniezione è omessa in questo esempio.

    
posta IMB 07.11.2018 - 08:33
fonte

2 risposte

1

Sì, è una buona idea avere un livello di servizio. Generalmente il tuo controller dovrebbe preoccuparsi solo di produrre una vista dal modello, deserializzare gli input ecc.

Il livello di servizio mantiene separata la logica aziendale dalla pagina Web e consente di eseguire test di unità e riutilizzare l'app mobile o destop.

Nel tuo esempio è discutibile quali bit di logica dovrebbero andare nel servizio e quali, se del caso, dovrebbero rimanere nel controller. Ma nella maggior parte dei casi dovresti avere una mappatura uno a uno del metodo controller per il metodo di servizio.

    
risposta data 07.11.2018 - 10:40
fonte
0

Lascia stare così com'è, non è così male e puoi rifattorici facilmente. Magari metti questo se affermi in una classe separata. Vai con HomeService se vuoi testare questa logica separatamente dal tuo framework web, o hai intenzione di aggiungere web api con la stessa funzionalità. Naturalmente potrebbero esserci delle sfumature che mi sono sfuggite, dal momento che non conosco PHP:)

EDIT: Potresti usare un'iniezione di dipendenza

    
risposta data 07.11.2018 - 08:45
fonte