Problema com retorno de classe do tipo service Olá amigos! Estou criando uma classe chamada RSSService com um método chamado getFeed que me retorna um array com várias notícias de fontes cadastradas. Já reparei que tudo funciona bem se o volume de notícias for pequeno. Mas o que me intriga é que a variável $response está com o conteúdo mas se eu pedir o return da mesma ela retorna null. Já passaram por isso? Segue códigos ...
GO
Problema com retorno de classe do tipo service  
Olá amigos!
Estou criando uma classe chamada RSSService com um método chamado getFeed que me retorna um array com várias notícias de fontes cadastradas. Já reparei que tudo funciona bem se o volume de notícias for pequeno. Mas o que me intriga é que a variável $response está com o conteúdo mas se eu pedir o return da mesma ela retorna null.

Já passaram por isso?
Segue códigos para entenderem a rotina.


 
  1. <?php
  2. class RssService
  3. {
  4. /**
  5. * Retorna uma relação de notícias de acordo com as fontes cadastradas
  6. */
  7. public static function getFeed( $parameters )
  8. {
  9. TTransaction::open('GestaoMedia');
  10. $response = array();
  11. $record = array();
  12. $criteria = new TCriteria;
  13. $all = Vfeed::getObjects( $criteria );
  14. $id = 0;
  15. foreach ($all as $url)
  16. {
  17. $feed = file_get_contents(strtolower($url->url_fonte_noticia));
  18. $rss = new SimpleXmlElement($feed);
  19. $url_image_chanel = $rss->channel->image->url;
  20. foreach($rss->channel as $itens)
  21. {
  22. foreach($itens as $entrada)
  23. {
  24. if (!empty($entrada->description))
  25. {
  26. $pos = strpos($entrada->description,'<img');
  27. if ($pos > 0)
  28. {
  29. $copy = substr($entrada->description,$pos, strlen($entrada->description));
  30. $pos = strpos($copy,'src="');
  31. if ($pos > 0){
  32. $pos = $pos+5;
  33. $copy = substr($copy,$pos, strlen($copy));
  34. $length = strpos($copy,'"');
  35. $url_image_principal = substr($copy,0, $length);
  36. }
  37. $pos = strpos($entrada->description, '<br />');
  38. $copy = substr($entrada->description,$pos+6, strlen($entrada->description));
  39. $descricao = substr($copy,0,250).'...';
  40. $record['id'] = ++$id;
  41. $record['url_fonte_noticia_id'] = $url->id;
  42. $record['rss_fonte_noticia_id'] = $url->rss_fonte_noticia_id;
  43. $record['fonte_noticia'] = $url->fonte_noticia;
  44. $record['rss_categoria_noticia_id'] = $url->rss_categoria_noticia_id;
  45. $record['categoria_noticia'] = $url->categoria_noticia;
  46. $record['titulo'] = $rss->channel->title;
  47. $record['descricao'] = $descricao;
  48. $record['url_image_canal'] = $url_image_chanel;
  49. $record['url_image_principal'] = $url_image_principal;
  50. $response[] = $record;
  51. //break; Se eu destravar essa linha consigo um retorno com poucas linhas
  52. }
  53. }
  54. }
  55. }
  56. }
  57. TTransaction::close();
  58. //var_dump($response); se eu destravar essa linha consigo ver o conteúdo da variável $response
  59. return $response; // o método não retorna o valor
  60. }
  61. }
  62. ?>


Nessa pagina eu testo a URL

 
  1. <?php
  2. $location = 'http://localhost/gestaomedia/rest.php';
  3. $parameters = array();
  4. $parameters['class'] = 'RssService';
  5. $parameters['method'] = 'getFeed';
  6. $url = $location . '?' . http_build_query($parameters);
  7. echo $url.'<br>';
  8. var_dump( json_decode( file_get_contents($url)) );
  9. ?>



Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (8)


NR

Poste o código do rest.php
GO

Olá Nataniel!

Seguindo um conselho do Pablo eu implentei esse método em uma classe control e tenho o mesmo problema, o retorno fica nulo. :/

