Eloquent, simplificando as Models no Laravel

Eloquent no Laravel

Eloquent no Laravel

Hoje retomo a série de Artigos sobre o Laravel trazendo o Eloquent, uma forma simples de trabalhar com consultas a bancos de dados e desenvolver suas Models.

No último artigo, abordei a criação das migrations e, como o Laravel pode relacionar as tabelas para você. Lembra do exemplo da tabela de produtos que eu criei? Então… Agora é hora de começar a buscar estes dados para a nossa aplicação. Para isto precisaremos criar Eloquent Models.

Models

As Models, dentro da arquitetura MVC, são classes responsáveis pela leitura, escrita e validação  de qualquer dado. Por isto, será aqui que iremos trabalhar com Eloquent para fazermos todo tipo de ações no nosso banco de dados. Mas, primeiro vamos entender o que é o Eloquent.

Eloquent no Laravel

O Eloquent nada mais é que um ORM que vem em conjunto com o Laravel. Mas, melhor que isso, ele possui uma estrutura bem simples para você realizar a implementação da sua lógica de controle com banco de dados.

Com base nos preceitos do ORM (Object relational mapping) Eloquent abstrai toda a complexidade da interação com os bancos de dados utilizando as Models para interagir com cada tabela.

Para facilitar o trabalho com ele existem algumas convenções como:

  • Os nomes de tabelas são padronizadas para o plural da classe que irá consumí-la.
  • As Primary keys são sempre vinculadas à uma coluna id.
  • Toda tabela possuirá colunas timestamp mostrando a data de criação (created_at) e data de atualização (updated_at).
  • Por padrão, as Models do Eloquent irão buscar as configurações de conexão com o banco de dados no arquivo padrão do Laravel, “config/database.php”.

Resumidamente falando, ele consegue trazer em uma ou duas linhas o que você gastaria muitas linhas de comando para executar.

Criando as Models com Eloquent

Saindo um pouco da teoria, vamos voltar ao nosso exemplo. Precisamos criar as Models que irão trabalhar com as tabelas “product_lines” e “products”. Para isto vou abrir o terminal da minha Hospedagem Cloud que possuo aqui na DialHost e digitar o seguinte comando:

 

Ao executar estes comandos vamos poder observar que as novas classes foi criada dentro da pasta app.

product_line.php

product.php

 

Para um sistema de consultas básico nem é necessário implementar funções dentro destas classes. Isto porque o próprio “Eloquent Model” já implementa diversas funções de consultas e manipulação de dados com o banco. Com a classe referenciada vou apenas chamar as funções do Eloquent diretamente através da Controller.

Principais Funções do Eloquent

Consultas

 

Para estas duas últimas funções, aconselho que sejam criadas funções dentro da Model que as executem. Assim, podemos abstrair a regra de consulta das Controllers. Esta forma é uma boa prática , principalmente se temos uma query complexa que exija muitos wheres e etc.

Você ainda pode utilizar de funções agregadoras como count, sum, avg, max, min.

 

Inserindo dados com Eloquent

Para inserir dados com o Eloquent existem 2 formas. Na primeira, você instancia a Model em uma variável, dentro da Controller, seta os atributos e então salva tudo no final.

 

Eu particularmente achei mais direta e limpa a forma a seguir. Ela é denomiada como Mass Assignment. Aqui eu chamo uma função estática que cria o registro passando os atributos como array

 

Para fazer a inserção desta segunda forma você precisa setar na sua Model os campos que serão permitidos serem setados. Por se tratar de uma inserção em massa o Laravel bloqueia todos os campos por padrão. Isto é para evitar que usuários consigam passar parâmetros indesejados na Request e que eles acabem alterando um dado importante dentro do banco de dados.

Então criarei na Model Product a variavel “fillable” e definirei um array com os campos que serão inseridos aqui.

Atualizando dados com Eloquent

