Rotas simples com Silex

O barato do Silex é que ele é realmente muito simples de se iniciar uma aplicação. Mas conforme a mesma vai crescendo, e consecutivamente, o número de páginas e rotas vai aumentando, fica realmente um saco toda hora ter que alterar o código para adicionar ou remover rotas.

Como o Silex é baseado em componentes do Symfony, nada mais prático que utilizar o componente de rotas dele para facilitar nossa vida, não é mesmo?

Então, vamos direto ao ponto.

Começamos instalando as bibliotecas necessárias, adicionando as linhas no composer.json do projeto:

composer require symfony/yaml:~2.6 symfony/config:~2.6

Pronto, isso é tudo que precisamos para trabalhar com as rotas. Agora, vamos fazer a leitura dos arquivos com as nossas rotas definidas:

<?php
...
use Symfony\Component\Routing\Loader\YamlFileLoader as RoutingFileLoader;
use Symfony\Component\Routing\RouteCollection;
...

$routesPath    = __DIR__ . DIRECTORY_SEPARATOR . 'routes';

$app['routes'] = $app->extend(
    'routes',
    function (RouteCollection $routes) use ($routesPath) {
        $loader     = new RoutingFileLoader(new FileLocator($routesPath));
        $collection = $loader->load('routes.yml');

        $routes->addCollection($collection);

        return $routes;
    }
);

...

O arquivo de rotas (routes/routes.yml)

# album route
album:
    prefix: /album
    resource: routes.album.yml
...

E um exemplo de rotas (routes/album.yml):

# album route
album.home:
    path: /
    defaults: { _controller: 'Application\Controller\Album::get' }
    methods: [GET]

album.view:
    path: /{id}
    defaults: { _controller: 'Application\Controller\Album::view' }
    methods: [GET]
    requirements:
      id: \d+

album.create:
    path: /
    defaults: { _controller: 'Application\Controller\Album::post' }
    methods: [POST]

album.update:
    path: /{id}
    defaults: { _controller: 'Application\Controller\Album::put' }
    methods: [PUT]
    requirements:
      id: \d+

album.delete:
    path: /{id}
    defaults: { _controller: 'Application\Controller\Album::delete' }
    methods: [DELETE]
    requirements:
      id: \d+

E está feito, agora é só ir criando duas rotas direto no YAML respectivo. ;)


Porque NÃO comprar um Samsung Galaxy Gran Prime Duos

Início do mês de Abril, decidi trocar meu MotoG, que estava com a tela quebrada e apresentando vários problemas por um celular novo. Fui até o shopping e escolhi a melhor opção (custo + benefício) pra mim. A apresentação da vendedora foi ótima e o celular, um Galaxy Gran Prime Duos me pareceu uma ótima opção e resolvi levar o mesmo pra casa.

Após pouco mais de uma semana de utilização, vi que o celular apresentava muitos problemas, como travamentos constantes e tudo mais. Optei por efetuar um reset de fábrica, e não adiantou. O celular vem repleto de aplicativos inúteis instalados pela Oi do qual não é possível remover. Após dois resets, decidi enviar um e-mail para a Samsung afim de demonstar minha insatisfação com o produto, já que isso não é um problema coberto pela garantia.

Abaixo, uma cópia do e-mail que enviei pelo site deles:

Olá :)
Comprei um celular Galaxy Gran Prime Duos SM-G530H início deste mês por ser até então, um cliente satisfeito com os produtos dos senhores, tanto que minha última aquisição, havia sido um ChromeBook na loja física dos senhores em Florianópolis. Porém, menos de um mês após a compra do celular, sinto-me profundamente arrependido da aquisição, pois o produto demonstra-se infinitamente inferior a muitos celulares, inclusive ao meu último (um Moto G) de preço bem semelhante.

Repetindo, menos de um mês após a compra, já achei necessário formatar o celular para as configurações de fábrica DUAS vezes devido aos constantes travamentos, mesmo com poucos aplicativos abertos (uso basicamente Whatsapp, Facebook e E-mail) a extrema demora para obter respostas (o celular por muitas vezes, fica parado em uma tela preta, sem responder quaisquer comandos dos botões físicos ou _quotvirtuais_quot).

Fora que, apesar de ter comprado o mesmo em uma loja (Colombo), o mesmo veio como se fosse da Operadora Oi, com inúmeros aplicativos inúteis instalados e que não possibilitam a desinstalação sem que eu faça root do aparelho.

Infelizmente, sinto que joguei dinheiro fora com este aparelho, e espero tão logo quanto possível, efetuar a troca do mesmo. Sendo que sinceramente, o que eu mais desejava, era o meu dinheiro de votla :(

Fica aqui registrado, o profundo descontentamento de um consumidor decepcionado por gastar um valor significável em um produto, que demonstrou-se de péssima qualidade.

Alguns dias depois, recebo uma resposta dos mesmos e monstro abaixo:

Resposta do consultor
Olá, Thiago,

Obrigada por acessar o site Samsung, é uma enorme satisfação tê-lo como cliente.

Segue o protocolo do atendimento 2135475381, orientamos que utilize sempre que entrar em contato conosco.

Em atenção ao seu e-mail, por gentileza realize os testes abaixo:

Retire chip e cartão de memória do aparelho e verifique se persiste.

Por gentileza pressione o botão de Aplicativos Recentes (botão à direita do central ou botão do meio) > selecione no ícone de desenho de gráfico de pizza > selecione em Aplicações Ativas > selecione em encerrar Tudo.

Verifique se o aparelho trava em algum aplicativo especifico, caso positivo exclua o mesmo.

Feche todos os aplicativos que estão em execução e verifique se travamento persiste.

Verifique possibilidade de realizar uma atualização de software no aparelho através das configurações abaixo:

Menu> configurações> sobre o dispositivo (telefone)> atualização de software> atualizar.

Ou através do software de sincronismo de seu aparelho, no caso o Samsung Kies segue link para download:

http://www.samsung.com/br/support/usefulsoftware/KIES/JSP

Realize uma restauração de fabrica no aparelho:

Antes de zerar o aparelho faça um backup dos dados armazenados no aparelho. Conecte o aparelho ao PC por intermédio do cabo USB, abra o Samsung Kies, clique em “Criar cópia de segurança/Restaurar”, selecione os itens para os quais irá criar uma cópia de segurança, clique no botão “Cópia de segurança”, aguarde a cópia se concluída e clique no botão “Concluir”.

Menu > Configurações > Fazer backup e redefinir > Restaurar padrão de fábrica > Zerar dispositivo > Apagar tudo.

Para restaurar uma cópia de segurança criada através do Samsung Kies clique em “Criar cópia de segurança/Restaurar”, clique no botão “Restaurar”, no popup que abrirá selecione o ficheiro referente ao backup que deseja restaurar, clique no botão “Seguinte”, e em “Iniciar restauro”, aguarde até que o procedimento seja concluído e clique em “Concluir”.

Caso não obtenha êxito, para uma análise técnica de seu produto será necessário encaminhá-lo para uma assistência técnica.

Segue abaixo o link para que faça a busca de uma assistência técnica mais próxima de sua localidade.

http://www.samsung.com/br/support/location/supportServiceLocation.do?page=SERVICE.LOCATION

Caso encontre dificuldades na localização de assistências, nos encaminhe novamente seu e-mail especificando sua cidade e CEP.

Peço por gentileza que responda nossa pesquisa de satisfação abaixo em relação ao meu atendimento. A sua opinião é fundamental para a melhoria de nossos serviços.

Sempre que precisar, estamos prontos para auxiliar!

Atenciosamente,

Samsung Eletrônica da Amazônia LTDA.
Serviço de Atendimento ao Consumidor.
http://www.samsung.com/br/info/contactus.html

Senti um completo descaso com o e-mail que enviei originalmente, parece que não se deram o trabalho de fazer uma leitura e entender o caso…

Não é o primeiro e nem o único produto da Samsung que possuo, mas depois deste atendimento e do péssimo aparelho que está sendo vendido nas lojas - não muito barato, diga-se de passagem -, espero que seja o último.

Fica aqui, o sentimento de ter jogado o dinheiro e meu tempo no lixo.

Obrigado Samsung!


Priorizando testes com PHPUnit

Conforme nossa suíte de testes vai crescendo, obviamente, nossos testes vão demorando cada vez mais a finalizar e gerar nossas métricas. E o maior problema para muitos, é quando os testes que falham, estão “no final” da suíte.

Mas, seguindo a risca o TDD, não podemos definir a ordem dos testes, correto? Mas e se pudéssemos fazer os testes que falharam, rodassem primeiro? E é isso que o plugin Clever and Smart faz para nós.

A instação, vamos utilizar o Composer, nosso velho conhecido:

composer require "lstrojny/phpunit-clever-and-smart" "0.*"

A configuração é simples, ele depende basicamente da extensão SQLite3 instalada e habilitada - não, eu não vou te ensinar a fazer isso aqui nesse texto. Bastando apenas adicionar o nó abaixo em seu phpunit.xml:

<listeners>
        <listener class="PHPUnit\Runner\CleverAndSmart\TestListener">
            <arguments>
                <object class="PHPUnit\Runner\CleverAndSmart\Storage\Sqlite3Storage">
                    <arguments>
                        <string>./data/phpunit-cas.db</string>
                    </arguments>
                </object>
            </arguments>
        </listener>
    </listeners>
</listener>

Você só precisa alterar o caminho do banco SQlite que será criado para registrar os testes. Experimente fazer um teste falhar ao rodar a suíte e depois tente rodar novamente, você verá que os testes que falharam, rodarão primeiro ;)

