2016-09-19 2 views
0

Je crée une nouvelle application dans Zend Framework 3 et j'ai une question sur un modèle de conceptionZend Framework 3 singletons

Sans entrer dans les détails beaucoup cette application aura plusieurs services, comme, vous connecterez APIs externes et même dans plusieurs bases de données, le workflow est également très complexe, une seule action peut avoir plusieurs flux en fonction de plusieurs informations externes (utilisateur connecté, configs, etc). Je connais les injections de dépendances et Zend Framework 3 Service Manager, mais je m'inquiète de l'instanciation des services sereval lorsque le flux n'en utilisera que quelques-uns dans certains cas, nous aurons aussi des services dépendant d'autres services, Pour cela, je pensais à utiliser des singletons.

Est-ce que singleton est vraiment une solution ici? Je cherchais un moyen d'utiliser des singletons utilisateur dans Zend Framework 3 et je n'ai pas trouvé de solution facile car je n'arrive pas à trouver un moyen d'utiliser le gestionnaire de service dans un service, car je ne peux pas récupérer l'instance du gestionnaire de service en dehors du système Factory.

Qu'est-ce qu'un moyen facile d'implémenter des singletons dans Zend Framework 3?

Répondre

2

Pourquoi utiliser des singletons?

Vous n'avez pas besoin de vous soucier de trop de services dans votre gestionnaire de services car ils ne sont démarrés que lorsque vous les recevez du gestionnaire de services.

N'utilisez pas non plus le gestionnaire de services dans une autre classe sauf une usine. En ZF3, il est retiré des contrôleurs pour une raison. L'un d'eux est la testabilité. Si tous les services sont injectés avec une usine, vous pouvez facilement écrire des tests. Aussi, si vous lisez votre code l'année prochaine, vous pouvez facilement voir quelles dépendances sont nécessaires à l'intérieur d'une classe.

Si vous trouvez qu'il ya trop de services étant injectés dans une classe qui ne sont pas toujours nécessaires, vous pouvez:

  • Utilisez le ProxyManager. Cette paresse charge un service mais ne le démarre pas avant qu'une méthode ne soit appelée. Diviser le service: déplacez certaines parties d'un service dans un nouveau service. par exemple. Vous n'avez pas besoin de tout placer dans un UserService. Vous pouvez également avoir un UserRegisterService, UserEmailService, UserAuthService et UserNotificationsService.

Au lieu de ZF3, vous pouvez également penser à zend-expressive. Sans entrer dans trop de détails, c'est un framework middleware léger. Vous pouvez utiliser le middleware pour détecter ce qui est nécessaire pour une demande et l'acheminer vers l'action requise pour traiter la demande. Quelque chose comme ça peut probablement aussi être fait dans ZF3 mais peut-être que quelqu'un d'autre peut expliquer comment le faire là-bas.

+0

"N'utilisez pas non plus le gestionnaire de service dans une autre classe sauf une usine.". Mais que faire si j'ai besoin de créer une nouvelle instance d'une classe qui a des dépendances? Par exemple, manipulez des données différentes dans des objets à l'intérieur d'un modèle alors que les deux objets sont de la même classe. Sans accès au gestionnaire de service je devrais à tout le processus d'instanciation manuellement. J'ai encore besoin de quelque chose comme ça, mais je m'inquiète des problèmes à venir. –

+0

Si vous avez besoin d'un autre service dans un service, vous devez injecter le service auprès du constructeur. Et vous ne manipulez pas les données à l'intérieur des modèles, du moins pas lorsque d'autres classes sont impliquées. Les données sont préparées dans une classe de service et injectées dans un modèle. Si vous êtes inquiet du nombre d'usines que vous devez créer dans le futur, ne vous inquiétez pas, vous vous y habituerez :) Vous vous remercierez plus tard lors de l'écriture de tests unitaires. Et il y a [des tours de vaudou] (https://xtreamwayz.com/blog/2015-12-30-psr7-abstract-action-factory-one-for-all) mais ils viennent avec une pénalité de performance. – xtreamwayz