A forma mais convencional de atualizar um dado através do Eloquent é semelhante a inserir um dado. A diferença é que já teremos a instância do produto especifico que iremos editar e então salvar o novo valor.

 

Removendo dados com Eloquent

Remover um dado com Eloquent é ainda mais fácil basta setarmos na função o comando delete() na instância que estamos trabalhando.

Conclusão

É claro que na vida real ainda teremos que fazer validações para deletar o registro apenas se ele realmente existir no banco. Ou durante uma edição verificar se o dado já existe antes de atualizá-lo e senão perguntar se o usuário deseja criar.

Apenas lendo por alto o Eloquent já  pensei em um novo post com algumas funções que não deu para explanar aqui. Se fosse a fundo nestas funções este artigo ficaria muito extenso e cansativo. então aguardem até o próximo post onde eu irei falar um pouco sobre funções específicas de busca, updates, criação e remoção de dados.

Felipe Moraes
Felipe Moraes

Desde pequeno eu adorei tecnologia e este sentimento me fez estudar e trabalhar com desenvolvimento, design de interfaces e interação. Esta vontade de melhorar e aprender com a tecnologia me fez estar aqui na DialHost desde 2012.

Criando Migrations com Laravel 5.5

Criação das migrations e relacionamento de tabelas no Laravel

Criação das migrations e relacionamento de tabelas no Laravel

Quando nossa equipe inicia um determinado projeto, costumamos reunir para discutir sobre a estrutura do banco de dados, como as regras de negócio serão implementadas e os dados serão gravados para tudo funcionar o mais perfeito possível. Desta discussão, já montamos o primeiro modelo de relacionamentos das tabelas no banco de dados. Costuma ser um modelo rápido feito no WorkBench.

Acredito que este processo seja parecido em diversas empresas de desenvolvimento, quando estão iniciando um projeto. Agora apresento algumas facilidades e seguranças que os Migrations do Laravel implementam para a montagem da estrutura do seu banco de dados, assim como seu relacionamento como um todo.

Como exemplo prático, montei este banco que simula o catálogo de produtos de uma loja. Este banco possui os produtos e seu relacionamento com a linha de produtos.

Modelo de banco de dados de produtos para exemplo de migration.

Criando as Migrations

O conceito de migrations trazido pelo Laravel permite o controle de versões e assim facilitar a modificação e compartilhamento da estrutura do banco de dados entre equipes. Imagine você mexendo em um projeto, em seu ambiente de desenvolvimento. Você cria uma nova coluna em seu banco de dados e continua desenvolvendo seu código normalmente. Sem as migrations seu colega pega seu código coloca no ambiente de desenvolvimento dele e tenta rodar. É claro que teremos diversos erros disparando na tela deste cara.

Agora com as migrations seu colega de trabalho verá nos registros de versionamento do código que teve uma atualização de arquivos na pasta “migrations” e então basta ele rodar o comando php artisan migrate que seu banco estará totalmente atualizado.

Para criar uma migration, durante o desenvolvimento do código é importante que tenhamos uma configuração de banco de dados. Afinal no fim das contas as migrations irão produzir um banco de dados.

Para configurá-lo basta setar as configurações do banco de dados, criado em seu servidor, dentro do arquivo .env que fica na raiz do projeto.

 

Ahhh, quase ia me esquecendo! Se você chegou aqui mas está perdido em como instalar o Laravel, tenho o primeiro artigo desta série.

Tudo configurado, agora vamos gerar nossas novas classes de migrations. Isto tudo será feito através do comando artisan make:migration.

Ao final de cada comando, vocês podem ver que adicionei a opção –create. Esta opção permite que eu defina o nome da tabela que eu estou criando. Existem outras opções para este comando que vocês podem ver na documentação completa do Laravel 5.5.

A estrutura da migration é simples. Ela importa as classes Schema, Blueprint e Migration  e possui 2 funções:

UP

Esta função é a responsável pela implementação das atualizações do banco. criar uma tabela, atualizar uma coluna e etc.

Down

