Archive for the ‘PHP’ tag
[Dica] Valide e-mail, IP e URLs no PHP sem regex
Eu vejo muita gente utilizando regex (expressão regular) para validar vários tipos de dados, incluindo emails, tipos (boolean, string e int), sanitizar dados (remover caracteres inválidos, por exemplo) no PHP. Este tipo de coisa é um saco para quem não saca muito de regex, mas é possível fazer todas estas validações sem o uso de regex utilizando as funções da família filter:
Há vários outros filtros que você pode experimentar com esta função super útil e nunca mais precisar lembrar daquela regex chata de email ![]()
Happy coding!
[Update]
Esqueci de mencionar: Estas funções estão disponíveis a partir do PHP 5.2.0. Valeu, Almir Mendes!
Usando o SabreAMF com o CakePHP
O AMF é um formato aberto de comunicação do Flash. É o formato preferido para tais aplicações por possuir diversas vantagens, sendo que a principal delas é a velocidade, já que o AMF não precisa ser deserializado como o XML e o JSON.
Por ser um formato aberto, ele pode ser implementado em qualquer linguagem. Há várias implementações para o PHP, sendo que as mais notáveis são o AMFPHP, Zend_AMF e o SabreAMF.
Neste tutorial, eu mostrarei como desenvolver aplicações em PHP com o framework CakePHP que se comunicam com o Flash (usando a plataforma Flex 3) através da biblioteca SabreAMF.
1- Baixando e instalando os componentes
1 – Baixe os CakePHP 1.2.5 no site do CakePHP e o SabreAMF no Google Code.
2- Instale o CakePHP de forma que ele fique disponível em http://localhost/cakeflex.
3 – Descompacte o SabreAmf em app/vendors/SabreAMF
2 – Colocando os dois para trabalhar
Para fazer com que o CakePHP trabalhe de forma transparente com o SabreAMF, é necessário criar um componente para o CakePHP.
Para tal, vamos criar o nosso componente: (salve-o em app/controllers/components/sabre_amf.php)
set_include_path(APP.'vendors' . PATH_SEPARATOR . get_include_path());
App::import('Vendor', 'SabreAMF_CallbackServer', array('file'=>'SabreAMF/CallbackServer.php'));
class SabreAmfComponent extends Object {
function startup(&$controller) {
if ($controller->action == 'gateway') {
global $_cakeController;
$_cakeController = $controller;
Configure::write('debug', 0);
$controller->autoRender = false;
$server = new SabreAMF_CallbackServer();
$server->onInvokeService = array($this,'amfCallBack');
$server->exec();
exit;
}
else if(empty($controller->amfExclude) ||
!in_array($controller->action,$controller->amfExclude))
exit();
}
function amfCallBack($service, $method, $data) {
global $_cakeController;
$res = null;
if ($_cakeController) {
if (strpos($method, "_") !== 0) {
if (method_exists($_cakeController, $method) and
!in_array($_cakeController->action,$_cakeController->amfExclude))
$res = call_user_func_array( array( $_cakeController, $method ), $data );
else
$res = "Action nao encontrada.";
} else
$res = "Nome de metodo invalido.";
}
else
$res = "Controller nao encontrado.";
return $res;
}
}
?>
O que nós fizemos acima foi redirecionar todas as chamadas à action ‘gateway’ do controller para nosso gateway do SabreAMF.
Agora, um exemplo de como utilizar isso em um controller:
Nosso server side não estaria completo sem o nosso model. No meu caso, como é só uma demonstração, eu não quero criar uma tabela no banco de dados. Portanto, eu crio o meu model dessa forma:
// app/models/teste_amf.php
class TesteAmf extends AppModel
{
var $useTable = false;
}
?>
Para demonstrar nosso código funcionado, nada melhor que uma aplicação Flex. Segue abaixo, um exemplo de como a configuração criada acima pode ser usada no Flex:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:RemoteObject
endpoint="http://localhost/cakeflex/teste_amf/gateway"
id="rmoTeste"
source=""
destination="minhaApp"
result="rmoTesteResult(event)"
fault="rmoTesteFail(event)"
showBusyCursor="true"
/>
<mx:Button label="Hello!" click="rmoTeste.hello('Herberth')" />
<mx:Script>
< ![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
public function rmoTesteResult(e:ResultEvent):void
{
Alert.show(e.result.toString());
}
public function rmoTesteFail(e:FaultEvent):void
{
Alert.show("Fail!");
}
]]>
</mx:Script>
</mx:Application>
4 – Conclusão
O resultado final deve ficar parecido com isso:

É possível retornar tipos mais complexos para serem usados em tipos mais complexos (tipo AdvancedDataGrid), mas irei abordar tal aplicação mais futuramente.
5 – Referências
É isso aí pessoal. Até a próxima!
