Foros del Web » Programando para Internet » PHP » Zend »

Servicio web

Estas en el tema de Servicio web en el foro de Zend en Foros del Web. Hola, estoy desarrollando un proyecto en Zend, estructurado en módulos; he creado un servicio web muy sencillo al estilo del que viene en el manual ...
  #1 (permalink)  
Antiguo 05/03/2012, 05:45
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 12 años, 10 meses
Puntos: 3
Servicio web

Hola, estoy desarrollando un proyecto en Zend, estructurado en módulos; he creado un servicio web muy sencillo al estilo del que viene en el manual (http://framework.zend.com/manual/en/...st.server.html) mi pregunta, es la siguiente, debería crear un nuevo módulo para el tema de los servicios web o debería englobarlo dentro de uno ya existente?

En caso, de crear un nuevo módulo, qué estructura de ficheros debería tener?

Gracias.
  #2 (permalink)  
Antiguo 05/03/2012, 05:55
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Servicio web

Que tal castrovega7,

Teniendo en cuenta lo que es un modulo en Zend 1.x es una cuestión de preferencias, personalmente lo separaría por modulo(sin tener en cuenta el contexto talves en el de tu app tenga mas sentido un modulo aparte).

Cita:
En caso, de crear un nuevo módulo, qué estructura de ficheros debería tener?
Independientemente del fin del modulo siempre deberia tener la estructura estándar http://framework.zend.com/manual/en/...r.introduction

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 05/03/2012, 06:09
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Servicio web

Entiendo, pero según veo en la documentación, entiendo lo siguiente, por un lado tendremos un controller con un action determinado que haría esto

Código PHP:
Ver original
  1. $server = new Zend_Rest_Server();
  2. $server->setClass('My_Service_Class');
  3. $server->handle();

Siendo "My_Service_Class" la clase que contiene definidas las funciones del servicio web que pueden ser llamadas, esta clase donde debería estar, en models?¿ o en nueva carpeta?

A lo mejor no estoy entiendo bien el problema, que puede ser, ya que es la primera vez que uso Zend_Rest, si me estoy equivocando respecto al funcionamiento por favor, corrígeme :D

Gracias.
  #4 (permalink)  
Antiguo 05/03/2012, 06:19
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Servicio web

Siendo justo tienes razón falta gente en la estructura :P, para aprovechar el autoloader la carpeta services debe estar a la misma altura que models, controllers, etc... y se corresponde al namespace Service

Código PHP:
Ver original
  1. controllers
  2.     FooController.php
  3. models
  4.    mappers
  5.        Foo.php
  6.        Bar.php
  7.    Foo.php
  8.    Bar.php
  9. services
  10.    Foo.php(Application_Service_Foo)
  11.    Bar.php(Application_Service_Bar)

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 05/03/2012, 06:21
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Servicio web

Gracias, en cuanto pueda lo pruebo y postearé el resultado para quien lo necesite.

Saludos.
  #6 (permalink)  
Antiguo 06/03/2012, 04:26
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Servicio web

Tengo una duda respecto a lo que comentabamos:

Si tengo la estructura siguiente siendo webservice el módulo y Mywebservice la clase que implemente las diferentes funciones:

webservice/
controllers/
webservicecontroller.php
models/
services/
Mywebservice.php


Y en el controlador tengo un action con este contenido:

Código PHP:
Ver original
  1. $server = new Zend_Rest_Server();
  2. $server->setClass('My_Service_Class');
  3. $server->handle();

Cómo he realizar el "setClass('My_Service_Class');" para indicar que la clase que ha de setear es la que se encuentra en "webservice/services/Mywebservice.php


Gracias.
  #7 (permalink)  
Antiguo 06/03/2012, 04:55
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Servicio web

Vos seteas la clase el autoloader hace el resto, a través del nombre de la clase mapea el path, si el service esta en el modulo webservice, la clase se llamara Webservice_Service_Class, y el path sera webservice/services/class.php, esto asume que el modulo tiene un Bootstrap que extiende de Zend_Application_Module_Bootstrap, sino tienes que setear el autoloader para el modulo en el Bootstrap principal, es el mismo principio que utiliza el fw para modelos, controllers, mappers, etc...

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 11/03/2012, 08:51
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Servicio web

Hola, sigo teniendo problemas al respecto:

he creado un módulo, de nombre "webservices" con la siguiente estructura:

webservices/
controllers/
WebservicesController.php
services/
Mywebservices.php
views/
Bootsrap.php

Este es el código del controlador:
Código PHP:
Ver original
  1. class Webservices_WebservicesController extends Zend_Controller_Action
  2. {
  3.    
  4.     public function init(){}
  5.    
  6.     public function indexAction(){
  7.        
  8.         $server = new Zend_Rest_Server();
  9.         $server->setClass('Mywebservices');
  10.         $server->handle();
  11.        
  12.     }
  13.    
  14. }

Esta es la clase que contiene las funciones que se llamarán a través del servicio:

Código PHP:
Ver original
  1. class Webservices_Service_Mywebservices
  2. {
  3.    
  4.     public function gettmx($proyecto, $version)
  5.     {
  6.         //...Aqui va el codigo de la funcion
  7.     }
  8. }

El caso es que cuando llamo a la acción, obtengo el siguiente error y no comprendo por qué...


Código:
An error occurred
Application error
Exception information:

Message: Invalid class or object passed to attachClass()
Stack trace:

#0 /var/www/Zend/trobador/library/Zend/Rest/Server.php(301): Zend_Server_Reflection::reflectClass('Mywebservices', Array)
#1 /var/www/Zend/trobador/application/modules/webservices/controllers/WebservicesController.php(13): Zend_Rest_Server->setClass('Mywebservices')
#2 /var/www/Zend/trobador/library/Zend/Controller/Action.php(513): Webservices_WebservicesController->indexAction()
#3 /var/www/Zend/trobador/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#4 /var/www/Zend/trobador/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#5 /var/www/Zend/trobador/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#6 /var/www/Zend/trobador/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#7 /var/www/Zend/trobador/public/index.php(33): Zend_Application->run()
#8 {main}  

Request Parameters:

array (
  'module' => 'webservices',
  'controller' => 'webservices',
  'action' => 'index',
  'method' => 'getTmx',
  'proyecto' => 'Proyecto',
  'version' => '1.0',
)

Alguna idea?


Gracias.
  #9 (permalink)  
Antiguo 11/03/2012, 08:59
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Servicio web

El nombre de la clase a es Webservices_Service_Mywebservices no Mywebservices
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 11/03/2012, 09:05
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Servicio web

Tienes razón, así funciona perfectamente.

Muchas gracias.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:13.