É a função que fará exatamente o inverso da função UP revertendo seu banco de dados ao estado anterior a esta atualização.

Então, minhas classes ficaram desta forma.

create_product 

 

create_product_line 

 

Acima você vai ver que existe uma definição que não estava em meu diagrama. $table->timestamps(); Isto é um padrão do Eloquent do Laravel para controlar quando um dado é criado e atualizado.

Outra definição do diagrama porém, não foi incluída de propósito.  Fiz isto para chegar finalmente ao objetivo deste post. Os relacionamentos entre as tabelas.

Relacionando tabelas

Com as migrations é possível criar foreign keys e definir o relacionamento entre as tabelas do seu banco de dados. Este relacionamento cria restrições que protegem a integridade dos dados suas tabelas.

Para criar este relacionamento é bem simples.  Voltemos ao nosso exemplo no arquivo create_product 

 

Traduzindo a linha nova, temos uma Foreign key que referencia à coluna “id” na tabela “product_line”.

Além disto é possível adicionar restrições para qualquer ação de atualização (onUpdate) e exclusão (onDelete) de registros dentro da tabela.  Neste caso tratarei para que sempre que houver a exclusão de uma linha de produtos este perca a referência com a tabela product_line (Setar como nulo).

Desta forma eu permito que uma linha de produto seja excluído. Claro que aqui o produto ficará orfão de uma linha de produto. Mas, por enquanto estamos apenas trabalhando as regras do banco.

Removendo um relacionamento

Apenas para concluir… Se quiser remover o relacionamento criado isto é possível utilizando o método dropForeign.

Agora que as migrations estão completas o próximo passo será definir as Models. Mas, este fica pro próximo artigo. 🙂

Felipe Moraes
Felipe Moraes

Desde pequeno eu adorei tecnologia e este sentimento me fez estudar e trabalhar com desenvolvimento, design de interfaces e interação. Esta vontade de melhorar e aprender com a tecnologia me fez estar aqui na DialHost desde 2012.

Desenvolvimento Laravel: Laravel 5.5 Chegou! Confira as novidades e como instalar.

Nova versão Laravel 5.5

Conheças as novidades e como instalar o novo Laravel 5.5

Iniciarei hoje uma série nova baseada em alguns estudos que estou fazendo sobre desenvolvimento Laravel. A ideia desta série e trazer novidades e aprofundar os conhecimentos sobre este Framework PHP que já tomou destaque junto ao mercado. Inicio hoje com a chegada do Laravel 5.5. Confesso até que ele foi um grande impulsionador para eu querer começar a série.

Bem, não poderia começar com um novo lançamento sem falar de suas novidades. Por isso, abaixo, deixarei as novidades que achei mais interessantes e depois utilizarei a minha plataforma de Hospedagem Cloud aqui da DialHost para realizar uma instalação limpa do Framework.

Tela Whoops

A tela de Whoops do Laravel é sem dúvida uma ajuda e tanto no momento que estamos desenvolvendo um novo projeto. Ela é o debugger do Framework que nos mostra quando algo não está certo com a nossa programação.

Ela em si não é nova, mas sua apresentação está mais interativa mostrando a parte do seu código que está ocorrendo o erro. Como podemos ver ela apresentará o erro a esquerda e o código com a linha destacada a direita. Muito prático!

Whoops Laravel 5.5

Tela de Whoops do Laravel 5.5

Validação de requisições

Nas versões anteriores do Laravel, uma validação de dados deveria ser feita através da Controller. Agora é possível que a própria Request execute a validação e retorne a mensagem. E ao fim da validação a mesma retornará apenas os dados que foram tratados por esta validação. Para deixar mais claro vou deixar um exemplo de como era e como ficou esta chamada para salvamento de um produto.

Antes (Laravel <5.5)

 

Agora

 

Retorno

 

Presets de FrontEnd

Esta é para os Frontenders de plantão. Agora o Laravel deixa disponível alguns Presets já configurados para você trabalhar com Vue, React e Bootstrap. Mas se você não quiser também pode utilizar nenhum Preset. Você pode utilizar e configurar estes Presets através do “php artisan preset Vue” por exemplo.

API Resources

Para não alongar demais selecionei um último item que achei bem útil. Resources Classes agora permitem que nós transformemos nossas Eloquent Models para estruturas em JSON. Isto facilita e traz consistência para a liberação de uma API para o público.

Claro que este novo lançamento não se limita a estas novidades. Mas para os mais aficionados pelo lançamento deixo uma integra, em inglês, sobre todas as novidades que esta versão trouxe. Laravel 5.5 LTS is Now Released

Instalando o Laravel 5.5

Configurando o acesso SSH

A instalação do Laravel 5.5 é muito simples já que ele conta com o auxilio do composer. Para começar configurei minha hospedagem cloud. Escolhi ela pois me permite ter o acesso SSH da minha instância, existe o isolamento de recurso que permite o crescimento do projeto e consigo a praticidade do painel de controle.

No painel eu consigo ver meu IP de acesso e caso não tenha ainda, solicitar a senha para acesso SSH através do HelpDesk.

Painel de hospedagem Cloud

Painel de controle da hospedagem Cloud

Com todas as configurações na mão, agora é só acessar o SSH. No caso estou utilizando o programa MRemoteNG para windows.

Instalação do composer

O Primeiro passo será instalar o Composer:

 

Após instalado comece a rodar o serviço:

 

Instalação do Laravel

Agora que o Composer está instalado e configurado vamos ao Laravel… Acesse o diretório aonde você deseja criar o projeto novo (meu_projeto) e rode o comando abaixo:

 

Este procedimento poderá demorar um pouco. (Comigo foi algo em torno de 3 min). Mas se tudo der certo você já poderá acessar o Laravel no diretório “meu_projeto” em que você pediu para instalar.

Após instalado o sistema, no diretório do projeto, você precisa configurar seu arquivo de ambiente. O Laravel fornece um template padrão chamado .env.example. Para começar podemos apenas renomear este arquivo para .env utilizando o código abaixo:

 

OBS.: Caso você não faça o procedimento acima e tentar acessar seu projeto pelo navegador, você verá a seguinte mensagem

Laravel 5.5 something went wrong

Tela de erro do Laravel 5.5 sem a exibição de debugs

Por fim é preciso rodar o comando abaixo para criar a chave da sua aplicação. Ela é utilizada para garantir a segurança interna do Laravel e o Framework só funcionará com esta chave setada em seu .env. Para criá-la basta roda o comando abaixo.

 

OBS.: Se você acessar sua nova instalação assim que você instalar sua tela apresentará o erro abaixo.

Whoops Laravel 5.5

Erro por não geração de “encryption Key”

Depois de tudo instalado você verá a tela de bem vindo do Laravel e já pode começar a implementar seu projeto.

O Laravel é um Framework bem completo e permite fazer muita coisa com simplicidade no código. Na verdade este é o intuito deles… Ter um código limpo bonito e simples de entender.

Let’s Encrypt™ trará Certificados WildCard em 2018

Let's Encrypt lançará SSL WildCard em 2018

Let’s Encrypt lançará SSL WildCard em 2018

A organização Let’s Encrypt™ parece cada vez mais empenhada na missão de tornar a internet 100% HTTPS. Seu próximo passo, que já se encontra em desenvolvimento, é o WildCard Certificates que já possuí uma data de lançamento para Janeiro de 2018.

A organização já conta com 47 milhões de domínios seguros. Domínios validados através do seu processo automatizado de validação de domínios. Há algum tempo ela iniciou o desenvolvimento de seus certificados WildCard. Segundo eles a proposta veio pois certificados WildCard são constantemente requisitados. Eles ainda acreditam que com o WildCard teremos maior facilidade para o desenvolvimento em HTTPS e assim contribuirá para seu objetivo primordial, o de tornar a web 100% HTTPS.

Como funcionam os certificados WildCard?

O certificado WildCard funciona protegendo qualquer subdomínio dentro de um domínio base (Ex.: *.dialhost.com.br). Isto facilita muito o gerenciamento dos domínios já que um único certificado e um único par de chaves de segurança serão utilizados para o domínio e todos os seus subdomínios.

Estes certificados, assim como já acontece nos certificados Let’s Encrypt™, serão gratuitos e poderão ser ativados através da ACME v2 API.

Inicialmente a validação será via DNS do domínio base, mas já existem planejamentos para outras opções.

O que muda no mercado SSL com isto

A primeiro momento pode haver uma preocupação com relação às vendas dos certificados SSL WildCard. Mas, esta popularização é boa pois forçará este mercado a melhorar ainda mais seu nível de segurança. Afinal ainda hoje, a segurança das informações que circulam pela internet é uma das maiores preocupações de qualquer usuário que utilize a rede para realizar compras, guardar documentos e se comunicar com outros usuários.

Além disto, como comparado em outro post mais antigo que eu fiz (Desvendando os certificados SSL grátis) ainda existem certificados mais específicos que vão validar toda a empresa e não somente o domínio registrado. Neste caso espera-se  haja uma popularização deste tipo de certificado.

E que venha 2018

Se 2016 foi o ano da implantação do SSL grátis. 2018 será uma ano de expansão global para os diversos subdomínios que temos por aí. A equipe DialHost já está esperando por novidades para conseguirmos implementar mais esta ferramenta para todos os clientes.

Por hoje fico por aqui e agradeço pela leitura. Abs!

Felipe Moraes
Felipe Moraes

Desde pequeno eu adorei tecnologia e este sentimento me fez estudar e trabalhar com desenvolvimento, design de interfaces e interação. Esta vontade de melhorar e aprender com a tecnologia me fez estar aqui na DialHost desde 2012.

Micro serviços e cloud computing

Micro serviços em estrutura cloud

Micro serviços em estrutura cloud

Para a edição de hoje gostaria de mostrar um pouco da arquitetura de micro serviços utilizando uma estrutura em cloud computing. Assim, mostrarei um pouco sobre esta estrutura e como podemos tirar ganhos em diversos projetos.

Os micro serviços

Antes de mais nada é preciso entender alguns pontos chaves do conceito de micro serviços. Imagine um cenário onde você possui uma aplicação que deve suportar uma gama diferente de usuários que utilizam browsers desktop, mobile e alguns ainda utilizam sua aplicação através de um app nativo. Complicando um pouco mais esta aplicação possui uma API aberta para integração do seu sistema com outros sistemas (Algo muito comum por exemplo, no facebook, google, twitter e etc).

Concordam que está aplicação, sem nem mesmo falarmos das funcionalidades, teria um corpo complexo e demasiadas responsabilidades para conseguir gerenciar? Mas porque deixar isto tudo nas mãos de apenas um sistema?!

Desde que comecei a aprender um pouco sobre orientações a objetos (há uns 8-9 anos atrás) comecei a relacionar sistemas como o próprio sistema orgânico. Ou seja, cada coisa deve ter sua responsabilidade específica e simples. Assim, ela pode exercer melhor e com mais desempenho sua determinada função.

Quando comecei a conhecer a arquitetura de micro serviços consegui enxergar perfeitamente esta organicidade no macro de um projeto. Poxa, porque um projeto com tantos requisitos e tantas responsabilidades precisam sem emaranhar em apenas uma estrutura monolítica gigantesca. Consegue imaginar a complexidade de códigos, classes que vão se desembrulhando para responder às regras exemplificadas acima?!

