Je vais vous avouer, je n'ai pas testé unitaire beaucoup... mais j'aimerais. Avec cela étant dit, j'ai une question très complexe processus d'inscription que j'aimerais optimiser pour faciliter les tests unitaires. Je suis à la recherche d'une structure de mes cours afin que je puisse les tester plus facilement dans l'avenir. Toute cette logique est contenue à l'intérieur d'un framework MVC, donc on peut penser que le contrôleur est la racine où tout est instancié à partir d'.
Pour simplifier, ce que je suis en demande, en substance, est de savoir comment l'installation d'un système où vous pouvez gérer un nombre quelconque de modules tiers avec CRUD mises à jour. Ces modules tiers sont toutes les API RESTful et piloté par les données de réponse est stockée dans des copies locales. Quelque chose comme la suppression d'un compte d'utilisateur aurait besoin de déclencher la suppression de tous les modules associés (j'entends en tant que fournisseurs). Ces fournisseurs peuvent avoir une dépendance à un autre prestataire, de sorte que l'ordre des suppressions/créations est important. Je suis intéressé dans la conception des modèles j'devraient être spécifiquement l'aide à l'appui de ma demande.
L'enregistrement s'étend sur plusieurs classes et stocke les données dans plusieurs tables db. Voici l'ordre des différents fournisseurs et les méthodes (ils ne sont pas statiques, écrit de cette façon pour des raisons de concision):
-
Provider::create('external::create-user')
lance l'enregistrement à une étape particulière d'un fournisseur particulier. Les deux points de syntaxe dans le premier paramètre indique la classe de déclencher la création surproviderClass::providerMethod
. J'avais fait l'hypothèse générale que leProvider
serait une interface avec les méthodes d'create()
,update()
,delete()
que tous les autres fournisseurs de la mettre en œuvre. Comment cela est instanciée est probablement quelque chose que vous devez m'aider. -
$user = Provider_External::createUser()
crée un utilisateur sur une API externe, renvoie succès, et l'utilisateur est stocké dans ma base de données. -
$customer = Provider_Gapps_Customer::create($user)
crée un client sur un tiers de l'API, renvoie succès, et stocke localement. -
$subscription = Provider_Gapps_Subscription::create($customer)
crée un abonnement associé pour le client sur la troisième partie de l'API, renvoie succès, et stocke localement. -
Provider_Gapps_Verification::get($customer, $subscription)
récupère une ligne à partir d'une API externe. Cette information est stockée localement. Un autre appel est en fait ce qui je ne m'attarde pas à garder les choses concis. -
Provider_Gapps_Verification::verify($customer, $subscription)
effectue une API externe du processus de vérification. Le résultat de ce qui est stocké localement.
C'est vraiment une bêtise de l'échantillon que le code s'appuie sur au moins 6 appels d'API externes et plus de 10 lignes de la base de données créée lors de l'inscription. Il n'est pas logique d'utiliser l'injection de dépendance au constructeur, parce que je pourrais avoir besoin d'instancier 6 classes dans le contrôleur, sans savoir si j'ai encore besoin d'eux tous. Ce que je cherche à accomplir serait quelque chose comme Provider::create('external')
où j'ai tout simplement spécifier l'étape de départ pour lancer l'enregistrement.
Le Noeud du Problème
Donc, comme vous pouvez le voir, c'est juste un exemple d'un processus d'enregistrement. Je suis en train de construire un système où je pourrais avoir plusieurs centaines de fournisseurs de services (API externe modules) que j'ai besoin de vous inscrire pour, mettre à jour, supprimer, etc. Chacun de ces fournisseurs obtient liés à un compte d'utilisateur.
Je voudrais construire ce système d'une manière où je peux indiquer un ordre de priorité des opérations (mesures) lors du déclenchement de la création d'un nouveau fournisseur. Mettre une autre manière, permettez-moi de préciser quel fournisseur/méthode de combinaison est déclenchée suivant dans la chaîne des événements depuis la création peut s'étendre sur de nombreuses étapes. Actuellement, j'ai cette chaîne d'événements qui se déroulent par le sujet/pattern observer. Je suis à la recherche d'potentiellement déplacer ce code à une table de base de données, provider_steps
, où j'ai la liste de chaque étape ainsi qu'il suit success_step
et failure_step
(pour les réductions et suppressions). Le tableau se présente comme suit:
# the id of the parent provider row
provider_id int(11) unsigned primary key,
# the short, slug name of the step for using in codebase
step_name varchar(60),
# the name of the method correlating to the step
method_name varchar(120),
# the steps that get triggered on success of this step
# can be comma delimited; multiple steps could be triggered in parallel
triggers_success varchar(255),
# the steps that get triggered on failure of this step
# can be comma delimited; multiple steps could be triggered in parallel
triggers_failure varchar(255),
created_at datetime,
updated_at datetime,
index ('provider_id', 'step_name')
Il y a tellement de décisions à prendre ici... je sais que je devrais faveur de la composition au cours de l'héritage et de créer des interfaces. Je sais aussi que je suis susceptible allez avoir besoin des usines. Enfin, j'ai beaucoup de modèle de domaine de la merde qui se passe ici... alors j'ai probablement besoin d'une entreprise de classes du domaine. Je ne suis pas sûr de savoir comment maille sans la création d'un véritable désordre dans ma quête du saint graal.
Aussi, où serait le meilleur endroit pour les requêtes db à prendre place?
J'ai un modèle pour chaque table de base de données déjà, mais je suis intéressé de savoir où et comment instancier le modèle particulier de méthodes.