domingo, 17 de maio de 2009

Conheça os Recess! Framework

Recess! Framework Uma das coisas mais fantásticas que eu me deparei na incessante pesquisa sobre Frameworks PHP. O Recess! é incrivel. Fácil, rápido, com uma porrada de excelentes recursos desde o php-apc, jQuery, tratamento de erros, RESTful e DRY desde sempre uma mão na roda, um execelente trabalho. Tanto que já me ofereci para ajudar na documentação e na tradução dela.

Uma amostra dos tramentos de erros....

Recess Diagnostics from Kris Jordan on Vimeo.



Você encontra mais informações e screencasts:
Site do projeto: www.recessframework.org
Ajude da documentação: http://www.recessframework.org/page/how-to-help-document-the-recess-framework
Leia o material disponível: http://www.recessframework.org/book/html/index.html

Leia, entenda, participe vale a pena!

Scrum na prática

Essa palestra é meio longa mas vale a pena cada minuto. Especialmente dedicada a quem quer entender um pouco mais da aplicabilidade desse tal scrum e conhecer um pouco sobre o Manifesto Ágil.
Confira como foi sua adoção na Globo . com.
(Segue o link pq o autour não permitiu embeds :'( ) Scrum na Globo.com - Falando em Agile

terça-feira, 12 de maio de 2009

Tratando retornos no PHP

Depois de quase dois meses de correria, e adptações no novo emprego, finalmente volto a postar.
Esses dias precisei manipular retornos de um JSON em um Controlador. Até aí beleza, fui direto pegar o retorno dele com json_decode, sim porque pensei que era exatamente o inverso da json_encode, que recebe um array como parâmetro e codifica em JSON.
Pois bem, pra minha noobística surpresa, a função json_decode retorna um objeto(!). Pensei comigo, ta ok retorna um objeto, mas Controlador que estou trabalhando devolve os dados como array para a view. E agora? Simples passo o segundo parâmetro da função json_decode como true. Tá mas qual é a graça, seria interessante se eu pudesse usar essa idéia e manipular os retornos de minhas funções ao meu "bel-prazer". Até para poder ter retornos dinâmicos para o mesmo dado. Ora necessito dele como array para a view, Ora com objeto dentro de outro objeto.

Pensei um pouco , googleie e cheguei no seguinte código:

function object2array($object){
$arr = array();
foreach ($object as $i => $val):
$arr[$i] = (is_object($val))? object2array($val) : $val;
endforeach;
return $arr;
}

O que ela faz na real, é uma função recursiva, que percorre o objeto, caso o valor também seja um objeto ela chama ela mesma e trata o próximo nível, e assim sucessivamente. Antes o meu array de teste retornava os dados assim:


stdClass Object
(
[0] => a
[1] => b
[c] => stdClass Object
(
[0] => d
[1] => e
)

)
1

Logo depois consegui o resultado esperado:

Array
(
[0] => a
[1] => b
[c] => Array
(
[0] => d
[1] => e
)

)
1

Mas fui além, queria agora que todos os retornos de meus métodos SEMPRE retornem um Objeto. Até para padronizar a saída. Sei que retornando array está padronizada, mas num array com muitos níveis fica chato de acessar ou trocar valores, por exemplo:

$foo['abr']['lero']['some']['index'] = 2;

Achei muito melhor de acessar assim:

$foo->abr->lero->some->index = 2;

Qual o segredo? Usar um recurso do PHP chamado stdClass. Usada pra induzir tipos, e também para criar classes "OnTheFly", podemos usá-la para fazer uma "engenharia" reversa na função object2array() . Segue o código:

function array2object($array){
$obj = new stdClass();
foreach ($array as $i => $val):
$obj->{$i} = (is_array($val))? array2object($val) : $val;
endforeach;
return $obj;
}

Agora podemos aplicar essa função em quaisquer retornos que quisermos e trabalhar sempre com a "notação" de objetos ( $obj->propriedade ).

E é isso, agora não tem mais desculpa pra tratar os retornos, basta convertê-los e usar a sintaxe mais apropriada.
T+!

PS.: Fica mais uma "dica da dica", caso o array seja indexado numéricamente,
acessar uma propriedade assim:
   $foo->0

causaria um parse_error, porém nesses casos, para acessarmos a propriedade basta coloca-lá entre chaves:
   $foo->{0}

Flw!