Herberth Amaral

Software development adventures

Archive for the ‘PHP’ tag

[Dica] Valide e-mail, IP e URLs no PHP sem regex

with 4 comments

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:

if(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL) )
{
   echo 'Yay!';
}

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!

Written by Herberth Amaral

August 13th, 2010 at 1:21 pm

Posted in PHP

Tagged with ,

Usando o SabreAMF com o CakePHP

with one comment

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)

<?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(&amp;$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:

<?php
// app/controllers/teste_amf_controller.php
class TesteAmfController extends AppController
{
    var $components = array('SabreAmf');

    function hello($nome){
        $ret = "Olá, ".$nome."! agora são: ".date("H:i:s")." horas";
        return  $ret;
    }
}
?>

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:

<?php
// 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:

hello_flex

É 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!

Written by Herberth Amaral

December 15th, 2009 at 7:25 pm