Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes | Alura Cursos Online
Primeiras aulas do curso Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes
Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes
Relacionamentos no modelo - Introdução
Olá pessoal, meu nome é Vinicius Dias e serei o seu guia nessa segunda parte do treinamento de Laravel. Se você fez a primeira parte do treinamento, notará que a nossa aplicação está um pouco diferente, e vamos trabalhar em bastante coisa até chegarmos nesse resultado.
Repare, por exemplo, que eu não estou logado, mas consigo acessar algumas áreas da aplicação. Entretanto, se eu tento fazer uma ação que não é permitada - como marcar alguns episódios como vistos -, sou redirecionado para a tela de login. Nós criamos essa página de login juntos, e também aprendemos a utilizar uma página que o próprio Laravel gera para essa funcionalidade.
Depois de logado, descobriremos como liberar acesso a novas funcionalidades para o usuário, como adicionar uma nova série com temporadas e episódios, assim como marcar quais episódios foram vistos. Além disso, utilizaremos o JavaScript para fazermos interações e requisições com a tela sem a necessidade de recarregá-la.
Também abordaremos boas práticas de código, vamos refatorar o código que estamos utilizando e trabalharemos com testes automatizados, rodando um código para garantirmos que tudo continua funcionando, incluindo o banco de dados. Ainda nesse tema, aprenderemos a levantar um banco de dados em memória para inserir e remover dados de teste.
Bastante conteúdo, não?
Espero que goste, bons estudos e até o próximo vídeo!
Relacionamentos no modelo - Preparando o ambiente
Antes de começarmos a trabalhar, vamos preparar o ambiente. Caso você tenha acabado de fazer o primeiro módulo, pode pular esse vídeo e ir direto para o início do nosso projeto. Porém, se estiver começando por aqui ou já faz algum tempo que completou o módulo anterior e quer relembrar o que é necessário instalar na máquina, resolveremos isso rapidamente.
Primeiro, teremos que baixar o PHP e instalá-lo. Se você utiliza Mac ou Linux, basta utilizar o comando respectivo a isso.
No caso do Windows, precisará acessar a página de downloads do PHP e baixar a versão mais recente - na data de criação desse curso, a 7.3.3 -, baixar o ZIP e extraí-lo no diretório onde quiser instalar.
Em seguida, acessaremos "Editar as variáveis de ambiente do sistema" no Menu Iniciar, e clicaremos em "Variáveis de Ambiente". Na nova tela, selecionaremos "Path", clicaremos em "Editar", depois em "Novo", e então colaremos o diretório onde o PHP foi extraído. Após confirmarmos as alterações clicando em "Ok", abriremos o Prompt de Comando e executaremos php -v. Se o PHP foi instalado corretamente, será exibida uma saída com a versão atual da linguagem.
Em seguida, você terá que baixar o Composer, o gerenciador de dependências utilizado para iniciarmos o projeto. No Linux ou no Mac, bastará executar os comandos encontrados na página de downloads do Composer. Já no Windows, você terá que baixar e instalar o executável disponível nessa página.
Feito isso, entraremos na pasta do projeto e executaremos composer install. Esse comando lerá um arquivo chamado composer.json que se encontra na pasta do projeto, e baixará todos os arquivos necessários para trabalharmos com o Laravel, como o próprio Laravel, todas as dependências dele e os pacotes que ele utiliza.
Após a instalação, executaremos php artisan migrate. Esse código lerá as migrations que foram criadas até agora - ou seja, as alterações no banco de dados - e irá executá-las. Feito isso, basta rodar o php artisan serve para subir a aplicação e garantir que tudo continua funcionando.
Agora que estamos com o ambiente configurado, vamos continuar desenvolvendo o nosso sistema.
Relacionamentos no modelo - Criando os relacionamentos
Por enquanto nós só temos seriados sendo salvos na nossa aplicação - inclusive, só temos a Model Serie.php. Porém, sabemos que uma série tem temporadas, e cada uma dessas temporadas tem vários episódios. Logo, faz sentido modelarmos isso no nosso código.
Antes de começarmos a escrever o código, vou apresentar a lógica que pensei para criarmos esses relacionamentos. Hoje, para cada Serie, temos um id (que é um inteiro) e um nome (que é uma string). Agora, queremos que essa Serie tenha temporadas (Temporada[]), que representaremos por meio de um array, uma lista ou uma coleção.
Por enquanto, cada Temporada terá o seu id (um inteiro), um numero (também um inteiro, representando qual temporada estamos nos referindo), a serie (a qual série essa temporada pertence) e vários episodios (Episodio[], também uma lista, um array ou uma coleção). Cada temporada pode ter vários episódios, mas um episódio só pode pertencer a uma temporada.
Por enquanto, o Episodio tem somente um id, um numero e a qual temporada ele pertence. Parece que esse modelo faz sentido, certo? Então vamos ao nosso projeto.
Levando em consideração tudo o que já aprendemos até agora, a ideia seria criarmos uma nova classe na pasta "app" - por exemplo, Temporada.php. Mas vamos aprender uma forma diferente de criar essa classe, dessa vez utilizando o artisan. No Prompt de Comando, chamaremos php artisan make:model Temporada para criarmos o modelo de temporada. Mas, além disso, queremos criar também um arquivo de migration para gerarmos a tabela no banco de dados. Para isso, basta adicionarmos -m ao final desse comando, obtendo:
php artisan make:model Temporada -m
Executando o código, a migration será criada, e também a Model com a classe, o namespace correto e a herança. Aproveitaremos para criar também a Model de Episodios:
php artisan make:model Episodio -m
Primeiramente, teremos que informar ao Laravel que uma série tem várias temporadas. Repare que o Eloquent do Laravel não trabalha com orientação a objetos da forma que estamos acostumados, na qual teríamos, por exemplo:
class Serie extends Model
protected $fillable = ['nome'];
public $temporadas;
O Eloquent, na verdade, trabalha atribuindo esses valores por baixo dos panos. Nesse sentido, como informamos que existe uma relação com temporada? As relações no Laravel são feitas por meio de métodos. Portando, criaremos um método cujo nome será aquele pelo qual queremos acessar essa relação. Por exemplo, se queremos acessar as temporadas de uma série, esse método se chamará...temporadas(). Se chamássemos o método de getTemporadas(), teríamos que acessar $serie->getTemporadas, o que seria estranho.
Sabemos que uma série pode ter muitas temporadas, e é exatamente isso que definiremos no nosso código:
public function temporadas()
return $this->hasMany( related: Temporada::class);
Assim, informamos que uma série tem muitas relações com a classe Temporada.php. Então, vamos criar a relação entre temporadas e episódios. Como acabamos de ver, a relação entre duas classes é feita por meio de um método. Portanto, criaremos o método episodios(), cuja relação funcionará da mesma forma que a anterior:
public function episodios()
return $this->hasMany(Episodio::class);
Repare que, quando apresentei o modelo, comentei que a temporada tinha também a série - ou seja, seria possível, por meio de uma temporada, descobrir qual seria a série. Vamos implementar esse relacionamento, criando um método serie() - no singular, afinal uma temporada tem vários episódios, mas pertence a apenas uma série. Escreveremos essa relação com belongsTo():
public function serie()
return $this->belongsTo(Serie::class);
Agora que definimos o nosso modelo de temporada, falta somente o Episodio.php. Sabemos que, a partir de um episódio qualquer, talvez queiramos acessar a sua temporada. Vamos definir essa relação:
public function temporada()
return $this->belongsTo(Temporada::class);
Com isso, temos todo o nosso modelo definido. Recapitulando: temos uma Serie, que, além de não ter os $timestamps (atributos que salvam a data de criação e atualização da classe), e o atributo $fillable, que informa o que podemos informar de uma só vez para o Laravel, estamos definindo que tem temporadas(), e que essa relação é baseada em hasMany() - ou seja, essa Serie tem muitas Temporada.
Na Temporada, no método serie(), estamos devolvendo essa relação informando que uma Temporada pertence a uma Serie. Além disso, uma temporada também tem muitos episodios(), o que é informado com a relação hasMany(). Fizemos também a relação no modelo Episodio, informando, no método temporada(), que ele pertence (belongsTo()) a uma Temporada.
Se você reparar, nós só escrevemos o código orientado a objetos - inclusive, o nosso diagrama foi só com base nas classes. Mas e no banco de dados, como vamos informar essas relações? Conversaremos sobre isso em mais detalhes no próximo vídeo.
Sobre o curso Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes
O curso Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes possui 230 minutos de vídeos, em um total de 82 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.