Cosa sono i repository, i servizi e le azioni / i controller?

3

Ho avviato un progetto utilizzando Slim3 e PHP utilizzando una conoscenza limitata dell'architettura dell'applicazione. Il piano era di creare il progetto e separare i problemi di applicazione. Stava andando tutto bene, ma le cose si sono confuse velocemente mentre l'applicazione cresceva.

L'idea per farlo era semplificare lo sviluppo. Lo fa in un certo senso, ma a volte trovo che sia complicato tenere sotto controllo il flusso di dati.

Ho bisogno di un consiglio su cosa sono i repository, i servizi e i controller / azioni. E come dovrebbero funzionare in un sistema. La mia attuale comprensione di questi è la seguente:

Repository

I repository vengono utilizzati tra il livello di servizio e il livello del modello. Ad esempio, in UserRepository creerai metodi che contengono il codice da leggere / scrivere dal database. In PHP, sarebbe utilizzato un PDO o un ORM all'interno dei metodi repo. Ad esempio:

class UserRepository
{
    public function findByID($id) { ... }
    public function findByEmail($email) { ... }
    public function findByMobile($mobile) { ... }
    public function createEmail($email, $firstname, $lastname, $password) { ... }
    public function createMobile($mobile, $firstname, $lastname, $password) { ... }
}

Ho inserito alcuni metodi di esempio. Ma probabilmente ce ne saranno molti altri.

servizi

Il livello di servizio incapsula la logica dell'applicazione. Ad esempio, UserService sarebbe responsabile della creazione di un account e dell'esecuzione della logica richiesta per registrare l'utente. I servizi possono anche essere di terze parti, ad esempio creando un servizio per l'SDK di Facebook o l'ORM.

Un servizio di esempio:

class UserService
{
    public function createMobile($mobile, $firstname, $lastname, $password)     {
    /*
     * Call a validation service to validate input
     */
    ...

    /*
     * Use UserRepository's findByMobile() to check if account exists
     */
    ...

    /*
     * Use UserRepository's createMobile() to create account
     */
    ...

    /*
     * Call SMS service to send verification code
     */
    ...
    }

    public function createEmail(...) { ... }
    public function getFollowers (...) { ... }
}

Azioni

Non sono sicuro se questo è un termine reale. È usato nella documentazione di Slim Framework e sembra rappresentare un controller sottile.

Un'azione contiene pochissima logica e viene utilizzata per effettuare chiamate ai servizi. Raramente, l'azione effettua chiamate dirette ai repository a meno che non vi sia un motivo valido. L'Azione eseguirà controlli di base sui dati restituiti dai servizi al fine di inviare una risposta al cliente.

Sono legati a percorsi individuali. Li sto usando in questo modo:

class ActivateEmailAction extends Action {

    public function __invoke(Request $request, Response $response, $args = [])
    {
        if(!$this->ci->ActivationService->activateEmail($args['token'])){
            return $response->withJson([
                'status' => 'error',
                'data' => null,
                'message' => 'Invalid verification token'
            ]);
        };

        return $response->withJson([
            'status' => 'success',
            'data' => null,
            'message' => null
        ]);
    }
}

Sto usando questi modelli correttamente? Il flusso che sembra aver adottato è così:

  1. Tutto inizia al percorso. Ad esempio viene fatta una richiesta a /create . Il percorso è registrato su un'azione.
  2. L'azione decide quali servizi chiamare
  3. I servizi eseguono la logica, effettuano chiamate ad altri servizi e repository se necessario
  4. Servizio restituisce i dati all'azione
  5. L'azione restituisce una risposta

Qualunque consiglio sarebbe molto apprezzato.

    
posta BugHunterUK 01.12.2016 - 14:22
fonte

1 risposta

3

In realtà mi piace il modo in cui stai implementando questo.

Alcune risposte:

What are repositories, services and actions/controllers?

  • Repository: il repository è un gateway tra il tuo dominio / livello aziendale e un livello di mappatura dei dati, che è il livello che accede al database e fa le operazioni. Fondamentalmente il repository è un'astrazione per l'accesso al tuo database.

  • Servizio: il servizio dovrebbe fornire un'API alla logica aziendale, quindi essere un'astrazione per il tuo repository, qui è dove non sono d'accordo, solo un po ', con @Cerad, i servizi dovrebbero essere gli unici con accesso ai repository, altrimenti viola il principio di inversione delle dipendenze (D in SOLID), perché il livello aziendale è un'astrazione del livello di accesso ai dati.

  • Azioni / controllori: gli oggetti A / C funzionano come gateway tra l'input e la logica del dominio, decide cosa fare con l'input e come generare la risposta.

I find it's complex at times to keep tabs on the data flow.

Sì, a volte lo è, ma mentre leggo, e non ricordo bene, che è meglio avere un codice organizzato e basato su principi piuttosto che avere difficoltà ultime sul codice brutto, lo rende più gestibile, leggibile e mantenibile .

Infine:

Il modello architettonico che stai utilizzando è l'architettura a strati, tutto è separato in livelli e gli strati superiori sono astrazioni di quelli inferiori, ecco perché ogni livello dovrebbe fare riferimento solo al livello inferiore immediato.

Spero che questo aiuti.

    
risposta data 10.12.2016 - 09:34
fonte

Leggi altre domande sui tag