Estou tentando instalar o xdebug no netbeans para tentar descobrir o problema.
Segue o código do Rest.php.

 
  1. <?php
  2. // initialization script
  3. require_once 'init.php';
  4. class AdiantiRestServer
  5. {
  6. public static function run($request)
  7. {
  8. $class = isset($request['class']) ? $request['class'] : '';
  9. $method = isset($request['method']) ? $request['method'] : '';
  10. $response = NULL;
  11. // aqui implementar mecanismo de controle !!
  12. if (!in_array($class, array('DispositivoService','RssService')))
  13. {
  14. return json_encode( array('status' => 'error',
  15. 'data' => _t('Permission denied')));
  16. }
  17. try
  18. {
  19. if (class_exists($class))
  20. {
  21. if (method_exists($class, $method))
  22. {
  23. $rf = new ReflectionMethod($class, $method);
  24. if ($rf->isStatic())
  25. {
  26. $response = call_user_func(array($class, $method), $request);
  27. }
  28. else
  29. {
  30. $response = call_user_func(array(new $class($request), $method), $request);
  31. }
  32. return json_encode( array('status' => 'success', 'data' => $response));
  33. }
  34. else
  35. {
  36. $error_message = TAdiantiCoreTranslator::translate('Method ^1 not found', "$class::$method");
  37. return json_encode( array('status' => 'error', 'data' => $error_message));
  38. }
  39. }
  40. else
  41. {
  42. $error_message = TAdiantiCoreTranslator::translate('Class ^1 not found', $class);
  43. ?>




NR

Esse trecho está no final do arquivo rest?
 
  1. <?php
  2. print AdiantiRestServer::run($_REQUEST);
  3. ?>

Já tentou chamar a url diretamente pelo browser e analisar o retorno?
GO

Olá!
Meu arquivo rest.php é esse que postei por último. Nesse arquivo não encontrei essa linha.
Sobre colocar a URL e testar o retorno, sim, já fiz mas acontece a mesma coisa.
Repare no código que tenho um linha com um break comentado. Se eu destravar essa linha obrigando o código a enviar um retorno menor ai sim a função retorna o valor certo.
GO

Cara, que louco!
Dei algum vacilo aqui.
segue o código completo do arquivo Rest.php

 
  1. <?php
  2. // initialization script
  3. require_once 'init.php';
  4. class AdiantiRestServer
  5. {
  6. public static function run($request)
  7. {
  8. $class = isset($request['class']) ? $request['class'] : '';
  9. $method = isset($request['method']) ? $request['method'] : '';
  10. $response = NULL;
  11. // aqui implementar mecanismo de controle !!
  12. if (!in_array($class, array('DispositivoService','RssService')))
  13. {
  14. return json_encode( array('status' => 'error',
  15. 'data' => _t('Permission denied')));
  16. }
  17. try
  18. {
  19. if (class_exists($class))
  20. {
  21. if (method_exists($class, $method))
  22. {
  23. $rf = new ReflectionMethod($class, $method);
  24. if ($rf->isStatic())
  25. {
  26. $response = call_user_func(array($class, $method), $request);
  27. }
  28. else
  29. {
  30. $response = call_user_func(array(new $class($request), $method), $request);
  31. }
  32. return json_encode( array('status' => 'success', 'data' => $response));
  33. }
  34. else
  35. {
  36. $error_message = TAdiantiCoreTranslator::translate('Method ^1 not found', "$class::$method");
  37. return json_encode( array('status' => 'error', 'data' => $error_message));
  38. }
  39. }
  40. else
  41. {
  42. $error_message = TAdiantiCoreTranslator::translate('Class ^1 not found', $class);
  43. return json_encode( array('status' => 'error', 'data' => $error_message));
  44. }
  45. }
  46. catch (Exception $e)
  47. {
  48. return json_encode( array('status' => 'error', 'data' => $e->getMessage()));
  49. }
  50. }
  51. }
  52. print AdiantiRestServer::run($_REQUEST);
  53. ?>
GO

Eu não creio que o problema esteja o arquivo rest.php pois implementei esse método em uma classe control e ela apresenta o mesmo comportamento. Retorna null mesmo que a variável $response tenha valor. Mas lembrando que se o conteúdo for pequeno ela retorna o valor corretamente.
GO

Método implementado em uma classe control:

 
  1. <?php
  2. // O método só retorna valor se for um pacote pequeno.
  3. $btn_ongetFeed = $this->form->addAction('Feed', new TAction(['ArquivoList', 'onGetFeed']), 'fa:plus #69aa46');
  4. public function onGetFeed($parameters)
  5. {
  6. $content = $this->getFeed($parameters);
  7. var_dump($content);
  8. }
  9. public static function GetFeed( $parameters )
  10. {
  11. TTransaction::open('GestaoMedia');
  12. $response = array();
  13. $record = array();
  14. $criteria = new TCriteria;
  15. $all = Vfeed::getObjects( $criteria );
  16. $id = 0;
  17. foreach ($all as $url)
  18. {
  19. $feed = file_get_contents(strtolower($url->url_fonte_noticia));
  20. $rss = new SimpleXmlElement($feed);
  21. $url_image_chanel = $rss->channel->image->url;
  22. foreach($rss->channel as $itens)
  23. {
  24. foreach($itens as $entrada)
  25. {
  26. if (!empty($entrada->description))
  27. {
  28. $pos = strpos($entrada->description,'<img');
  29. if ($pos > 0)
  30. {
  31. $copy = substr($entrada->description,$pos, strlen($entrada->description));
  32. $pos = strpos($copy,'src="');
  33. if ($pos > 0){
  34. $pos = $pos+5;
  35. $copy = substr($copy,$pos, strlen($copy));
  36. $length = strpos($copy,'"');
  37. $url_image_principal = substr($copy,0, $length);
  38. }
  39. $pos = strpos($entrada->description, '<br />');
  40. $copy = substr($entrada->description,$pos+6, strlen($entrada->description));
  41. $descricao = substr($copy,0,250).'...';
  42. $record['id'] = ++$id;
  43. $record['url_fonte_noticia_id'] = $url->id;
  44. $record['rss_fonte_noticia_id'] = $url->rss_fonte_noticia_id;
  45. $record['fonte_noticia'] = $url->fonte_noticia;
  46. $record['rss_categoria_noticia_id'] = $url->rss_categoria_noticia_id;
  47. $record['categoria_noticia'] = $url->categoria_noticia;
  48. $record['titulo'] = $rss->channel->title;
  49. $record['descricao'] = $descricao;
  50. $record['url_image_canal'] = $url_image_chanel;
  51. $record['url_image_principal'] = $url_image_principal;
  52. $response[] = $record;
  53. //Se eu destravar essa linha consigo um retorno com poucas linhas
  54. //break;
  55. }
  56. }
  57. }
  58. }
  59. }
  60. TTransaction::close();
  61. //se eu destravar essa linha abaixo consigo ver o conteúdo da variável $response
  62. //var_dump($response);
  63. return $response; // o método não retorna o valor
  64. }
  65. ?>
GO

Acabei de descobrir que o problema estava na minha instalação do PHP. Reinstalei e passou a funcionar Vou fazer mais alguns testes e encerro o tópico caso o problema tenho realmente acabado.