Pular para o conteúdo

Auditoria, Log e Relacionamento

Criar relacionamento entre tabela com migration

  • Criar uma tabela aulas e relacionar com a tabela cursos
php artisan make:migration create_aulas_table

alt text

  • Executar a migration
php artisan migrate
  • Criar seeder
php artisan make:seeder NomeDoSeeder
php artisan make:seeder AulaSeeder
  • Incluir novo seeder no arquivo database/seeders/DatabaseSeeder.php

alt text

  • Criar Model e incluir as informações de nome da tabela e colunas
php artisan make:model NomeDaModel
php artisan make:model Aula

alt text

  • Obs: Conforme início do projeto, model Aula extends BaseTimestamp (é filha da classe BaseTimestamp, com as colunas criado e modificado)

  • Se isso não for ajustado, na hora de executar o php artisan db:seed irá apresentar erro, pois tentará cadastrar utilizando as colunas originais de timestamp (colunas created_at e modified_at)

alt text

  • Ajustar a lógica no arquivo database/seeders/AulaSeeder.php para cadastrar seeders

alt text

  • Executar as seeds
php artisan db:seed

Criar relacionamento um para muitos e recuperar dados de duas tabelas

php artisan make:controller AulaController
  • Criar método index para listar as aulas

alt text

  • Criar rota para acessar as aulas

alt text

  • Criar link na view listar cursos (index) para acessar as aulas do curso.

  • Adicionar o id do curso na rota, e passar o id dentro da view listar cursos

alt text

  • Como temos o id na url listar-aulas/id_curso, conseguimos acessar os dados através da controller AulaController

alt text

  • Filtrar o id do curso no select dentro do método index da controller AulaController.php para retornar apenas as aulas do curso acessado

alt text

  • Para exibir dados de uma tabela na outra (inner join), necessário definir o relacionamento nas models (Curso e Aula)

  • Relacionamento -> 1 curso pode possuir várias aulas -> One To Many

  • Implementar na model Curso - Tabela pai: cursos

alt text

  • Implementar na model Aula - Tabela filha: aulas

alt text

  • Recuperar os dados no relacionamento

alt text

alt text

  • Carregar a view na controller AulaController.php

alt text

  • Criar a view para carregar as informações do relacionamento - pasta resources/views/aulas/index.blade.php

alt text

alt text

alt text

alt text

alt text

  • Acrescentar nova coluna ordem das aulas (para melhor exibição)
php artisan make:migration alter_aulas_add_ordem_aula_table

alt text

  • Executar a migration. No caso do sqlite, é necessário passar um valor como default, se não apresentará o erro abaixo

  • Obs: Relembrando, o banco de dados sqlite não aceita a cláusula/método after. Necessário ajustar manualmente em um sistema de gerenciamento de bancos - ex: DB Browser SQLITE

alt text

php artisan migrate
  • Incluir a coluna ordem_aula na seeder AulaSeeder.php

alt text

  • Banco dropado para cadastrar os seeders com a coluna ordem_aula
php artisan migrate
php artisan db:seed
  • Ordenar na controller AulaController.php pela coluna ordem_aula

alt text

  • Criar link para listar aulas na view visualizar-curso (show)

alt text

  • Como existe o relacionamento entre as tabelas, se tentarmos excluir algo da tabela pai (cursos) que possui aulas, não será possível excluir.

Criar formulário cadastrar como relacionamento entre as tabelas

  • Cadastrar uma nova aula para determinado curso

  • Criar a rota para cadastrar nova aula

alt text

  • Como a rota para cadastrar aula recebe o id do curso, precisamos passar para a view.

  • Portanto, na controller AulaController.php, passar para a view aulas/index os dados do curso através do método index (página index é a página que tem o botão para cadastrar aula, botão este que receberá como parâmetro o id do curso)

alt text

  • Criar a view aulas/create.blade.php

  • Com isso, podemos acessar o id do curso na view, ao clicar no botão cadastrar, e acessar a página cadastrar aula (aulas/create)

alt text

  • Dentro da view create, passar o id do curso em um input (no final, ficará como hidden. No momento, exibir para teste), necessário para cadastrar nova aula

alt text

  • Antes de cadastrar nova aula, necessário incluir a nova coluna ordem_aula na Model Aula.php

alt text

  • Antes de cadastrar nova aula, no método store necessário encontrar a última ordem_aula cadastrada, para cadastrar 1 número acima

alt text

Criar formulário editar aula

  • Criar rota

alt text

  • Criar método edit na controller AulaController.php

alt text

  • Incluir na view listar-aulas (aulas.index) o botão para Editar, passando o id da aula

alt text

  • Criar rota update e método update

alt text

alt text

  • Criar view editar-aula, com formulário e dados existentes no banco carregados

alt text

Apagar registro no banco de dados

  • Criar rota

alt text

  • Criar método destroy

alt text

  • Incluir na view listar-aulas e visualizar-aula o botão (formulário) para Apagar, passando o id da aula

alt text

Como usar try catch com Laravel

  • Necessário incluir o try catch na controller, para redirecionar o usuário e enviar uma mensagem de erro.

alt text

  • Necessário incluir session de erro na view, conforme ex: abaixo

alt text

Como usar beginTransaction, commit e rollback

  • Simulação erro (arquivo ClasseController.php): 2 creates, 1 com informações corretas no código e o outro não (1 coluna da tabela deveria ter somente informações int mas em 1 dos creates teve string…)

  • Ao utilizar SQLite, não deu erro pois cadastrou string em um campo integer. Esse cadastro é realizado pois o SQLite utiliza tipagem dinâmica

alt text

  • com o beginTransation, commit/rollback, se existir erro em 1 das manipulações SQL, nenhuma delas é executada no banco.

alt text

Validar formulário no Laravel com request

  • criar um arquivo de Request com validações
php artisan make:request NomeArquivoValidacao
php artisan make:request CourseRequest
  • no arquivo request, passar o atributo name dos elementos (da view) que precisam ser required
  • ex:

alt text

alt text

  • importar o CourseRequest na controller, nos métodos necessários (ex atual: método store)

alt text

  • OBS: necessário retornar true no método authorize do arquivo request, pois por padrão o return é false

alt text

  • OBS: após a etapa anterior, necessário apresentar na view os erros

alt text

  • até aqui, o erro será apresentado porém considerando o nome do atributo

alt text

  • para isso, podemos personalizar as mensagens de validação através do método messages dentro do arquivo Request (CourseRequest.php)

alt text

alt text

Como salvar log

  • monitorar ações realizadas no sistema (necessário em métodos como cadastrar, editar…)

  • arquivo config/logging.php determina onde os logs serão salvos. Por padrão, os registros de log são salvos em storage/logs/laravel.log

  • ex: incluir registro de logs nas controllers ao cadastrar

alt text

alt text

Como criar auditoria com Laravel

  • obs: auditoria registra as informações em uma tabela do banco, ao contrário do registro de logs

  • dependência owen-it/laravel-auditing

  • instalar dependência utilizando o composer

composer require owen-it/laravel-auditing
  • publicar as configurações e as migration para auditoria
php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="config"
php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="migrations"
  • executar a migration
php artisan migrate
  • comando para limpar cache do projeto laravel, pois não estava aparecendo o autocomplete para implementar Auditable
php artisan config:clear
  • recarregar as classes do Composer
composer dump-autoload

alt text

  • importar auditoria na model

alt text

  • verificar os logs de auditoria na tabela audits

alt text

  • importado auditoria na model Curso e Aula