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

ZendCon '08 - Day One

ZendCon '08 - Day One

  • September 16, 2008

So its end of Day One here at ZendCon, let’s do a quick re-cap.

Read More
PHPNW12 - One Conference, so much good stuff

PHPNW12 - One Conference, so much good stuff

  • October 10, 2012

This year I spent more time replying “I don’t know yet” to people who were asking if I was going to PHPNW12 then I did submitting to conferences. I think 75% of all the prominent members of the European Community told me at one point or another that i simply could not miss this conference. After stalling everyone for a while until I sorted out other problems i finally decided (yes, on the week before the conference) that I should go and got budget approval from my employers.

Read More
Land ho! New challenge ahead.

Land ho! New challenge ahead.

  • June 30, 2016

A few months ago I posted about the situation at my former company and the uncertain future of our team. During these 3 months we explored many new opportunities and interviewed with many companies, from startups to consolidated giants, from financial market to education and user feedback, it was an amazing journey.

Read More