Migrando o Laravel de 4.2 para 5.1

Migrando o Laravel de 4.2 para 5.1

Assim como foi feito entre as versões 4.1 e 4.2, vou explicar os passos de atualização para atualizar o Laravel 4.2 para o 5.1. Devido as grandes alterações feitas no framework, não basta atualizar o nosso repositório atual, precisamos fazer uma migração para uma nova instalação. Basicamente vamos seguir as instruções explicadas na própria documentação do Laravel, aplicando para o nosso caso prático.

Requisitos

O Laravel 5.1 exige uma instalação bem atualizada do PHP. Costumo ver muito por ai servidores com versões antigas do PHP. Para o Laravel 5 você vai precisar algo atualizado. Os requisitos são:

  • PHP >= 5.5.9
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
  • Tokenizer PHP Extension

Instalando o Laravel 5.1

Começaremos realizando uma instalação zerada do Laravel. Para isso vamos utilizar o instalador do próprio Laravel, que por sua vez utiliza o Composer. Primeiro execute o seguinte comando:

Isso vai baixar o instalador. Depois vamos criar o projeto:

Dica: para executar esse comando você precisa o composer\vendor\bin no seu PATH. Se o comando não funcionar e você não quer alterar o PATH, pode usar todo o caminho do composer para executar o comando. Deve ser algo assim: c:\Users\<usuario>\AppData\Roaming\Composer\vendor\bin\laravel new dev-laravel-5.

O projeto será criado em um sub-diretório com o nome do projeto que você determinou – no nosso caso dev-laravel-5.

Migrando a Aplicação

Composer

A primeira coisa é atualizar o composer.json. Se você tem requisitos adicionais na sua aplicação, essa é a hora de incluí-los no novo composer da nova instalação. No caso da nossa aplicação vou apenas as informações básicas sobre o projeto.

Configuração

No Laravel 5 as configurações são gerenciadas usando arquivos .env. Em cada ambiente que você vai rodar sua aplicação, será necessário utilizar um arquivo .env diferente (um para desenvolvimento local, outro para produção, por exemplo). Os valores definidos nesse arquivo, são referenciados nos arquivos de configuração usando env(‘chave’, ‘valor padrão’). Na nossa aplicação o arquivo vai ficar assim:

Eu adicionei o parâmetro APP_URL ao arquivo e referenciei ele no arquivo config\app.php como um exemplo:

Rotas

Copie o arquivo de rotas antigo para app/Http/routes.php.

Controllers (Controladores)

O controllers devem ser copiados para o diretório app/Http/Controllers. No Laravel 5 são usados namespaces, porém, como estamos migrando, vamos deixar todos os controllers sem namespace (globais). Por essa razão vamos adicionar o diretório app/Http/Controllers no classmap do composer.json. A próxima etapa é remover o namespace do controller padrão Controller.php que vem com o Laravel 5. Uma vez removido o namespace, vamos verificar se todos os controllers que copiamos da nossa aplicação anterior estão estendendo a classe Controller. Finalizando esta parte, falta definir a propriedade $namespace como null no arquivo app\Providers\RouteServiceProvider.php.

Filtros das Rotas

Temos duas opções para os filtros:

1. Copiar os filtros que criamos (não é necessário copiar os filtros padrões) e colocá-los no arquivo app\Providers\RouteServiceProvider.php no método boot(Router $router). Pode ser necessário adicionar use Illuminate\Support\Facades\Route; caso você necessite do facade Route. Não recomento essa solução pois na versão 5.2 os filtros serão removidos do Laravel.

2. Criar um middleware para nossos filtros. O Middleware é a nova maneira do Larave fazer os filtros. No nosso caso, temos apenas um filtro adicional para usuário administradores. Vamos transformar nosso filtro em um middleware.

Crie o arquivo AutenticaPerfil.php no diretório app/Middleware. Coloque o seguinte conteúdo:

Esse middleware vai testar qual é o perfil do usuário. Modifique também o arquivo app/Kernel.php, adicionando o nosso middleware na propriedade $routeMiddleware.

Agora vamos voltar para nosso arquivo de rotas (routes.php) e atualizar o mesmo.

A partir do PHP 5.4 tornou-se possível criar um array usando apenas [], sem a necessidade de declarar array(). O código do Laravel começou a adotar essa forma por padrão, por isso farei o mesmo.