O conceito de micro serviços traz uma proposta simplicadora. Vamos reduzir este grande sistema em um sistema com N serviços auxiliares e específicos que serão responsáveis por cada regra. Um serviço responsável pelo tratamento de clientes, um pela comunicação da API que por sua vez trabalhará com um serviço que montará a interface para o usuário e assim por diante… Posso trazer mil analogias com o que vemos no mundo real em grandes organizações, orquestras, times e etc. Os micro serviços trabalham de forma grupal para trazer um resultado unificado.

Resultado disto tudo

  • Micro serviços devem ser considerados como sistemas relativamente pequenos assim temos maior simplicidade em entender seu código
  • Maior produtividade no desenvolvimento, desde o processamento de menos arquivos pela IDE de desenvolvimento até menor curva de aprendizado do serviço.
  • Facilidade ao escalar seu desenvolvimento. Já que estes serviços trabalham em paralelo é possível que diferentes times de desenvolvimento possam trabalhar e fazer o deploy de cada serviço de forma independente.
  • Atualizar apenas um serviço para novas tecnologias (como um novo framework, uma nova versão de PHP etc) se torna mais simples, rápido e menos custoso do que readaptar todo o sistema.

Onde o cloud computing entra nisto tudo?

Com a separação de cada serviço, imagine estes serviços trabalhando em paralelo, cada um com sua própria instância e configuração ideal para o funcionamento mais otimizado possível do projeto. Cheguei apenas a esta lista de possibilidades.

  • Otimização de recursos: Você pode elevar ou descer recursos ajustando de acordo com a necessidade específica de cada serviço.
  • Otimização dos custos: Com a maior flexibilidade no ajuste dos recursos você notará que seus custos serão otimizados apenas para o que você realmente utiliza.
  • Otimização do sistema: Como cada instância é isolada você pode configurar o servidor de acordo com a necessidade específica do serviço em questão. Ex.: Você pode configurar um sistema de cacheamento para serviços que demandem informações estáticas, configurar um instância apenas com otimizações para bancos de dados.
  • Estabilidade do sistema: Se um serviço tiver um pico de uso, de memória por exemplo, por conta de um processo, um outro serviço não será penalizado por isto. O mesmo ocorre com o funcionamento do sistema, como um todo, se houver um deploy bugado de apenas um serviço.
  • Escalabilidade: É bem mais rápido e econômico escalar em diversas instâncias um único serviço que já não é suportado mais com apenas uma instância do que o sistema completo.

Como integrante da equipe de desenvolvimento da DialHost, vi e participei da implementação de alguns micro serviços em nossos projetos e conseguimos ver principalmente uma melhora grande na produtividade da equipe em manutenções e maior facilidade para resolver bugs que ocorriam. Conseguimos também dinamizar e escalar de forma mais eficiente ao utilizar nossa solução de Cloud computing colocando apenas os recursos ideais para cada serviços que criamos

Mas, Nem tudo são flores

A principal questão a se avaliar antes de seguir na arquitetura de micro serviços é que o time de desenvolvedores precisa ter o conhecimento para criar um sistema que funcione de forma distribuida. Como em um trabalho em equipe na vida real, se os serviços não trabalharem com sintonia seu sistema não funcionará. A equipe de desenvolvimento fica responsável por criar um mecanismo de comunicação entre estes serviços, afinal eles são serviços isolados que podem trabalhar em conjunto.

As principais IDE’s do mercado hoje em dia, ainda são focadas na criação de aplicações monolíticas. Assim, você não terá muito apoio destas ferramentas para a criação de aplicações distribuídas.

Por fim, se não for muito bem planejado o uso dos microserviços pode ter um efeito reverso na otimização dos seus recursos. É preciso avaliar bem até que ponto você quer ou precisa separar um sistema em diversos micro serviços para que ele não acabe aumentando seu consumo de memória ou até mesmo processamento.

Felipe Moraes
Felipe Moraes

Desde pequeno eu adorei tecnologia e este sentimento me fez estudar e trabalhar com desenvolvimento, design de interfaces e interação. Esta vontade de melhorar e aprender com a tecnologia me fez estar aqui na DialHost desde 2012.