Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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.         
  13.         $criteria = new TCriteria;
  14.         $all Vfeed::getObjects$criteria );
  15.         $id 0;
  16.         
  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.             
  23.             foreach($rss->channel as $itens)
  24.             {
  25.                 foreach($itens as $entrada)
  26.                 {
  27.                     if (!empty($entrada->description))
  28.                     {
  29.                         $pos strpos($entrada->description,'<img');
  30.     
  31.                         if ($pos 0)
  32.                         {
  33.                             $copy substr($entrada->description,$posstrlen($entrada->description));
  34.                             $pos strpos($copy,'src="');
  35.                             
  36.                             if ($pos 0){
  37.                                 $pos $pos+5;
  38.                                 $copy substr($copy,$posstrlen($copy));
  39.                                 $length strpos($copy,'"');
  40.                                 $url_image_principal substr($copy,0$length);
  41.                             }
  42.                             $pos strpos($entrada->description'<br />');
  43.                             $copy substr($entrada->description,$pos+6strlen($entrada->description));
  44.                             $descricao substr($copy,0,250).'...';
  45.                             
  46.                             $record['id']                       = ++$id;
  47.                             $record['url_fonte_noticia_id']     = $url->id;
  48.                             $record['rss_fonte_noticia_id']     = $url->rss_fonte_noticia_id;
  49.                             $record['fonte_noticia']            = $url->fonte_noticia;
  50.                             $record['rss_categoria_noticia_id'] = $url->rss_categoria_noticia_id;
  51.                             $record['categoria_noticia']        = $url->categoria_noticia;
  52.                             $record['titulo']                   = $rss->channel->title;
  53.                             $record['descricao']                = $descricao;
  54.                             $record['url_image_canal']          = $url_image_chanel;
  55.                             $record['url_image_principal']      = $url_image_principal;
  56.                             
  57.                             $response[] = $record;
  58.                             
  59.                             //break; Se eu destravar essa linha consigo um retorno com poucas linhas 
  60.                         }
  61.                     }
  62.                 }
  63.             }
  64.         }
  65.         TTransaction::close();
  66.         //var_dump($response); se eu destravar essa linha consigo ver o conteúdo da variável $response
  67.         
  68.         return $response// o método não retorna o valor
  69.     }
  70. }
  71. ?>


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_dumpjson_decodefile_get_contents($url)) );
  9. ?>



Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto 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.         
  12.         // aqui implementar mecanismo de controle !!
  13.         if (!in_array($class, array('DispositivoService','RssService')))
  14.         {
  15.             return json_encode( array('status' => 'error',
  16.                                       'data'   => _t('Permission denied')));
  17.         }
  18.         
  19.         try
  20.         {
  21.             if (class_exists($class))
  22.             {
  23.                 if (method_exists($class$method))
  24.                 {
  25.                     $rf = new ReflectionMethod($class$method);
  26.                     if ($rf->isStatic())
  27.                     {
  28.                         $response call_user_func(array($class$method), $request);
  29.                     }
  30.                     else
  31.                     {
  32.                         $response call_user_func(array(new $class($request), $method), $request);
  33.                     }
  34.                     return json_encode( array('status' => 'success''data' => $response));
  35.                 }
  36.                 else
  37.                 {
  38.                     $error_message TAdiantiCoreTranslator::translate('Method ^1 not found'"$class::$method");
  39.                     return json_encode( array('status' => 'error''data' => $error_message));
  40.                 }
  41.             }
  42.             else
  43.             {
  44.                 $error_message TAdiantiCoreTranslator::translate('Class ^1 not found'$class);
  45. ?>




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.         
  12.         // aqui implementar mecanismo de controle !!
  13.         if (!in_array($class, array('DispositivoService','RssService')))
  14.         {
  15.             return json_encode( array('status' => 'error',
  16.                                       'data'   => _t('Permission denied')));
  17.         }
  18.         
  19.         try
  20.         {
  21.             if (class_exists($class))
  22.             {
  23.                 if (method_exists($class$method))
  24.                 {
  25.                     $rf = new ReflectionMethod($class$method);
  26.                     if ($rf->isStatic())
  27.                     {
  28.                         $response call_user_func(array($class$method), $request);
  29.                     }
  30.                     else
  31.                     {
  32.                         $response call_user_func(array(new $class($request), $method), $request);
  33.                     }
  34.                     return json_encode( array('status' => 'success''data' => $response));
  35.                 }
  36.                 else
  37.                 {
  38.                     $error_message TAdiantiCoreTranslator::translate('Method ^1 not found'"$class::$method");
  39.                     return json_encode( array('status' => 'error''data' => $error_message));
  40.                 }
  41.             }
  42.             else
  43.             {
  44.                 $error_message TAdiantiCoreTranslator::translate('Class ^1 not found'$class);
  45.                 return json_encode( array('status' => 'error''data' => $error_message));
  46.             }
  47.         }
  48.         catch (Exception $e)
  49.         {
  50.             return json_encode( array('status' => 'error''data' => $e->getMessage()));
  51.         }
  52.     }
  53. }
  54. print AdiantiRestServer::run($_REQUEST);
  55. ?>
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.    
  3.    // O método só retorna valor se for um pacote pequeno.
  4.    $btn_ongetFeed $this->form->addAction('Feed', new TAction(['ArquivoList''onGetFeed']), 'fa:plus #69aa46');
  5.   
  6.    public function onGetFeed($parameters)
  7.     {
  8.       $content $this->getFeed($parameters);
  9.       var_dump($content);
  10.     }
  11.     
  12.     
  13.     
  14.     public static function GetFeed$parameters )
  15.     {
  16.         TTransaction::open('GestaoMedia');
  17.         $response = array();
  18.         $record = array(); 
  19.         
  20.         $criteria = new TCriteria;
  21.         $all Vfeed::getObjects$criteria );
  22.         $id 0;
  23.         
  24.         foreach ($all as $url)
  25.         {
  26.             $feed file_get_contents(strtolower($url->url_fonte_noticia));
  27.             $rss = new SimpleXmlElement($feed);
  28.             $url_image_chanel $rss->channel->image->url;
  29.             
  30.             foreach($rss->channel as $itens)
  31.             {
  32.                 foreach($itens as $entrada)
  33.                 {
  34.                     if (!empty($entrada->description))
  35.                     {
  36.                         $pos strpos($entrada->description,'<img');
  37.     
  38.                         if ($pos 0)
  39.                         {
  40.                             $copy substr($entrada->description,$posstrlen($entrada->description));
  41.                             $pos strpos($copy,'src="');
  42.                             
  43.                             if ($pos 0){
  44.                                 $pos $pos+5;
  45.                                 $copy substr($copy,$posstrlen($copy));
  46.                                 $length strpos($copy,'"');
  47.                                 $url_image_principal substr($copy,0$length);
  48.                             }
  49.                             $pos strpos($entrada->description'<br />');
  50.                             $copy substr($entrada->description,$pos+6strlen($entrada->description));
  51.                             $descricao substr($copy,0,250).'...';
  52.                             
  53.                             $record['id']                       = ++$id;
  54.                             $record['url_fonte_noticia_id']     = $url->id;
  55.                             $record['rss_fonte_noticia_id']     = $url->rss_fonte_noticia_id;
  56.                             $record['fonte_noticia']            = $url->fonte_noticia;
  57.                             $record['rss_categoria_noticia_id'] = $url->rss_categoria_noticia_id;
  58.                             $record['categoria_noticia']        = $url->categoria_noticia;
  59.                             $record['titulo']                   = $rss->channel->title;
  60.                             $record['descricao']                = $descricao;
  61.                             $record['url_image_canal']          = $url_image_chanel;
  62.                             $record['url_image_principal']      = $url_image_principal;
  63.                             
  64.                             $response[] = $record;
  65.                             //Se eu destravar essa linha consigo um retorno com poucas linhas
  66.                             //break;  
  67.                         }
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.         TTransaction::close();
  73.         //se eu destravar essa linha abaixo consigo ver o conteúdo da variável $response
  74.         //var_dump($response); 
  75.         
  76.         return $response// o método não retorna o valor
  77.     }
  78. ?>
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.