Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

Desconstruindo Laravel: Session, Auth e Cache

by
Difficulty:BeginnerLength:LongLanguages:

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Nos últimos anos, Laravel tornou-se uma das frameworks mais importantes e utilizadas por engenheiros de software na hora de construir suas aplicações web. Com popularidade semelhante à do CodeIgniter em seus dias de glória, Laravel tem sido louvado pela sua simplicidade, facilidade de uso por parte dos iniciantes e aderência aos padrões da indústria.

Introdução

Algo que muitos programadores deixam de aproveitar do Laravel é a sua componentização. Desde sua conversão à utilização de componentes que lançam utilizam o Composer, Laravel 4 tornou-se um sistema bastante modular, semelhante às frameworks mais maduras, como a Symfony. Ela usa o grupo de componentes chamado de Illuminate, que, na minha opinião, não é a framework em si, mas uma compilação de bibliotecas que uma framework pode chegar a usar. A framework Laravel, de verdade, é representada pela aplicação base do Laravel (encontrada no repositório do GitHub chamado laravel/laravel), que faz uso desses componente para construir uma aplicação web.

Nesse tutorial, nós nos aprofundaremos em alguns dos componentes desse grupo, aprendendo como eles funcionam, como eles são utilizados pela framework e como estender a funcionalidade deles.

O Componente Session

O componente Session do Laravel lida com as sessões das aplicações web. Ele faz uso de um sistema de drivers chamado Laravel Manager, que age tanto como uma fábrica (do padrão de programação Factory) quanto um envólucro para qualquer driver atribuído no arquivo de configuração. Até o momento da escrita desse post, o componente Session tem os seguintes drivers:

  • file - driver baseado em arquivo, onde os dados da sessão são salvos em um arquivo criptografado.
  • cookie - driver baseados em cookies, onde os dados da sessão são salvos de forma criptografada nos cookies (do navegador) do usuário.
  • database - os dados da sessão são salvos na base de dados configurada para a aplicação.
  • apc - os dados da sessão são salvos no APC (Alternative PHP Cache).
  • memcached - os dados da sessão são salvas no Memcached.
  • redis - os dados da sessão são salvo no Redis.
  • array - os dados da sessão são salvos em uma array do PHP. Atente que o driver de sessão baseado em array não dá suporte a persistência de dados e, geralmente, é usado somente em linha de comando.

Provedores de Serviço

A maioria dos usuários de Laravel não percebem mas, grande parte de como o Laravel funciona se deve aos seus provedores de serviço. Os provedores de serviços são, em essência, arquivos inicializadores de cada componente e eles são tão abstraídos que os usuários podem utilizá-los para inicializar qualquer componente, de qualquer forma.

Uma explicação grosseira de como isso funciona segue abaixo:

  1. O componente Application do Laravel é inicializado. Esse é o driver principal de toda a framework, responsável por lidar com as Requisições HTTP, executar os provedores de serviços, e agir como recipiente de dependências para a framework.
  2. Uma vez que um provedor de serviço é executado, o método register dele é chamado. Isso permite instanciar qualquer componente que quisermos.
    • Tenha em mente que todos os provedores de serviço tem acesso à aplicação principal do Laravel (via $this->app), o que permite que os provedores de serviços tenham acesso a instâncias de classes criadas de dentro do recipiente de depedência.
  3. Uma vez que essas dependências são carregadas, nós estamos livres para chamar o recipiente, por exemplo, pelo sistema Facade do Laravel, através do App::make.

Voltando ao componente Sessions, daremos uma rápida olhada no SessionServiceProivider:

Esses dois métodos são chamados pela função register(). O primeiro, registerSessionManager(), é chamado para registrar inicialmente o SessionManager. Essa classe estende a classe Manager que mencionei mais acima. O segundo, registerSessionDriver(), registrar um manipulador de registros para o manager, baseado nas configurações que instituimos no início. Isso, eventualmente, invoca esse método da classe Illuminate\Support\Manager:

Aqui, podemos ver que, baseado no nome do driver, escolhido no arquivo de configuração, um método específico é chamado. Então, se tivermos configurados o sistema para usar o manipulador de sessão do tipo file, ele invocará esse método na classe SessionManager:

A classe correta do driver é, então, injetada na classe Store, que é responsável por invocar os métodos verdadeiros para manipulação da sessão. Isso permite que separemos a implementação da classe SessionHandlerInterface da SPL (Standard PHP Library), a classe Store facilita isso.

Criando Nossa Própria Manipuladora de Sessão

Vamos criar nossa própria classe manipuladora de sessão, usando MongoDB. Primeiro, precisaremos criar a classe MongoSessionHandler em uma instalação recém criada do Laravel (Nós pegaremos muitos códigos emprestados da classe Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler):

Você deve salvar esse arquivo no diretório vendor/laravel/framework/src/Illuminate/Session. Para os propósitos desse projeto, nós colocaremos nesse diretório, porém, idealmente, ele deve ficar localizado dentro de um diretório usando seu próprio namespace.

Feito isso, precisamos garantir que a classe Manager pode invocar o driver. Nós podemos fazer isso utilizando o método Manager::extend. Abra o arquivo vendor/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php e adicione o código a seguir. Idealmente, deveríamos estender o provedor de serviços, porém, essa parte está além do escopo desse tutorial.

Atualize o método register() para que ele invoce esse método:

Depois disso, precisamos definir a configuração do Mongo DB. Abra o arquivo app/config/session.php e defina as seguintes configurações:

Já que estamos nesse arquivo, também devemos atualizar a configuração do driver na parte superior driver :

Agora, tente acessar a página inicial (geralmente, localhost/diretorio_instalacao_laravel/public). Se a página carregar sem mostrar a página WHOOPS (página de erros), então, parabéns, nós fomos bem sucedidos em criar um driver de sessão novinho em folha! Teste-o, adicionando alguns dados fictícios na sessão, através do método Session::set() e, então, recupere-o através do Session::get() para mostrá-lo na página.

O Componente Auth

O componente Auth do Laravel é responsável por manipular a autenticação dos usuários na framework e, também, é responsável por administrar as senhas. O que o componente do Laravel fez, foi criar uma abstração de um típico sistema de administração de usuários, usavél na maioria das aplicações web, o que ajuda aos programadores a, facilmente, implementar um sistemade login. Da mesma forma que o componente Session, ele também faz uso do Laravel Manager. Atualmente, o componente Auth tem drivers para:

  • eloquent - esse driver faz uso do ORM embutido no Laravel, o Eloquent. Ele também lança mão de uma classe User.php pré-existente, que fica no diretório models.
  • database - Essa daqui usa qualquer conexão de base de dados que estiver configurada por padrão. Ela faz uso da classe GenericUser para acessar os dados dos usuários.

Já que aqui também seguiremos a mesma implementação do componente Session, o provedor de serviços é bem semelhante ao que vimos mais acima:

Nós podemos ver que, basicamente, ele cria uma classe AuthManager que envolve qualquer driver que estamos usando, além de agir como uma fábrica para esse driver. Dentro da classe AuthManager, ela, novamente, cria o driver apropriado, envolta na classe Guard, que age da mesma forma que a classe Store para a Session.

Criando Nosso Próprio Manipulador de Autenticação

Da mesma forma que antes, vamos criar uma classe MongoUserProvider:

É importante atentar que não estamos temos métodos de comparação com senhas criptografadas, uma vez que esse código foi criado para facilitar a criação de dados fictícios e poder testá-la depois. No código de produção, você precisará criptgrafar as senhas. Verifique a classe Illuminate\Auth\DatabaseUserProvider para um ótimo exemplo de como fazer isso.

Depois, precisamos registrar a callback do nosso driver customizado junto ao AuthManager. Para fazer isso, precisamos atualizar o método register do provedor de serviços:

Por último, também precisamos atualizar o arquivo de configuração auth.php para usar o driver do Mongo, assim como prover os valores de configuração do Mongo:

Testar isso é um pouco complicado, mas, para fazê-lo, lançaremos mão da linha de comando do Mongo DB para inserir um novo usuário na coleção:

Agora, testaremos o método Auth::validate:

Isso deveria retornar um bool(true). Se ele retornar, então acabamos de criar nosso próprio driver de auntenticação!

O Componente Cache

O componente de Cache do Laravel manipula o mecanismo de cache para usarmos na framework. Da mesma forma que discutimos para os outros componentes, ele também faz uso do Laravel Manager (você percebeu algum padrão?). O componente Cache tem drivers para:

  • apc
  • memcached
  • redis
  • file - cache baseado em arquivos. Os dados são salvos no diretórios app/storage/cache.
  • database - cache salvos na base de dados. Os dados são salvos em registros na base de dados. O schema da base de dados para isso é descrito na Documentação do Laravel.
  • array - dados são "guardados" em um array. Lembre-se que o cache baseado em array não persiste os dados e é apagado a cada carregamento.

Como, novamente, segue a mesma implementação dos componente anteriores, você pode assumir que o processo de criar o provedor de serviços é bem semelhante:

O método register() cria um CacheManager, que serve como envólucro e fábrica para os drivers. Dentro do manager, ele envolve o driver em relação à classe Repository, de forma semelhante às classes Store e Guard.

Criando Nosso Próprio Manipulador de Cache

Crie a classe MongoStore, que estenderá a classe Illuminate\Cache\StoreInterface:

Nós também adicionaremos a callback do Mongo, novamente, no manager:

Por último, precisamos atualizar o arquivo de configuração cache.php:

Agora, tente usar os métodos Cache::put() e Cache::get(). Se tiver feito tudo certo, você foi capaz de guardar e recuperar dados de um sistema de cache que usa MongoDB!

Conclusão

Nesse tutorial aprendemos:

  • Sobre o sistema de componentes do Laravel, chamado Illuminate, que é usado pela framework Laravel.
  • Sobre os provedores de serviços do Laravel e um pouco sobre como eles funcionam.
  • Sobre o sistema Manager do Laravel, que age tanto como envólucro quanto uma fábrica para os drivers.
  • Sobre os componentes Session, Auth e Cache e como criar novos drivers para cada um deles.
  • As bibliotecas Store, Guard e Repository que utilizam esses drivers.

Espero que esse artigo possa ajudar os programadores a criarem seus próprios drivers para que possam estender as funcionalidades do Laravel.

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.