O que há de novo no Laravel 5

A comunidade PHP recentemente foi abençoada com uma nova versão de um dos frameworks mais adorados da linguagem, o Laravel. A versão 5.0.1 é um major release, ou grande lançamento, e além de conter novos recursos e funcionalidades também possui mudanças na estrutura do framework para melhorar a forma como este opera. Então, sem mais delongas, neste post vamos analisar alguns dos recursos que essa nova versão do Laravel tem a nos oferecer.


1. Estrutura de diretórios

A estrutura de arquivos do Laravel sofreu uma grande revisão. O Laravel 5 incorporou o padrão PSR-4 autoloading, que significa que todas as classes são namespaced. O namespace padrão para aplicações web é app, que você pode alterar utilizando o comando php artisan app:name <nome-do-seu-app>.

Seus models ficam na pasta com namespace, dentro da pasta do app. Os arquivos assets, views, e languages ficam na pasta resources. Os diretórios vendor, public e bootstrap continuam no mesmo local das versões anteriores do framework, enquanto os diretórios config, storage, database e testes foram movidos para a raiz do projeto.

Se você der uma olhada na pasta app, você vai notar uma série de classes, mas não precisa se preocupar com isso agora – vamos analisar o que isso significa no decorrer deste artigo.

O Environment detection ou detecção de ambiente também sofreu alterações. Ao invés de diretórios de configurações, agora temos um arquivo .env na raiz do projeto que cuida do environment/ambiente da aplicação e de todas as variáveis desse ambiente. O comando php artisan tinker agora utiliza o package Psysh ao invés do Boris.

2. Method Injection/Injeção de métodos

Method injection ou injeção de métodos (no português claro) agora está mais simples. Até a versão 4.2, você precisava fazer um request ao container Inversion of Control (IoC) para criar uma class ou declarar esta no controller para tornar esta acessível antes da class scope. Agora você pode declarar uma class indefinida no método do controller e o container IoC vai cuidar de tudo, mesmo se no seu controller houver múltiplas funções.

<?php
// your class at "app/Classes/your_class.php"

namespace AppClasses

class YourClass
{
// sua class
}

// em algum lugar das ações da class
public function myAction(AppClassesYourClass $MyObject)
{
    // utilizar $MyObject como qualquer outro objeto
}
?>

3. Contracts/Acordos

Acordos são na verdades interface classes disfarçadas. Interface é um método testado para remover a dependência de classes e otimizar o desenvolvimento de componentes de software. Eles geralmente te ajudam a seguir a regra “depend on abstractions, not concretions”.

O Laravel utiliza a mesma filosofia. A maioria dos core components utilizam esses acordos/contracts para manter o framework loosely coupled, ou com poucas dependências entre seus componentes. Você também pode utilizar os acordos no desenvolvimento de packages.

Por exemplo, se o package precisar de cache, ao invés de você criar uma cache class para isso, você pode utilizar a interface IlluminateContractsCache e você estará livre para criar cache sem ter de alterar muito o código do package.

Você deve estar imaginando como o Laravel executa e implementa um acordo especifico. Toda mágica ocorre no arquivo IlluminateFoundationApplication.php.


4. Route Caching

O Laravel tem um novo recurso para route caching. O recurso Route caching aumenta muito a performance da sua aplicação através do registro de rotas (route registration), e os beneficios são notaveis. Se sua aplicação não utilizar muitos routes, você sequer vai sentir a necessidade deste recurso, que é indicado para aplicações com diversas routes configuradas.

Os comandos php artisan route:cache e php artisan route:clear ligam e desligam o recurso de route caching. Com o route caching ligado, qualquer modificação de rota não vai ter efeito imediato. O route caching geralmente é implementado e configurado antes de iniciar o desenvolvimento da aplicação.

5. Route Middleware

O Route Middleware é um recurso utilizado para adicionar camadas extras as rotas HTTP. Se você quer que um código seja executado antes ou depois de alguma ota, criar um pedaço de código middleware class pode ser a solução ideal.

Por exemplo, digamos que você deseja bloquear um certo range de IPs na sua apliação para que ela não fique disponível em certa região. Neste caso, você vai precisar checar o IP do cliente antes de qualquer requisição e permitir ou não essas requisições na aplicação. Isso pode gerar um certo trabalho caso você queira editar as ações do controller, então ao invés disso podemos utilizar as middlewares. Crie uma middleware class no caminho app/Http/Middleware/RegionMiddleware.php utilizando o comando php artisan make:middleware "RegionMiddleware".

<?php
namespace appHttpMiddleware;

use Closure;

class RegionMiddleware {

/**
     * requisições
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */

    public function handle($request, Closure $next)
    {
        // execução de algumas funções com IP no $request
        // e redirecionamento básico com base no resultado

        return $next($request);
    }

}
?>

Depois vamos registrar a middleware criada no arquivo app/Http/Kernel.php adicionando ao array $middleware. Você também pode vincular a middleware em uma rota especifica utilizando o array $routeMiddleware e depois especificar na route options.

6. Authentication/Autenticação

A autenticação é provavelmente a parte mais importante das aplicações, e muito tempo é depositado nessa tarefa. No Laravel 5 essa tarefa foi otimizada para que você não perca tanto tempo configurando a autenção da sua aplicação web. O banco de dados, os models, controllers e views apenas precisam estar configurados para que tudo funcione. O Laravel 5 possui o recurso Registrar service, que é um sistema de autentição pronto para utilização.

