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ì:
- Tutto inizia al percorso. Ad esempio viene fatta una richiesta a
/create
. Il percorso è registrato su un'azione. - L'azione decide quali servizi chiamare
- I servizi eseguono la logica, effettuano chiamate ad altri servizi e repository se necessario
- Servizio restituisce i dati all'azione
- L'azione restituisce una risposta
Qualunque consiglio sarebbe molto apprezzato.