Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-02-2016 10:05:32

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Intéraction modèle - web service

Bonjour à tous,

Je viens à vous car je viens de commencer un stage de M2 informatique, et j'aimerais avoir quelques suggestions.

Le but de mon stage est le suivant:

Actuellement, une équipe de biologistes se sert d'un site développé sous Zend afin de consulter/modifier/ajouter des données stockées dans une base de données relationnelle classique. L'utilisation du framework Zend se révèle être très peu adapté pour les objectifs des biologistes. En effet, travaillant dans la recherche, les données à collecter varient régulièrement, et Zend a un modèle (le M du MVC) fortement couplé à la BDR.

Le stage consisterait donc à faire que la partie modèle interagisse avec un "noyau de connaissances" complexe (NoSQL, web sémantique, BDR associé à des SIG)... grâce à un web service. Le web service se chargerait d'assurer l’interaction avec le noyau de connaissances. La partie "Modèle" de Zend se charge d'interroger le web service et non pas le noyau directement.

http://i.stack.imgur.com/17md6.png

J'espère avoir réussi à exprimer clairement l'objectif. Je n'ai jamais touché au framework Zend (j'ai toutefois fait un petit projet avec Symfony 2 et j'ai déjà utilisé des frameworks comme Jelix).

Si vous avez des articles à me conseiller pour commencer mes recherches, je vous en serais bien reconnaissante wink.

La véritable question est finalement: est-ce qu'il existe une solution élégante pour que la partie modèle d'un site développé avec Zend interagisse avec un web service plutôt qu'une base de données? Est-ce possible d'affaiblir le couplage fort qu'il existe entre BD et Modèle de Zend?

J'espère que je suis dans la bonne section et pas totalement à côté de la plaque smile

Bonne journée,

Hors ligne

 

#2 16-02-2016 11:29:29

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

Hello smile
à priori tu es dans la bonne partie du forum, en supposant que ton framework Zend soit la version 2 wink

Pour répondre assez brièvement, ZF2 est un framework clef en main qui te permet de faire TOOOUUUUT ce que tu veux ^^
(Du webservice, de la base de données tout ça tout ça, tu trouvera donc forcement une solution élégante wink )
Effectivement le Modèle est fortement lié à la base de donnée, et pour cause, c'est le but premier de la couche M du MVC, représenter tes données ^^

La question à te poser:
Quel va être le but de ton webservice dans tout ça?
1) Renvoyer simplement des jeux de données à mapper dans un modèle de ton application?
2) Plutôt te renvoyer des ressources directement exploitable en objet fini
    (auquel cas le M de ton application devra se trouver dans ton webservice)
3) Ton webservice s'occupera de toute la gestion métier et ton application ne devient qu'un simple gestionnaire de vue (VC? ^^)
4) A tu vraiment besoin d'un webservice?

Voila voila en fonction des réponses que tu pourra apporter à ces questions, plusieurs options s'offrent à toi ^^

Hors ligne

 

#3 16-02-2016 11:46:03

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

Bonjour flobrflo et merci pour ta réponse, je t'avoue que je commençais à désespérer :p

Par rapport à ce que tu as dis, j'ai une question un peu stupide... Comment savoir quelle version de Zend est utilisée? Je suis partie du principe que c'était la version 2 mais en regardant le fichier .zfproject.xml, je vois qu'il y a écrit <projectProfile type="default" version="1.11.5">... Est-ce que ça n'a aucun rapport? ):

