Introdução ao Laravel

Introdução ao Laravel

Neste post vou iniciar uma série de artigos sobre o framework Laravel. Originalmente desenvolvido por Taylor Otwell, o Laravel tem atraído cada vez mais desenvolvedores. O framework foi criado utilizando as últimas funcionalidades do PHP, além de ser completamente reescrito na versão 4. Vamos ver o Composer, namespaces e a estrutura de diretórios do Laravel. Para quem é um desenvolvedor PHP a muito tempo e ainda não trabalhou com o Laravel, podem haver alguma resistência, mas a mudança vale a pena. Para os iniciantes, uma maneira de entrar no mundo PHP escrevendo código limpo e de qualidade.

Falando um pouco sobre a adoção do Laravel, aqui está uma pesquisa no Google Trends. Ela serve como base de comparação entre alguns frameworks (repare no crescimento do Laravel):

Modelo MVC

Vamos começar pelo básico. Laravel é um framework MVC – estruturado na forma de Model-View-Controller. Isso significa que você vai dividir a sua aplicação em três partes (basicamente):

  • Models: os modelos, em português, são classes usadas para representar o seu banco de dados. Eles servem como uma camada de interação com o banco, eliminando aquelas string cheias de SQL da lógica da sua aplicação.
  • Views: são as visões (essa tradução é um pouco complicada pois pode dar a impressão de ser uma versão da sua aplicação – na realidade é a parte da aplicação que o usuário vai ver). Aqui você colocará os códigos HTML que serão exibidos. Mais uma vez, isso elimina aquele echo de HTML no meio do código.
  • Controllers: controles são responsáveis pela lógica. Eles serão as classes que vão processar o input do usuário e decidir o que fazer com isso.

Logo antes dessa lista eu escrevi que essas eram as três partes “basicamente”. Isso porque na prática você vai querer reusar muitas coisas e, algumas delas, farão mais sentidos se separadas da sua lógica. Por essa razão você vai acabar utilizando bibliotecas de terceiros (o próprio Laravel é uma biblioteca) ou criando as suas próprias. O Laravel facilita muito este reuso, por permitir o uso de Namespaces e do Composer.

Namespaces

Diversas linguagens já possuem namespaces há bastante tempo, mas no PHP só foi incluído na versão 5.3. Eles facilitam o reuso de componentes pois permitem a utilização dos mesmos nomes em classes. Por exemplo, sem os namespaces não é possível criar uma classe Email, para tratar a tabela “email” do banco de dados, e outra classe Email para realizar o envio de e-mails.

Com a utilização de namespaces é possível identificar antes de cada classe qual o “grupo” esta classe faz parte. Deste modo é possível criar duas classes com o mesmo nome, desde que pertençam a diferentes namespaces.

Exemplos

Vamos ao código para ver na prática.

No arquivo acima temos uma definição “normal” de classe – sem namespace. Se outra definição igual a essa (sem namespace) for feita em alguma outra parte do código, teremos um erro do tipo PHP Fatal error: Cannot redeclare class Email.

Podemos ver na linha em destaque a declaração do namespace Smtp. Agora não teremos mais erros. Se executarmos o script:

Qual mensagem você acha que vai aparecer na tela? Será a mensagem “Sem namespace”. Como não declaramos nenhum namespace o PHP vai instanciar a classe localizada no namespace global – todo código criado sem declaração de namespace é “carregado” neste namespace global – como uma variável global.

E agora, você sabe o que vai aparecer? Será a mensagem “Com namespace!”. Simples e extremamente prático.

O PHP requer que a primeira coisa a ser declarada no arquivo seja o namespace. Não é possível declarar outro namespace no meio do código.

Relatividade

O PHP considera tudo o que vier logo após a declaração do namespace como fazendo parte do que foi declarado. Ou seja, se criarmos o seguinte código:

Neste caso será instanciado classe do arquivo smtp.php, mesmo sem utilizar o namespace no momento de atribuir a variável. E se precisarmos utilizar a classe Email do arquivo email.php, como fazer? Simples, usamos somente uma “\” na instanciação para avisar o PHP que queremos usar a classe do namespace global.

Como tema de casa fica a pergunta do que vai acontecer no seguinte caso:

Responda nos comentários!

Composer

Logo Composer

Apesar de não ser um componente do Laravel, eu adicionei nesta introdução pois muitos desenvolvedores PHP nunca tiveram a oportunidade de utilizar o Composer. De acordo com a definição encontrada no site:

O Composer é uma ferramenta de gestão de dependências em PHP. Ele permite que você declare as dependências de bibliotecas que seu projeto precisa e ele instala elas para você.

Ou seja, você define as bibliotecas necessárias no seu projeto e o Composer busca automaticamente estas bibliotecas. Se alguma dessas bibliotecas precisar de outras, o Composer também vai buscar essa próximas, até que sua aplicação tenha tudo o que é necessário para funcionar. Por padrão essas bibliotecas não são instaladas globalmente, mas copiadas para um diretório (vendor).

Para definir as dependências, você precisa criar um arquivo no formato JSON. Não vou entrar em muitos detalhes agora pois vamos ver isso no próximo post referente a instalação do Laravel. Então, um arquivo simples, para definir a dependência do nosso projeto com o Laravel, seria escrito da seguinte maneira:

Esse conteúdo vai em um arquivo chamado composer.json. Ele define que precisamos do Laravel, sendo que precisamos da versão 4.2.*. Para realizar a instalação desta dependência, devemos executar:

Isso vai fazer com que o Composer copie o Laravel para o diretório vendor. Se no futuro for necessário alterar as dependências, por exemplo:

