Usando o PHP-SDK para rodar FQL na API do Facebook

Desde a migração do Facebook para a nova Graph API e o protocolo OAuth 2.0, sua documentação para desenvolvedores virou uma grande confusão, sem eira nem beira, de artigos depreciados, e isso se eu for otimista. O problema é que muitos artigos antigos ainda apontam para práticas não mais recomendadas e muitos deles não possuem alertas sobre estas mudanças, em casos extremos funções que em breve serão removidas da API ainda não possuem equivalentes nas novas APIs.

As novas bibliotecas, ou SDKs, seguem o velho ditado do “filho de peixe, peixinho é”. Embora estejam novas e com cheirinho de carro novo, a documentação de como utlizar elas eficientemente está vaga, ausente ou espalhada em diversos blogs, como este, em posts de usuários que querem compartilhar a informação com futuros sofredores desenvolvedores ou apenas ter a anotação para uso posterior.

Então isto se trata de um exemplo desta situação, tenho usado os novos recursos e as novas bibliotecas e tenho tido diversas dificuldades, portanto decidi começar a colocar algumas destas coisas em meu blog, por dois motivos: espalhar a informação, e ter anotações pra eu me lembrar depois.

Como posso executar queries em FQL usando a nova SDK?

FQL é a alternativa do Facebook para o SQL, permitindo que você busque dados como se estivesse acessando um banco de dados gigante, esta documentação felizmente ainda esta atualizada e você pode ver uma lista de “tabelas” de onde pode buscar informações, o restante dos truques você vi aprendendo enquanto usa.

Na biblioteca antiga, baseada na API REST, era bem simple rodar uma FQL:

 $facebook->api\_client->fql\_query("SELECT uid, pic, pic\_square, name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = 111111111)"); 

Porém isto (e muitos outros métodos) não está mais disponivel na nova PHP SDK então eu demorei um bucado de tempo para descobrir como poder enviar uma requisição de execução de uma FQL, já que o único método disponível era o api(), um método polimorfíco e não-documentado. Eu finalmente achei a resposta em um blog semelhante ao meu , com alguém que teve a mesma experiência. A requisição é feita assim:

 <?php //Get Facebook SDK Object $config = array( 'appId' => APP\_ID, 'secret' => API\_SECRET, 'cookie' => true, );

$facebook = new Facebook($config);

//Create Query $params = array( 'method' => 'fql.query', 'query' => "SELECT uid, pic, pic\_square, name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = 111111111)", );

//Run Query $result = $facebook->api($params); ?> 

Uma vez que você finalmente descobre que deve passar o parametro “method” para definir o método da API que pode ser executado, e ai descobre que deve passar sua busca em um parametro chamado “query”, você tem a faca e o queijo na mão. Não preciso nem dizer que isso pode demorar um pouco mais do que esperado.

No meu ponto de vista este pedaço de código porém é horrivel, não gosto de criar arrays para poder passar parametros para uma função, cada vez que for rodar ela. Então decidi que para usar essa SDK corretamente eu ia precisar extender ela e implementar algumas correções, neste caso um Helper Method para FQL. Veja como ficou:

 <?php

namespace App\\Facebook;

include\_once \\ROOT\_PATH . 'library/vendor/facebook/facebook.php';

class Client extends \\Facebook { private $config; private $reqPerms;

/\*\* \* Runs a FQL query agains the API \* \* @param string $query \* @return array \*/ public function fql($query) { $params = array( 'method' => 'fql.query', 'query' =>$query, );

return $this->api($params); }

} $config = array(/\* insert config here \*/);

//Using client $fb = new App\\Facebook\\Client($config);

$query = "SELECT uid, pic, pic\_square, name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = 111111111)"; $result = $fb->fql($query);

?> 

Isso faz chamar uma FQL rápido e simples, além de te dar a vantagem de ter a SDK embrulhada dentro do seu próprio namespace e, de bonus, ter uma forma mais simples de mockar e testar código relacionado, isso porque temos agora um método para mockar e não mais nos preocupar com paramentros passados.

Eu dei um passo além e aproveitando que o SDK esta no GitHub, comitei esta alteração em um pull request . Ele ainda não foi aceito, mas espero que ele seja em breve e que mais pessoas possam se beneficiar com ele.

Espero que gostem e que isso lhe dê mais ideias de como melhorar o uso da nova SDK e eu voltarei em breve com mais dicas.

comments powered by Disqus

Related Posts

A study on RSS - Part 1 XML DOM

A study on RSS - Part 1 XML DOM

  • July 15, 2006

RSS, today someone asked me, “what is this?” Well, I know what it is, but at that moment the words failed me, especially the “non-programmer” words, so as to explain to “the common folk” the true meaning of it and some of its uses.

Read More
Microsoft Web Developer Summit 2009 in review

Microsoft Web Developer Summit 2009 in review

  • December 4, 2009

This year I was honored to be invited to participate as a member of the PHP Community in Microsoft’s Web Developer Summit, so I took it upon myself to represent the huge PHP community in Brazil and bring on our opinions and beliefs.

Read More
Automação Residencial usando PHP

Automação Residencial usando PHP

  • January 18, 2007

Ao concluir meu curso de graduação, Engenharia da Computação, desenvolvi este projeto final. Desde que iniciei o blog me prometi postar um artigo sobre o mesmo e disponibilizar o projeto na sua integridade, então agora sim cumpro minha promessa.

Read More