7. Events/eventos

Já se foram os dias em que declaravamos events como strings, porque o event object agora está disponível. Você pode criar event objects utilizando o comando php artisan make:event <event-name> e um event handler utilizando o comando php artisan handler:event <handler-name>. Todos as classes event e handler vão para as pastas app/Events e app/Handlers/Events

Assim que você executa-lo com Event::fire(new Event(params)). Para adicionar listeners aos events, você via precisar editar o array $listen no arquivo app/Providers/EventServiceProvider.php.

8. Commands/comandos

O Laravel 5 permite encapsular lógicas compleas em simples command objects, ou objetos de comando.

Por exemplo, vamos supor que você tem um loja online onde os usuário se registram para comprar produtos eletronicos. O processo de registro pode envolver a verificação do email e cartão de crédito.

Pode ser um pouco complicado utilizar este código com ações de algum controller, mas isso não é uma boa idéia ja que o código vai operar apenas com requisições HTTP, além de causar dificuldades para testes e prejudicar a performance das ações do controller.

Utilizar o recurso com comandos garante alguns beneficios. Primeiro, o seu código vai ser modular e mais amigável a testes. Segundo, como Laravel nos permite utilizar comandos, a logica do seu sistema para rodar sincronizada em background, o que é impossível com ações do controller.


9. Programando tarefas e rotinas

O Laravel conta com um recurso próprio para programas tarefas e rotinas, assim você não precisa utilizar soluções de terceiros. Tudo que você precisa fazer é configurar a fila/queue e pronto. Todas as tarefas ficam na pasta app/Commands. Assim que você criar os comandos, você pode adiciona-los a fila de tarefas com o comando Queue::push(new Command($params))

O recurso para programas tarefas teve uma grande melhora. Antes, você precisava configurar um horário para cada comando, agora não mais. Agora determina apenas um horário de entrada e então você pode programar as tarefas com alterações simples na sintaxe do código.

10. Multiple File Systems/Sistema de multiplos arquivos

O Laravel 5 tem suporte nativo a vários arquivos de sistema com ajuda do package Flysystem. Sua aplicação pode utilizar armazenamento local ou na nuvem, e a configuração é bem simples. Você precisa apenas trabalhar com a faixa de arquivos, e a base de armazenamento faz o resto automaticamente. Você pode configurar suas opções de armazenamento/storage no arquivo config/filesystems.php. Caso você precise acessar todas as opções de armazenamento do seu projeto, você pode ignorar o arquivo do sistema e trabalhar direto com o arquivo do disco.

11. Request Object/Requisição de objetos

A requisição de objetos ajuda a aplicar autorização/validação de informações na logica das requisições. Assim que você implementar a lógica no objeto requisitado, você vai precisar atualizar a ação do controller, assim como no caso do method injection.

Vamos decifrar isso com um exemplo. Execute php artisan make:request TutsPlusRequest para gerar uma class de requisição no arquivo app/Http/Requests/TutsPlusRequest.php. Dê uma olhada no conteúdo daquele arquivo, você vai notar que foram gerados métodos de regras (method rules) e de autorização (authorize method).

<?php
namespace AppHttpRequests;

use AppHttpRequestsRequest;

class TutsPlusRequest extends Request {

    /**
     * determinar se usuário está habilitado a fazer esta requisição.
     *
     * @return bool
     */

    public function authorize()
    {
        return true;
    }

    /**
     * Solicitar informação de valição para aplicar no request.
     *
     * @return array
     */

    public function rules()
    {
        return [
            'email' => 'required|email',
            'password' => 'required|min:8'
        ];
    }

}

// na ação do controller
public function postLogin(AppHttpRequestsTutsPlusRequest $request)
{
    // Este código não vai ser executado se as confirmações de validação falharem.
}
?>

Você deseja que o email seja um email válido e que a senha tenha no mínimo oito caracteres. Os dois campos são obrigatórios. Se alguma dessas validações falhar, a ação do seu controler não vai ser executada e o usuário vai ser direcionado a página do formulário novamente.

12. Elixir

Elixir é uma GulpJS API para o Laravel que auxilia na configuração de tarefas gulp em sua aplicação. Se aprofundar no GulpJS vai muito além deste artigo, mas você pode dar uma olhada no site oficial do GulpJS e do Elixir, para mais informações.

Uma utilização bem comum do GulpJS é tarefa de minificar documentos JS/CSS. Os packages do gulp ficam no arquivo package.json, na raiz do seu projeto, enquanto as tarefas que precisam ser executadas ficam no arquivo gulpfile.js. Para quem já está acostumado com o workflow do GulpJS, isso tudo vai fazer mais sentido, já que o Elixir serve apenas para integrar o GulpJS em uma aplicação criada com o Laravel.

13. Laravel Socialite

Socialite é um package que torna simples a integração de autenticação de terceiros na sua aplicação web. Como ele não está incluso no Laravael por padrão, você precisa incluir ele com o Composer. Assim que a configuração para login estiver pronta, basta configurar os provedores de acesso. O Socialite suporte o Twitter, GitHub, Google e Facebook.


Conclusão

Espero que tenha gostado de analisar as especificações do Laravel 5. Do ponto de vista de arquitetura de software, acredito que o framework incorporou recursos bem interessantes e úteis em relação a organização e manutenção do código. Até a próxima galera, happy coding!