Models (Modelos)

Vamos copiar nossos models para o diretório app/Http/Models. Vamos incluir esse diretório no composer.json, assim como fizemos com os controllers. Se algum dos seus models utiliza o SoftDeletingTrait, atualize para utilizar o Illuminate\Database\Eloquent\SoftDeletes.

Model de Usuário

O model do usuário é um caso especial. Se utilizarmos o nosso modelo da aplicação 4.2, precisamos atualizar para funcionar com a versão 5.1. Se utilizamos o novo model User.php que vem no Laravel, precisamos atualizar para os campos para o português. De qualquer maneira o resultado final é o mesmo (app/Http/Models/Usuario.php):

Você pode ver que deixarmos apenas o método getAuthPassword(). Isso acontece porque todos os métodos são implementados no trait Authenticatable. Esse método que sobrescrevemos é necessário pois mudamos o campo password para senha. É mais fácil deixar tudo em inglês 😉

Como estamos utilizando a classe de usuário chamada Usuario ao invés de User, precisamos atualizar o arquivo config/auth.php. Substitua a propriedade ‘model’:

Assim poderemos utilizar a classe com o nome em português.

Laravel Cashier

Se você utiliza o Laravel Cashier (biblioteca para controle de pagamentos e assinaturas) você precisa trocar o BillableTrait, para o Laravel\Cashier\Billable trait. E também implementar Laravel\Cashier\Contracts\Billable ao invés de Laravel\Cashier\BillableInterface.

Artisan Commands (Comandos)

Se você possu comandos na sua aplicação, copie os mesmos para para o diretório app/Console/Commands. Depois adicione o diretório app/Console/Commands ao classmap do composer.json, assim como fizemos nos controllers e models. Para finalizar, copie a lista de comandos de start/artisan.php para o array $commands em app/Console/Kernel.php.

Migrações e Seeds

Apague as duas migrações que fazem parte do Laravel 5, pois elas servem para criar a tabela de usuários. Assim como na nossa aplicação, você já deve ter uma migração para isso. Copie os arquivos de migração do antigo app/database/migrations para o novo database/migrations. Se você tem seeds, copie de app/database/seeds para database/seeds.

Se você conferiu as migrações que vieram no Laravel 5, percebeu que a tabela de lembrete de senhas tem o nome password_resets. Porém no caso da nossa aplicação criamos como password_reminders. Para mantermos o nome da nossa tabela precisamos alterar o arquivo config/auth.php:

Já aproveitei e atualizei a view que vamos usar. Mais sobre as views a seguir.

Views

Essa parte é fácil, apenas copie suas views de app/views para o diretório resources/views.

Mudanças no Blade

Na nova versão do Laravel, tanto {{ }} quanto {{{ }}} vai fazer o escape do conteúdo. Isso foi feito por razões de segurança. Foi criado a diretiva {!! !!} para exibir conteúdo sem fazer o escape. Isso é importante por exemplo quando queremos exibir código HTML.

Ainda é possível manter o código antigo funcionando. Para isso você pode adicionar as linhas abaixo no fim do arquivo AppServiceProvider@register:

