O que mudou na versão 2.2 do Symfony

Na sexta-feira passada (01/03), foi lançada a versão 2.2 do Symfony, que inclui várias funcionalidades e melhorias, que estavam sendo anunciadas semanalmente no blog oficial. Confira aqui um resumo de algumas das novas funcionalidades disponíveis:

Console

Autocompletar na linha de comando: mais uma melhoria para agilizar o desenvolvimento! Agora usando tab e as setas podemos selecionar a resposta rapidamente e sem erros. Você pode passar todas as respostas válidas para o seu comando como último argumento do método askAndValidate():

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

$app = new Application();
$app->register('ask-color')->setCode(function (InputInterface $input,
   OutputInterface $output) use ($app) {
   $colors = array(
              'red', 'blue', 'yellow', 'yellow-light', 'yellow-dark'
             );
   $validation = function ($color) use ($colors) {
       if (!in_array($color, array_values($colors))) {
           throw new \InvalidArgumentException(sprintf(
                         'Color "%s" is invalid.', $color));
       }

       return $color;
   };

   // pergunta e valida a resposta
   $dialog = $app->getHelperSet()->get('dialog');
   $color = $dialog->askAndValidate($output, 
                        'Enter your favorite color (default to red): ', 
                        $validation, false, 'red', $colors);

   $output->writeln(sprintf('You have just entered: %s', $color));
});

$app->run();

O funcionamento do comando, pode ser verificado neste vídeo.

Exibição de uma barra de progresso para as tarefas de longa execução: ao executar comandos de longa duração pela CLI, podemos fornecer um feedback ao usuário, durante a execução do comando, através de um helper de barra de progresso que faz todo o trabalho para você:

$progress = $app->getHelperSet()->get('progress');

$progress->start($output, 50);
$i = 0;
while ($i++ < 50) {     
    // faz algo     
    // avança a barra de progresso em 1 unidade     
    $progress->advance();
}

$progress->finish();

Escondendo as senhas fornecidas na linha de comando: o novo método askHiddenResponse nos permite esconder o que os usuários digitam na linha de comando:

$dialog      = $this->getHelperSet()->get('dialog');
$password = $dialog->askHiddenResponse($output, 'Qual é a senha do banco de dados?');

Restringindo as opções solicitadas ao usuário: há várias formas de pedir algumas informações na CLI. A partir do Symfony 2.2, podemos restringir o que o usuário pode informar através do novo helper select(), fazendo com que ele escolha a partir de uma lista de opções.

Finder

O componente Finder oferece uma agradável DSL para pesquisar arquivos e diretórios. As seguintes melhorias estão disponíveis com a versão 2.2:

Filtro por caminho: com o método path(), que aceita strings ou expressões regulares, agora é possível restringir arquivos e diretórios pelo caminho:
Finder::create()->path('some/special/dir');
Finder::create()->path('/^foo\/bar/');

Para negar a restrição, utilize os métodos notName() e notPath().

Suporte a Glob no método in(): os diretórios onde o Finder deve procurar por arquivos e diretórios podem ser definidos como globs no método in():

Finder::create()->files()->in(
           'src/Symfony/*/*/Resources/translations');

Aumento de velocidade em algumas Plataformas (Linux, MacOs e BSD): o desempenho do Finder foi muito melhorado, através da conversão dos critérios para comandos nativos. Verifique os resultados iniciais do benchmark que foram publicados quando o PR foi submetido.

HttpKernel

Log das chamadas obsoletas: A primeira versão LTS do Symfony2 será a 2.3 (a ser lançada em Maio de 2013) após estão versão, não serão mais realizadas quebras de compatibilidade com as versões anteriores sem uma razão muito boa (ex. uma questão de segurança). Assim, desde a versão 2.0, em vez de apenas substituir ou remover as funcionalidades existentes, elas passam a ser definidas como obsoletas, e serão removidas definitivamente na versão 2.3.

Para fornecer uma transição mais suave, o Symfony 2.2 apresenta um novo recurso: o log das chamadas obsoletas. Sempre que você chamar um método obsoleto ou quando criar uma instância de uma classe obsoleta, o Symfony vai fazer o log da chamada e alertá-lo na barra de ferramentas de depuração. Também é possível verificar exatamente onde a chamada ocorreu no painel de log do profiler web.