Le but du webservice est de permettre les opérations du CRUD pour toutes les entités de mon "noyau de connaissances" (composé de NoSQL, d'une BDR, etc).

Le but est de pouvoir éviter le couplage fort modèle/BD imposé par Zend, et ce en faisant que le modèle interagisse non pas avec la BD mais avec un web service (type REST) à la place. Ainsi, l'interface interrogera le web service, et lorsque la structure de données sera modifiée, le site restera fonctionnel.

Parmi toutes les options que tu m'as proposé, la réponse serait 3.

Merci encore pour tes indications ^^

Hors ligne

 

#4 16-02-2016 12:29:29

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

Pour savoir sur quel version de ZF tu es:
http://framework.zend.com/manual/1.12/f … ading.html
et
http://framework.zend.com/manual/curren … rsion.html

Pour moi (on me coupera peut être ^^)
Je ne vois pas le problème de ce que tu appel le couplage Modèle/BD puisque c'est le but du truc ^^

Maintenant, si tu doit centraliser tes opérations en un webservice commun à tes applications, effectivement passer par un webservice est pertinent mais le problème de conception ne va plus être lié à la structure ZF mais plutôt à l'architecture générale de l'appli.

Tu n'aura plus de M dans ton application de rendu.
Pour moi tu a besoin de DTO (Data Transfert Object) qui vont être alimenté par ton webservice (qui sera appelé directement depuis ton Controller [pour faire simple ^^]).

Le modèle va être déplacé dans ton webservice.
(qui peu très bien être réalisé en ZF2 aussi, puisque comme je l'ai dit un peu plus haut.. ZF2 peut tout faire!! ^^)

Hors ligne

 

#5 16-02-2016 13:09:24

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

Après vérification je suis sous Zend version 1.11 hmm

J'ai vu qu'on pouvait développer une API rest grâce à Zend, avec Zend_Rest c'est bien cela?
Le développement de l'API rest ne me fait pas peur, mes questions portent plutôt sur la consommation du web service du côté du site. Dans application/models je vois tout une grande liste de classes qui héritent de Zend_Db_Table_Abstract, et j'ai bien peur de comment je vais faire pour dessouder ces classes de la BD... Et je me demande comment transformer toutes ces classes en une consommation de web service.

As-tu des tutoriels ou/et de la documentation intéressante à me conseiller sur les DTO avec Zend? Google ne m'a pas donné de sources très satisfaisantes ):

Dernière modification par mguillemette (16-02-2016 13:17:53)

Hors ligne

 

#6 16-02-2016 15:07:44

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

Les DTO c'est pas spécifique à ZF ^^

La on est plus sur une question de conception générale plus que du framework en lui même  ^^
Tu peu regarder du cotés des notions telles que le Domain Driven Design, c'est des patterns que je trouve pertinent ^^

Après tu peu très bien faire une api REST avec du Zend effectivement, je n'ai pas vraiment creusé la question mais même sans une module déjà prêt.. Ca peu se faire wink

Hors ligne

 

#7 16-02-2016 23:01:30

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

Bonsoir,

A quel endroit (dans Zend) se situe le code chargé de mettre en persistance dans la BD/récupérer des valeurs de la BD?
Il faudrait que je remplace ce fonctionnement par l'appel de mon web service...

Désolé de vous embêter encore et encore merci pour votre aide tongue

Hors ligne

 

#8 17-02-2016 09:13:50

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

MMmmmhhh...

Hello smile
Je ne vois pas vraiment ce que tu veux faire, le mieux c'est de pas toucher Zend ^^
Rien ne t'oblige de passer par un modèle et de la DBTable.

Pourquoi ne pas simplement utiliser une classe chargé de faire tes appels webservices qui va remplir de "simples objets" correspondant à ton retour ?
Je pense à ça :
http://framework.zend.com/manual/1.12/f … lient.html

PS : pour réaliser ton webservice, tu peu essayer de regarder du cotés de Zend Expressive, je ne l'ai pas encore testé mais il m'a l'air tout à fait adapté pour ce genre d'usage ^^

Hors ligne

 

#9 17-02-2016 10:37:58

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Intéraction modèle - web service

Hello, de ce que j'ai compris tu souhaites que ton application n'utilise plus la bdd mais un service externe (quel qu'il soit).

Tu as deux soucis :
- à l'heure actuelle ton application interroge la bdd
- tu as besoin d'un service rest

Tu ne peux pas avoir les 2 en même temps dans le sens où ton service rest va bien devoir récupérer les informations quelque part donc en bdd visiblement. Ce que je te conseil de faire c'est 2 applications différentes pour éviter de tout casser.
Tu gardes l'application actuelle et à la place de retourner des vues html tu retournes du Json. C'est assez facile à faire. En ZF1 je ne sais plus comment le faire, tu dois avoir une JsonView qui traine quelque part.
Une fois cette étape réalisée ton application existante devient une "api rest", si tu veux vraiment faire les choses proprement reporte toi à la spec histoire de respecter le format des urls. Une api rest doit retourner des resources et en fonction de ça tes urls sont différentes. Par exemple tu veux retourner des resources users ton url va être du genre : http://monapi.fr/users, tu veux retourner un user en particulier ça sera : http://monapi.fr/users/{id}, et éventuellement retourner leurs photos ça va donner : http://monapi.fr/users/{id}/photos etc ...

Ensuite une fois que tu as fait cette refonte tu vas faire une deuxième application qui va être capable de consommer cette api rest. Là rien de plus simple tu as une application classique (tu peux même garder quelque part les vues html de l'application existante pour les réutiliser). Tu utilises une lib qui permet de faire des requêtes http. Je te conseil Guzzle6 qui se configure très facilement avec le ZF2 via composer. Et évidemment pour cette application tu peux utiliser le ZF2 ou Zend Expressive qui est un peu plus light et fera tout aussi bien le job wink.

Edit : A bah flobrflo t'en a parlé aussi wink.

Dernière modification par Orkin (17-02-2016 10:38:36)

Hors ligne

 

#10 18-02-2016 09:11:37

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

Coucou wink

Je vais essayer d'éclaircir mon problème ^^
Je ne veux pas faire une API REST avec Zend, je veux créer une api rest (que j'ai d'ailleurs commencé à faire en node.js) qui fera les opérations CRUD. Cette API sera réalisée à part, dans le langage que je trouve le plus adapté.
Ma question est: comment faire en sorte que Zend "passe" par cette API pour ses opérations CRUD au lieu d’interagir directement avec la BD?

Merci pour vos réponses wink
Je vais regarder Guzzle6 que je connais pas du tout smile
Le but est de garder toutes les vues/contrôleurs de l'appli déjà développée sous Zend wink

Hors ligne

 

#11 18-02-2016 09:16:13

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

Hello.

Et bien, pour faire au plus simple:
tu convertis tes modèles en classes basiques, tu créer une nouvelle classe: sendRestRequest qui contient toutes tes fonctions à appeler (qui vont taper dans ton webservice) et qui renvoient les ex-modèles qui vont bien et qui seront remplis au retour de tes fonctions.
Et chacun de tes controleurs qui utilisaient tes modèles vont maintenant tous taper dans sendRestRequest.

Bon c'est la base du truc, après tu peu trier en fonction de la nature des services, des renvois etc...
Mais l'idée générale c'est ça.

Dernière modification par flobrflo (18-02-2016 09:19:05)

Hors ligne

 

#12 22-02-2016 11:26:40

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Intéraction modèle - web service

Voila et pour consumer ton api rest bah après c'est à toi de savoir comment tu la fais. Est-ce que c'est du json, du xml ou je ne sais quoi d'autre comme format. Là tu as juste à utiliser une lib qui fait des requêtes http pour toi ou utiliser directement curl. Faire un bout de code qui transforme le retour de ton api en objets utilisés par ton application Zend et le tour est joué.

Hors ligne

 

#13 03-03-2016 13:45:08

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

Bonjour,
J'ai donc commencé le développement de l'API, avec un CRUD sur une des tables de la base de données, celle contenant des "Clones".
Finalement je me suis orientée vers un web service en Java avec Jersey, car je devrais sûrement manipuler du RDF (web sémantique) plus tard grâce à ce web service et j'ai déjà utilisé Jena par le passé pour le web sémantique et ça me sera sans aucun doute utile de pouvoir réutiliser cette compétence.
J'interroge le web service Java que j'ai développé grâce à Guzzle. J'ai une page PHP qui peut faire les opérations CRUD liées aux clones, grâce au web service Java.

J'ai donc également crée une classe PHP classique, pour manipuler des objets "Clone".
Je suis toujours dans l'optique de reprendre l'interface Zend existante. Pour cela, je regarde bien sûr comment le code était crée à l'origine pour prévoir l'accès aux clones de la BD.
Je me suis référée à la doc de Zend pour comprendre doucement comment est "construite" la partie modèle de Zend.
D'après une de ces pages ( http://framework.zend.com/manual/1.12/e … model.html ) j’ai cru comprendre que pour faire la partie Modèle de MVC, par exemple pour manipuler des entités d'une table personne, je devais avoir trois classes :

-Une classe définissant la “classe“ au sens classique POO, par exemple:

Code:

[lang=php]class Application_Model_Person {
  protected $_name;
  protected $_age;

  public function setAge($age);
  public function getAge();
  public function setName($name);
  public function getName();
}

-Une classe servant de mapper, par exemple:

Code:

[lang=php]class Application_Model_PersonMapper {
  public function save(Application_Model_Person $person);
  public function find($id);
  public function fetchAll();
}

-Une classe jouant le rôle de table data gateway et héritant de Zend_Db_Table. Par exemple:

Code:

[lang=php]class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {
        /** Table name */
       protected $_name = 'person';
}

Quand je regarde le code du site que je dois modifier, je ne vois que des classes du dernier type (Zend_Db_Table)…
Est-ce que vous auriez une idée de pourquoi? Est-ce que j'ai mal compris la doc?
Dans Application/models je n'ai qu'un dossier Dbtable contenant uniquement des classes qui héritent de Zend_Db_Table.

Si vous avez besoin d'autres précisions je suis bien sûr totalement à votre écoute,
Merci encore,

Dernière modification par mguillemette (03-03-2016 13:46:27)

Hors ligne

 

#14 03-03-2016 15:56:06

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Intéraction modèle - web service

Salut, alors déjà t'es dans une section support sur le ZF2 là c'est du ZF1 donc tu auras difficilement de l'aide puisqu'on ne fait pas de ZF1. Et sur cette partie en particulier très peu de monde utilise Zend_Db mais doctrine 2.

Là ton problème c'est pas lié au Zend framework mais un problème logiciel. Là si tu veux mapper tes réponses de Guzzle sur des objets PHP et bien tu fais une classe basique et tu la remplie en fonction de tes besoins. Tu peux utiliser des hydrateur mais je pense pas que ça soit dispo sur le ZF1.

Hors ligne

 

#15 04-03-2016 11:39:24

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

...Je suis vraiment désolée mais je comprends pas le rapport entre votre réponse et ma question?

Hors ligne

 

#16 05-03-2016 12:49:13

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Intéraction modèle - web service

Et bien c'est simple tu es dans une section du forum où on fait du support sur du ZF2 hors tu utilises le ZF1 donc tu n'es pas dans la bonne section.

Hors ligne

 

#17 07-03-2016 09:19:19

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

Hello smile

Pour faire au plus simple: ton modèle, mapper et dbTable tu les casse pour juste faire une classe qui va utiliser ton guzzle et va renvoyer tes objets de retour.

Pour reprendre l'exemple de Orkin, les gens qui utilisent doctrines n'utilisent pas exactement la même structure de modèle, il faut l'adapter à ton besoin.
Et dans ton cas.. tu n'a pas besoin de modèle puisque c'est ton webservice qui va gérer tout ça ^^

Hors ligne

 

#18 07-03-2016 09:44:33

mguillemette
Nouveau membre
Date d'inscription: 16-02-2016
Messages: 8

Re: Intéraction modèle - web service

Coucou Flobrflo smile

J'aimerais bien pouvoir casser mon modèle, mapper et dbTable mais justement mon souci c'est qu'il n'y a pas ces trois classes, il y a seulement la dbtable... Et je comprends pas comment c'est possible, d'où ma question wink

Hors ligne

 

#19 07-03-2016 10:59:03

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Intéraction modèle - web service

Bah tout dépend comment a été développé ton applicatif au départ, il y a peut être des libertés qui ont été prises.
Mais je ne voit pas en quoi cela pose problème puisque tout cela tu doit simplement le supprimer.. xD

Hors ligne

 

#20 07-03-2016 15:26:45

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Intéraction modèle - web service

Là ce que je te disais c'est de faire simplement une classe normale (qui étend rien du tout, sauf si tu fais une classe abstraite ou une interface pour te simplifier le taf) et ensuite bah c'est simple tu fais par exemple un constructeur qui prend un tableau et dans ton constructeur tu remplies les attributs de ta classe). Là il n'y a absolument rien de complexe et ça n'a rien de lié au ZF.
Le truc DbTable c'est pour gérer les interractions avec une base de données, ce qui n'est pas ton cas.

Hors ligne

 

#21 10-03-2016 11:59:03

Mononi
Nouveau membre
Date d'inscription: 10-03-2016
Messages: 3

Re: Intéraction modèle - web service

"Là ce que je te disais c'est de faire simplement une classe normale (qui étend rien du tout, sauf si tu fais une classe abstraite ou une interface pour te simplifier le taf) et ensuite bah c'est simple tu fais par exemple un constructeur qui prend un tableau et dans ton constructeur tu remplies les attributs de ta classe). Là il n'y a absolument rien de complexe et ça n'a rien de lié au ZF.
Le truc DbTable c'est pour gérer les interractions avec une base de données, ce qui n'est pas ton cas."

C'est aussi la chose qui me parait le plus simple. Tiens nous au courant.

[Edit modérateur : Afin de simplifier la lecture du forum, les platitudes ou messages n'apportant aucun intérêts aux posts seront supprimés, merci d'éviter de spammer les conversations pour rien. Merci.]

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages