Back-End

23 dez, 2010

Detectando requisições Ajax com PHP

Publicidade

É bem comum trabalharmos com requisições Ajax que batem em um servidor rodando alguma aplicação PHP.
O problema é que às vezes utilizamos o mesmo método para atender tanto a
arquitetura do seu sistema quanto as requisições que são feitas via Ajax.

Por exemplo, temos um objeto PHP que tem como objetivo recuperar todas as notícias cadastradas na base de dados.

<?php
class MinhaClasse {
public function getAllNews(){
// implementação para receber as notícias

return $news;
}
}
?>

Como fazer para que este mesmo método consiga suprir as requisições Ajax sem que seja necessário criar outro?

É bem comum vermos por aí programadores criando dois objetos
diferentes para atender as duas necessidades: aplicação e Ajax. A única diferença entre eles é como o método retorna.

Podemos utilizar o mesmo método e fazer com que retorne de forma diferente dependendo de como estamos chamando o método.

Vamos criar um método chamado isAjax():

public function isAjax(){
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}

Funciona de forma simples: sempre que uma requisição Ajax é disparada, um header é setado nesta requisição chamada HTTP_X_REQUESTED_WITH, e o valor dela é setado como XMLHttpRequest.

Dessa forma, a nossa classe ficaria assim:

<?php
class MinhaClasse {
public function isAjax(){
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
public function getAllNews(){
// implementação para receber as notícias
// ..

// se o metodo for invocado via Ajax, retorne um JSON
if($this->isAjax()) {
echo json_encode($news);
} else {
return $news;
}

}
}
?>

Veja que se a requisição for feita via Ajax, o método vai dar um echo JSON de $news. Se o método for invocado de qualquer outra forma, ele irá retornar normalmente.

É isso, artigo rápido. Até a próxima!