Novo sub-framework para gerenciar fragmentos de recursos: um novo sub-framework foi adicionado para lidar com a renderização de fragmentos de recursos e facilitar o uso de diferentes estratégias: sub-requests internos (processados diretamente pelo Symfony), ESIs (processados por um proxy reverso – Varnish, …), HIncludes (processados pelo navegador) e SSIs ( processandos pelo servidor web – Apache, … – somente no Symfony 2.3). O componente HttpKernel pode lidar agora com sub-requests :)

Exibição agradável dos erros fatais: os erros fatais são exibidos de uma forma agradável como os outros erros.

Erro fatal no Symfony 2.1:

Mensagem de erro fatal melhorada no Symfony 2.2:

Componente Process

O componente Process permite a execução de sub-processos em PHP, tanto na forma de bloqueio (próximo processo espera a finalização do processo anterior para executar) como sem bloqueio (processos são executados simultaneamente). Ele também ganhou melhorias na nova versão do Symfony:

Obtenção de saída incremental de um Processo: você pode obter os dados de saída incrementais usando os métodos getIncrementalOutput() e getIncrementalErrorOutput(), que retornam as novas saídas desde a última chamada enquanto getOutput() e getErrorOutput() retornam os resultados completos:

use Symfony\Component\Process\Process;

$processes = array();
$processes[] = new Process('ls -lsa');
$processes[] = new Process('ps waux');

while (count($processes) > 0) {
     foreach ($processes as $i => $process) {
         if (!$process->isStarted()) {
             echo "Process starts\n";

             $process->start();

             continue;
         }

         echo $process->getIncrementalOutput();
         echo $process->getIncrementalErrorOutput();

         if (!$process->isRunning()) {
             echo "Process stopped\n";

             unset($processes[$i]);
         }
     }

     sleep(1);
}

Reiniciar um processo: podemos agora reiniciar um processo, por exemplo, no caso dele falhar:

use Symfony\Component\Process\ProcessBuilder;

if (!$process->isRunning()) {
    if (!$process->isSuccessful()) {
        $cloned = $process->restart();

        // ...
    }
}

Obter o status de um processo em execução: ao executar um conjunto de processos, você pode querer reiniciar processos que morreram (como no exemplo anterior). Mas se o processo ainda não é capaz de iniciar, não há motivo para reiniciá-lo. A partir da versão 2.2, você pode verificar o status de um processo e agir em conformidade:

$process->isSuccessful();
$process->hasBeenSignaled();
$process->hasBeenStopped();
$process->isRunning();

// novidade no Symfony 2.2:
$process->isStarted();
$process->isTerminated();

if (!$process->isRunning()) {
    if ($process->isStarted() && !$process->isSuccessful()) {
        $cloned = $process->restart();

        // ...
    }
}

Roteamento

Suporte para host na URL: as rotas contam agora com suporte nativo à host na URL. A constraint do host funciona exatamente da mesma forma como o padrão: ela pode conter placeholders, os placeholders podem ter requisitos, e um requisito do placeholder pode usar algum parâmetro do container de serviço para ser configurado.

Exemplo típico de uso:

user_homepage:
    path: /
    host: "{user}.example.com"
    defaults: { _controller: AcmeDemoBundle:User:profile }

main_homepage:
    path:  /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }

A constraint do host também pode ser adicionada a um conjunto de rotas ao importá-las.

URLs relativas ao esquema e ao caminho: foram adicionados mais dois tipos de URLs que você gerar:

URLs relativas ao esquema: usado quando algumas páginas são acessadas por HTTP ou HTTPS, evitando as warnings dos navegadores.
//example.org/blog/what-a-wonderful-world

{{ url('blog', { post: 'what-a-wonderful-world' }, true) }}

URLs relativas ao caminho: útil quando você precisa gerar arquivos HTML estáticos que podem ser baixados para serem acessados localmente em um navegador (ex: gerador de blog estático)
../ (caminho relativo com base na URL atual)

{{ path('blog', { post: 'what-a-wonderful-world' }, true) }}

Segurança

Utilitários de Segurança: alguns utilitários de segurança foram refatorados para que você possa usá-los em seu próprio código. Estes utilitários estão disponíveis no namespace Symfony\Component\Security\Core\Util.

Geração de um número aleatório seguro: temos a disposição uma implementação robusta para a geração de um número aleatório, com a classe SecureRandom:

use Symfony\Component\Security\Core\Util\SecureRandom;

$generator = new SecureRandom();
$random    = $generator->nextBytes(10);

O método nextBytes() retorna uma string aleatória composta pelo número de caracteres passados ​​como argumento (10 no exemplo acima).

Comparando Strings: Timing attacks ainda não são bem conhecidos, mas mesmo assim, o Symfony possui proteção contra eles. No Symfony 2.0 e 2.1, esta proteção foi aplicada para comparações de senha feitas no bundle Security, mas, a partir do Symfony 2.2, também está disponível para o desenvolvedor:
use Symfony\Component\Security\Core\Util\StringUtils;

// a senha1 é igual a senha2?
$bool = StringUtils::equals($senha1, $senha2);

Validadores

Validadores para pagamento: adicionado novo validador para cartões de crédito, utilizando o algoritmo Luhn:

// src/Acme/SubscriptionBundle/Entity/Transaction.php

use Symfony\Component\Validator\Constraints as Assert;

class Transaction{
    /**
     * @Assert\Luhn(message = "Por favor verifique o número do cartão fornecido.")
     */
    protected $cardNumber;
}

É possível também verificar se um cartão é válido para uma determinada companhia de cartão de crédito com a constraint CardSchemeValidator:

// src/Acme/SubscriptionBundle/Resources/config/validation.yml

Acme\SubscriptionBundle\Entity\Transaction:
    properties:
        cardNumber:
            - CardScheme:
                schemes: [VISA]
                message: O número do cartão de crédito é inválido.

FrameworkBundle

Mais velocidade nos testes funcionais: agora o profiler é desabilitado por padrão nos testes funcionais (na configuração que vem com a Edição Standard):

# in app/config/config_test.yml
framework:
    profiler:
        enabled: false

Cache para páginas estáticas: todos os sites possuem algum tipo de página estática (por exemplo, uma página sobre). Uma página é estática quando não precisa que nenhuma lógica seja processada. Para facilitar neste caso (e evitar ter que criar um controlador e roteamentos para estas páginas), você pode usar o controlador FrameworkBundle:Template:template que configura tudo, diretamente no arquivo de roteamento. Isto funciona desde a versão 2.0, mas na 2.2, você pode definir também a estratégia de cache:

about:
    pattern: /sobre
    defaults:
        _controller: FrameworkBundle:Template:template
        template: 'AcmeBundle:Pages:sobre.html.twig'
        maxAge: 86400
        sharedMaxAge: 86400
        private: false

Novos componentes

Contamos agora com dois novos componentes (que foram extraídos do código existente):

  • Stopwatch – permite medir o tempo de execução de partes específicas do seu código
  • PropertyAccess – função para ler e escrever de/para um array ou objeto utilizando uma notação simples de string

Mais Documentação

Foram adicionados vários artigos na documentação oficial sobre as novas funcionalidades.

Migração da versão 2.1

Se você possui projetos utilizando a versão 2.1, para fazer a migração para a 2.2 deve-se atualizar o arquivo composer.json e executar o composer.phar update.

Após a atualização, verificar com cuidado as modificações citadas neste documento.

About these ads

Um comentário em “O que mudou na versão 2.2 do Symfony

  1. Marcel dos Santos disse:

    Parabéns pela compilação e pelo site…

    Fiquei bastante interessado pelo Symfony2 (pelo Silex, Twig, as outras ferramentas da Sensio e da comunidade PHP também) por sua facilidade de integração com outras bibliotecas e pela sua organização e estruturação utilizando padrões de projeto e boas práticas de OO.

    Confesso que, por ter vindo do mundo Windows e do PHP sem padrões, pastei um pouco para entender os conceitos e mudar minha forma de entender os projetos. Comecei a mudar este panorama utilizando CodeIgniter e, há algum tempo, instalando o Linux na minha estação de trabalho, migrando para o Symfony2 e, posteriormente, utilizando o Composer.

    Parece que ao entrar no mundo Symfony2/Linux ele te induz para que se tenha um workflow de trabalho bem definido e te “força” (da melhor maneira) a utilizar OO, entender os princípios SOLID, a arquitetura MVC, o que é model, entities, controller, routes, templates, serviços, assets entre outras infinidades de conceitos e termos. No princípio parece meio assustador esta quantidade de informação.

    Tenho achado difícil encontrar boas referências de Symfony2 em português e tenho me apoiado nas ótimas referências do site Symfony.com, nas palestras do pessoal da SensioLabs no Speaker Deck, o tutorial Symblog achei excepcional (apesar de estar incompleto segundo o plano do autor), o tutorial Create Your Framework do Fabien Potencier também é muito bom, tenho visto boas referências em espanhol e, em português, encontrei o seu site e projeto de tradução para o português do Brasil.

    Continue com este ótimo projeto…

    Abraço,

    Marcel

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s