Para mim, esse plugin agilizou e muito o processo de teste das aplicações que mantenho, espero que seja útil pra você também.


Rodando testes unitários em paralelo

Comecei a utilizar o plugin paratest em meus testes unitários para rodar testes em paralelo utilizando vários processos. Isso agiliza em muito o processo de testes - isso se você tiver uma máquina multi-core claro.

composer.phar require "brianium/paratest" "dev-master"

Somente isso já basta para rodar seus testes. Voce pode simplesmente rodar:

./vendor/bin/paratest

O paratest utiliza o mesmo arquivo de configuração do PHPUnit (phpunit.xml) para efetuar o bootstrap então, tecnicamente, você não verá muitas mudanças. Mas é possível obter algumas novas opções mais úteis ao dia-a-dia, e pra mim, a mais importante:

  • –processes (-p): o número de processos que vocÊ deseja rodar paralelamente, o padrão é 5.

Em resumo, o Paratest é um ótimo utilitário para agilizar seus testes, e os únicos problemas que tive alguns testes foram com o plugin Clever and Smart (esse é papo para outro post) por conta do SQLite.


Load Balance com Nginx

Para fazer um simples load balance com Nginx é simples.

Primeiro, vamos definir a máquina que ficará na frente e receberá todas as requisições e encaminhará para nosso parque de máquinas.

Começando pelo /etc/nginx/nginx.conf para habilitar algumas coisas, como
os tokens. Assim, cada máquina terá uma “identidade única” para a requisição que receber.

http {
    ...
    server_tokens on;
    server_names_hash_bucket_size 64;
    server_name_in_redirect off;
    ...
}

Com isso, vamos pegar nosso arquivo de host virtual e inserir as máquinas que fazem parte do nosso parque e poderão receber os clientes. Abaixo, mostro o conteúdo de exemplo do arquivo /etc/nginx/sites-enabled/default:

upstream nodes {
    ip_hash;

    server *IP_SLAVE_1*:*PORT_SLAVE_1* max_fails=3 fail_timeout=30s;
    server *IP_SLAVE_2*:*PORT_SLAVE_2* max_fails=3 fail_timeout=30s;
    server *IP_SLAVE_3*:*PORT_SLAVE_3* max_fails=3 fail_timeout=30s;
    ...
}

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    location / {
        # Sending to other servers
        proxy_pass http://nodes;
        proxy_pass_request_headers on;
        proxy_set_header Host $http_host;
    }
    ...
}

Na sessão upstream_nodes é onde inserimos nossa máquina. Você pode simplesmente colocar os IPs das máquinas que compõem o parque, com algumas opções para que o Nginx não espere eternamente uma conexão de uma máquina que possa estar fora.

A opção ip_hash é onde cria o identificador da máquina, algo como o que falei acima sobre os tokens.

Pronto, agora basta restartar o Nginx e começar a configurar suas máquinas que receberão as requisições normalmente com o ambiente e servidor web que for de sua escolha.