Neste caso estamos solicitando, além do Laravel, a biblioteca de imagem Intervention Image (para manipulação de imagens). Após a modificação neste arquivo basta executarmos o comando:

Com isso o Composer vai atualizar automaticamente as bibliotecas que precisamos.

Estrutura de Arquivos

Para finalizar esta introdução ao Laravel, quero mostrar a estrutura de arquivos do framework.

Estrutura laravel 1

Diretório app

O diretório app é o mais importante e, por esta razão, vou detalhar um pouco mais.

Estrutura laravel 2

Este é o diretório onde sua aplicação vai residir, por isso é tão importante. Os três sub-diretórios que você vai trabalhar mais são controllers, models e views. Vou explicar em ordem todos os sub-diretórios desta pasta.

  • commands: este diretório serve para guardar as rotinas e processos que serão executados pela linha de comando (usando php artisan command:nome_comando), pode-se usar um cronjob para executar os comandos.
  • config: contém as configurações do seu aplicativo, como definições da conexão com o banco de dados, driver de sessão, configurações de e-mail, etc.
  • controllers: aqui vão os controllers, responsáveis pela lógica da sua aplicação.
  • database: este diretório vai guardar suas migrações e seeds (scripts para popular sua base de dados automaticamente).
  • lang: se você precisar de mais de traduções do seu aplicativo, aqui serão colocados os arquivos de linguagem.
  • models: as classes que representam seu banco de dados vão nesta pasta.
  • start: algumas definições para carregamento da sua aplicação em ambiente global, local ou via artisan (linha de comando).
  • storage: armazenamento de sessões (quando utilizado o driver de sessão file), logs, cache, etc.
  • tests: diretório para colocar seus testes automatizados.
  • views: este diretório vai armazenar todas as views da sua aplicação.

Os dois arquivos dentro do diretório app são filters.php e routes.php. No arquivo filters.php pode ser colocados filtros que serão executados dependendo da URL. Por exemplo um filtro para verificar se o usuário está logado, caso contrário encaminhe o usuário para a página inicial. Dentro do arquivo routes.php ficam as definições de rotas do seu aplicativo. As rotas indicam qual URL vai acionar qual ação. Alguns exemplos:

Nestes exemplos temos uma rota quando o usuário acessar a raiz, que vai retornar uma view chamada ‘hello’. Depois temos duas rotas utilizadas quando o usuário acessar /about – uma delas executada quando for get e outra quando for feito um post. Na última rota, quando o usuário acessar a URL /user, ele será encaminhado para o controller UserController e para o método getIndex. Se o usuário acessar /user/create, ele será encaminhado para o controller UserController e para o método getCreate. Quando for executado um post, será postCreate. Nos próximos tutoriais irei falar mais sobre as rotas.

Outros diretórios

  • bootstrap: o primeiro diretório depois do app é o diretório bootstrap. Neste diretório temos alguns arquivos de iniciação importantes:
    • autoload.php: responsável por carregar as bibliotecas automaticamente. Carrega o conteúdo da pasta vendor (que será criada pelo Composer).
    • paths.php: definição dos diretórios do Laravel. Se você mudar os diretórios padrões pode customizar.
    • start.php: inicialização do aplicativo, com a instanciação do aplicativo propriamente dito. A definição dos hosts para o ambiente de desenvolvimento também esta neste arquivo.
  • public: na sequencia vemos o diretório public. Suas imagens, JavaScripts e CSSs vão neste diretório para que fiquem acessíveis no browser.

artisan

Entre os arquivos que estão neste diretório, temos dois que merecem ser mencionados. O primeiro é o artisan, que é uma funcionalidade muito importante do Laravel. Ele é um aplicativo capaz de executar uma série de tarefas através da linha de comando. Por exemplo, para criar uma migração basta executar:

Isso vai criar um arquivo novo na pasta app/database/migrations, já com a estrutura básica da classe de migração. Depois que você preencher o arquivo com a criação da sua tabela ou modificação de banco, você pode executá-la (realizar a migração) usando:

composer.json

O outro arquivo importante é o compser.json. Aqui é onde será definido as dependências do seu aplicativo.

Diretório vendor

Essa imagem do diretório vem direto do Github, portanto não é uma aplicação real, apenas um controle de versão para você usar como template do seu próprio aplicativo. Se utilizarmos o Composer aqui, será criado um diretório adicional chamado vendor, como já expliquei na sessão dedicada ao Composer.

Conclusão

Este primeiro artigo sobre Laravel era apenas para introduzir alguns conceitos e apresentar o framework. A utilização de namespaces e do Composer, colocam o Laravel entre os frameworks mais atualizados. No próximo artigo vou escrever sobre a instalação do Laravel, como clonar a partir do GitHub e as configurações iniciais. Qualquer dúvida ou sugestão comente.

Este post é parte da série Desenvolvendo com Laravel.

7 respostas para “Introdução ao Laravel”

  1. Oscar,

    Seus tutoriais são incríveis! Parabéns!!! Sou completamente iniciante em Frameworks PHP e consigo acompanhar sem a menor dificuldade.
    Quanto à questão proposta do namespace, eu acredito que dará erro, pois o PHP procurará uma por Smtp\Smtp\Email() e esta classe não existe.
    Se isto for verdade, imagino se é possível aninhar namespaces…

    Saudações,
    Alexandre Bonfá

    1. É isso aí Alexandre, vai aparecer o erro “Fatal error: Class ‘Smtp\Smtp\Email’ not found in …”.

      Mas se você alterar o arquivo “app/models/smtp.php” e colocar “namespace Smtp\Smtp;’, vai funcionar pois o PHP vai localizar o namespace. Então é possível aninhar namespaces, só é preciso ter atenção nesta questão da relatividade.

      Abraço

Deixe uma resposta

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