Question

Comment les gens conçoivent-ils leurs interfaces de couche de service ?

Je programme une grande application Web (en PHP) et nous utilisons MVC et programmons des contrôleurs légers, par exemple.(le pseudo-code suit)

public savePersonAction() {
    $input = filter($_GET);
    ... input validation ...

    $result = $this->_service->savePerson( ? );

    ... etc
}

savePerson dans le service doit-il prendre un argument de la totalité de la structure ou du contexte $input (en PHP, un tableau associatif) ?

Par exemple.ce -

public function savePerson(array $input) {

ou faut-il séparer tous les champs de saisie et fournir une interface "dure", par ex.

public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) {

Merci.

Paul

Était-ce utile?

La solution

Si vous allez suivre l'esprit MVC votre méthode de savePerson ne doit pas accepter l'entrée brute. Il ne doit pas être couplé directement avec le format des données provenant de l'interface utilisateur. Au contraire, il doit accepter l'entrée définie dans les termes de votre domaine de service, comme un objet « personne ». (Cela pourrait être juste un tableau associatif comme Cobby suggéré). Ce serait le travail de la méthode d'action du contrôleur pour cartographier l'entrée brute au format requis par le service.

L'avantage de cette étape de traduction supplémentaire est qu'il isole votre service (modèle) de l'interface. Si vous implémentez un autre ui, vous n'avez pas besoin de changer l'interface de service. Vous avez juste besoin d'écrire de nouveaux contrôleurs (et points de vue, bien sûr).

Alors que votre exemple est comme savePerson($title, $firstName, $lastName...) la bonne idée, il est généralement un mauvais signe quand vous avez des méthodes avec plus de 2 ou 3 arguments. Vous devriez être en mesure d'arguments liés à des groupes dans une sorte d'objet de niveau supérieur.

Autres conseils

Mes applications MVC sont structurées comme ceci :Contrôleur -> Service -> ORM/autre bibliothèque

Pour répondre à votre question, généralement dans votre contrôleur, vous obtiendrez les données du formulaire sous forme de tableau, c'est-à-dire$form->getValues() ou quelque chose de similaire.En termes de maintenabilité, il est préférable que vos services excluent les tableaux comme arguments. De cette façon, si vous ajoutez un autre champ à un formulaire, il vous suffit de mettre à jour le formulaire et le service, votre contrôleur peut rester intact et continuer à fonctionner.

Je pense donc suivre votre premier exemple :

public function savePerson($personArray);

De plus, vous ne devriez pas avoir besoin d'une interface "dure" car votre bibliothèque de formulaires se chargera de la validation/filtration/assainissement afin que nous puissions supposer que le tableau associatif sera valide, et la définition de la méthode deviendra ridiculement longue avec les paramètres nommés.

Je séparerait tous les champs d'entrée et de fournir une interface « dure » dans le service par exemple.

public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...}

Son plus propre et il n'y a pas d'hypothèses nécessaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top