Tome cuidado pois isso é um risco de segurança e, além disso, vai fazer com que comentários usando {{– parem de funcionar. No caso da nossa aplicação vamos atualizar algumas views (não vou colocar todo o código aqui, porém você pode ver como ficou no novo repositório):

  • views/artigos/index.blade.php
  • views/home/index.blade.php

Traduções

Copie suas traduções do diretório app/lang para o diretório resources/lang do novo projeto.

Diretório Public

Agora vamos copiar todos os assets que temos na nossa pasta public para o public da nova aplicação. Mas não sobrescreva o index.php da aplicação 5.1. Se você fizer isso causará erros. No caso do nosso aplicativo, vamos copiar apenas o diretório public/assets.

Testes

Se você tem testes na sua aplicação, copie os mesmos de app/tests para tests.

Outros arquivos

Se você tem arquivos como .scrutinizer.yml, bower.json ou outros do mesmo tipo, copie eles para o novo projeto. Arquivos Sass, Less, ou CoffeeScript podem ser copiados para a localização que você preferir. O diretório resources/assets pode ser utilizado.

Helpers Form e HTML

Essa é uma das maiores “dores de cabeça” da migração. Tanto a classe Form quanto a classe Html foram removidas no Laravel 5. Considerado que não era uma necessidade essencial do framework. Então temos duas opções, converter nosso código para HTML puro (melhor performance pois não precisa mais executar PHP para criar os códigos) ou utilizar pacotes mantidos pela comunidade Laravel, como os feitos pelo Laravel Collective.

A solução mais simples é utilizar o pacote, claro, já que não será necessário substituir nada no nosso código. Adicione “laravelcollective/html”: “~5.0” no composer.json.

Depois de adicionar execute um composer update na linha de comando. Também é necessário adicionar os facades e service provider das classes. Modifique o arquivo config/app.php e adicione a seguinte linha na propriedade providers:

Depois adicione as linhas abaixo no array aliases:

Se você utilizar as classes do Laravel Collective, não esqueça de mudar as diretivas do blade de {{ para {!!.

CacheManager

Se você utiliza o Illuminate\Cache\CacheManager substitua pelo Illuminate\Contracts\Cache\Repository.

Paginação

Se você está utilizando a paginação do Laravel, substitua as chamadas para $paginator->links() com o novo $paginator->render(). As chamadas para $paginator->getFrom() e $paginator->getTo() devem ser substituídas por $paginator->firstItem() $paginator->lastItem() respectivamente. Para finalizar, remova o prefixo “get” das chamadas para $paginator->getPerPage(), $paginator->getCurrentPage()$paginator->getLastPage() e $paginator->getTotal() (fica assim $paginator->perPage()).

Filas do Beanstalk

As filas do Beanstalk utilizam uma nova versão no Laravel 5.0, portanto modifique o composer para “pda/pheanstalk”: “~3.0” no lugar da 2.1.

Componentes Removidos

Os componentes Remote e Workbench foram removidos completamente.

Conclusão

Com isso finalizamos a migração da versão do Laravel. Como você percebeu, não é nada simples. Então pense bem antes de começar esse processo em um projeto muito grande que esteja em produção. Existe o potencial para muito problema nessa atualização. Na nossa aplicação exemplo, que é bem pequena, foi bem simples atualizar.

Eu não migrei muitos projetos até o momento, então não cheguei a fazer todos os passos aqui descritos. Se você localizou algum problema, avise nos comentários que eu atualizo o post. Visite também o novo repositório em https://github.com/oscardias/dev-laravel-5.

4 respostas para “Migrando o Laravel de 4.2 para 5.1”

  1. Meu caro Professor Oscar Dias,
    Acompanhei atentamente o trabalho com o laravel 4.2 e fiz passo a passo o desenvolvendo com laravel, em suas 6 lições detalhadas e bem explicadas. Funcionou bem todo o processo, só fiquei intrigado no momento em que é feito o “sair” do “artigo” e o sistema retorna para a raiz “/” e o processo chama o hello.php, caindo na página inicial do laravel “you have arrived”. Fiquei algum tempo procurando algum tipo de erro que eu tenha cometido mas, depois percebi que estava assim mesmo, no “HomeController” o getIndex() aponta para “hello”, UFA, mas é fácil de resolver.
    Em relação às evoluções do framework, meu bom e velho professor de faculdade generalizava com esta frase: “A melhor maneira de facilitar um projeto é complicando-o ao extremo”, ou seja, por mais fácil que seja nós sempre o complicamos…interessante esta analogia. Resolvi compartilhar isso contigo após ler este artigo sobre migrar o laravel de 4.2 para 5.1, e, digo que, se algo esta funcionando bem é melhor nem mexer muito. Eu prefiro manter o projeto inicial funcionando e, então, após analises, começar um novo projeto, mantendo as possíveis características o mais fiél , ou então começar do zero mesmo, mais fácil, uma vez que alguns atributos são excluídos e teremos que adequar.
    Desejo agradecer a dedicação e o trabalho bem realizado, que nos ajuda a compreender melhor os rumos da informatização….
    (se eu escrever mais um pouco, deixa de ser comentário e vira apostila…. risos)

    1. Tudo bem Osvaldo,
      Concordo contigo com relação a não complicar… Eu tenho alguns projetos que estou mantendo no Laravel 4 e está tudo correndo bem. O objetivo deste artigo era somente mostrar a maneira de migrar oficialmente recomendada pelo próprio Laravel. Mas o benefício em fazer isso depende de cada caso.
      Abraço

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *