{"id":26052493,"url":"https://github.com/tiagotas/biblioteca","last_synced_at":"2026-04-21T06:33:27.871Z","repository":{"id":268929775,"uuid":"905890193","full_name":"tiagotas/Biblioteca","owner":"tiagotas","description":"Repositório da série de videoaulas sobre CRUD no MySQL usando MVC e PHP 8.4","archived":false,"fork":false,"pushed_at":"2025-03-06T20:04:03.000Z","size":115,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-06T20:19:32.671Z","etag":null,"topics":["crud","mvc","mysql","php84"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/watch?v=4h6j3ODwsEw\u0026list=PLHVpcBDJr5dmL-5tYqBmf_PxJrtrdAMT6","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tiagotas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-19T18:19:03.000Z","updated_at":"2025-03-06T20:04:06.000Z","dependencies_parsed_at":"2025-03-06T20:19:30.101Z","dependency_job_id":"081a4ffd-5dcc-4504-ba06-eaeeeb7f7bf3","html_url":"https://github.com/tiagotas/Biblioteca","commit_stats":null,"previous_names":["tiagotas/biblioteca"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiagotas%2FBiblioteca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiagotas%2FBiblioteca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiagotas%2FBiblioteca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiagotas%2FBiblioteca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tiagotas","download_url":"https://codeload.github.com/tiagotas/Biblioteca/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242512389,"owners_count":20141389,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crud","mvc","mysql","php84"],"created_at":"2025-03-08T06:34:25.114Z","updated_at":"2026-04-21T06:33:27.864Z","avatar_url":"https://github.com/tiagotas.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Curso completo de MVC com PHP 8.4 usando MySQL com padrão de projetos DAO. O curso tem quase 8 horas de conteúdo e está disponpivel gratuítamente no YouTube, link da playlist abaixo.\nNeste curso são abordadas as novas funcionalidades do PHP 8.4, como Property Hooks e inicialização de objetos anônimos. Além de recursos já conhecidos como Type Hint, nullsafe operator e null coalescing.\n\n## CURTIU MEU TRABALHO?\nVocê pode me ajudar com um PIX para tiago@tiago.blog.br 🍻\n\n## Playlist com todas as videoaulas de construção desse projeto\n- https://www.youtube.com/watch?v=4h6j3ODwsEw\u0026list=PLHVpcBDJr5dmL-5tYqBmf_PxJrtrdAMT6\n\n## Como ver funcionando:\n- Faça o Forward Engineer do Banco de Dados no MySQL Workbench\n- Abra a pasta App no VS Code e via terminal inicialize o servidor do PHP\n- Se necessário, edite os dados de conexão com MySQL no PHP (host, porta, usuário e senha)\n- ``` php -S localhost:8000 ```\n- Acesse no seu navegador: http://localhost:8000\n\n## Conteúdo das Videoaulas\n### AULA 1 - COMO FAZER MVC COM PHP 8.4 E MYSQL - AMBIENTE DE DESENVOLVIMENTO (37mim)\n- 00:00 Introdução\n- 01:47 Materiais usados no curso\n- 02:18 Porque instalar PHP puro?\n- 03:22 Download do PHP\n- 03:40 Diferença entre NTS e TS do PHP\n- 04:17 Download do MySQL\n- 05:26 Download do Visual Studio Code\n- 05:42 Instalação do MySQL\n- 07:16 Instalação do Visual Studio Code\n- 08:23 Instalação do PHP\n- 10:43 Arquivo de Configuração do PHP\n- 12:11 Configurar PHP para mostrar erros\n- 12:50 Definindo diretório das extensões\n- 13:57 Habilitando as extensões do PHP\n- 15:30 Adicionando o PHP ao PATH do Windows\n- 17:48 Adicionando o VC Runtime 14.38\n- 20:38 Configurando o MySQL \n- 20:27 A porta 3306, veja isso\n- 22:50 Definindo a senha do MySQL\n- 24:02 Finalizando configuração do MySQL\n- 24:25 Configurando a conexão com Workbench\n- 26:04 Configurando o Visual Studio Code\n- 28:50 Ajustando o PATH do PHP no Windows\n- 29:55 Resolvendo VC Runtime 14.38 com x64\n- 31:36 Testando Servidor Interno do PHP\n- 33:47 Testando configurações do PHP\n- 34:15 Inicializando o Servidor Interno do PHP\n\n### AULA 2 - COMO FAZER MVC COM PHP 8.4 E MYSQL - ESTRUTURA E BANCO DE DADOS DA APLICAÇÃO (42mim)\n\nCódigo-fonte da videoula: [1a4f09d](https://github.com/tiagotas/Biblioteca/tree/1a4f09d168606ea1fc6319ef7e7efb755d9d62ce)\n\n- 00:00 Introdução\n- 01:09 Modelagem DER do Banco de Dados\n- 02:47 Modelo lógico do Banco de Dados\n- 03:26 Construindo o Projeto Físico do Banco de Dados\n- 23:10 Definindo a estrutura da aplicação\n- 23:56 Definição do MVC\n- 27:27 Atenção a qual pasta abrir no VS Code\n- 28:20 Definindo os arquivos do Projeto\n- 32:28 Enviando o projeto ao GitHub\n- 35:46 Mudando a pasta aberta no VS Code\n- 38:00 Criando arquivo index\n- 39:15 Inicializando o servidor do PHP\n- 40:17 Enviando alterações para o github\n\n### AULA 3 - COMO FAZER MVC COM PHP 8.4 E MYSQL - COMO FUNCIONA AUTOLOAD DE CLASSES E NAMESPACES (51mim)\n\nCódigo-fonte da videoula: [4290b1e](https://github.com/tiagotas/Biblioteca/tree/4290b1e35d47d542dc83baac1899fb4c9cddfaec)\n\n- 00:00 Introdução\n- 01:09 Inicializando o servidor interno do PHP\n- 03:20 Como parar servidor do PHP\n- 03:52 Carregando comandos anteriores do Terminal\n- 04:16 Funções usadas na aula\n- 04:38 Como funciona a função include do PHP\n- 07:30 Demonstração de funcionamento do include\n- 08:12 Uso da função ```var_dump```\n- 10:56 Definindo as configurações do projeto\n- 12:42 Função ```define``` para constantes em PHP\n- 14:20 Função ```dirname``` e constante mágica ```_FILE_```\n- 21:55 Variável super global ```$_ENV```\n- 24:23 Criando o mecanismo de autoload de classes no PHP\n- 24:52 Como funciona a função ```sql_autoload_register```\n- 27:45 Demonstrando a função ```sql_autoload_register```\n- 29:45 Autoload com Namespaces no PHP\n- 33:06 Implementando o include dentro da ```sql_autoload_register```\n- 33:25 Função ```file_exists```\n- 35:29 Parâmetro ```levels``` da função ```dirname``` e namespaces\n- 38:27 Definindo as rotas da aplicação\n- 39:57 Comando ```use``` para trabalhar com namespaces\n- 40:28 Como funciona a função ```parse_url```\n- 43:37 Uso switch case para tratar as rotas\n- 46:48 Encapsulando funcionalidades na Controller\n- 47:43 Porque declaramos métodos estáticos\n\n### AULA 4 - COMO FAZER MVC COM PHP 8.4 E MYSQL - CRUD NO MYSQL PARTE I - CAMADA MODEL E DAO (1h6mim)\n\nCódigo-fonte da videoula: [840df0e](https://github.com/tiagotas/Biblioteca/tree/840df0e85f6d8ced48ccd405c52513f9f8f8979b)\n\n- 00:00:00 Introdução\n- 00:02:11 Análise da modelagem do banco de dados\n- 00:03:35 Análise do projeto físico do banco de dados\n- 00:04:17 Definindo a Model de Alunos\n- 00:05:08 Conceitos iniciais de Orientação a Objetos\n- 00:05:50 Funcionalidades (métodos) da Model\n- 00:06:51 Definindo tipo de retorno de métodos em PHP\n- 00:08:56 Tipo anulável de retorno\n- 00:11:34 Criando e preenchendo o objeto model de Aluno\n- 00:12:15 Definindo namespace da Model\n- 00:12:45 Comando use de Model na camada Controller\n- 00:13:47 Definindo a camada DAO\n- 00:14:40 Implementando os métodos da DAO\n- 00:18:27 Uso do operador ternário\n- 00:21:50 Instanciando a DAO dentro da Model\n- 00:22:09 Objetos anônimos em PHP\n- 00:22:47 Enviando um model preenchido para DAO\n- 00:24:40 Criando e demonstrando um model na Controller\n- 00:33:23 Definindo a conexão com o MySQL\n- 00:34:11 Implementando o classe DAO\n- 00:34:36 Propriedade para armazenar a conexão com MySQL\n- 00:35:30 Definindo relação de herança entre AlunoDAO e DAO\n- 00:36:14 Declarando método construtor da DAO\n- 00:36:40 Classe PDO do PHP para MySQL\n- 00:37:26 Definindo o parâmetro DSN do PDO\n- 00:38:52 Estabelecendo relação de herança entre DAO e PDO\n- 00:39:50 Definindo a conexão com MySQL via PDO\n- 00:44:25 Implementando padrão Singleton para conexão com MySQL\n- 00:46:17 Conceito de classe abstrata para a classe DAO\n- 00:46:46 Definindo construtor na classe AlunoDAO\n- 00:48:40 Implementando ```insert``` com Preparated Statements\n- 00:51:43 Obtendo id inserida com ```last_insert_id```\n- 00:53:21 Implementando método ```update```\n- 00:54:33 Implementando método ```selectById```\n- 00:57:06 Implementando método ```select```\n- 00:58:16 Implementando método ```delete```\n- 00:59:41 Chamando os métodos da DAO na Model\n- 01:01:14 Implementando \"testes\" na Controller\n- 01:02:26 Definindo tipo de retorno ```void``` na Controller\n- 01:02:30 Palavra chave ```final``` no contexto do projeto\n- 01:03:39 Testando interação com MySQL\n\n### AULA 5 - AULA 5 - COMO FAZER MVC COM PHP 8.4 E MYSQL - CRUD NO MYSQL PARTE II - CAMADA VIEW E CONTROLLER (1h4mim)\n\nCódigo-fonte da videoula: [17b920e](https://github.com/tiagotas/Biblioteca/tree/17b920ea2b6ee0217728468bff102f689c928543)\n\n- 00:00:00 Introdução\n- 00:00:48 Adequações no nome das Propriedades\n- 00:04:58 Análise do Modelo Entidade Relacionamento\n- 00:08:10 Ajustes para objetos anônimos\n- 00:10:44 Atualização extensão PHP Intelliphense para PHP 8.4\n- 00:16:30 Adicionando a View da Tela Inicial\n- 00:17:50 Adicionando Bootstrap ao Projeto\n- 00:18:36 Implementando a Controller da Tela Inicial\n- 00:20:37 Juntando a View e a Controller da Tela Inicial\n- 00:21:57 Adicionando o Controller da Tela inicial ao arquivo de rotas\n- 00:23:04 Ajuste da constante de VIEWS no arquivo ```lconfig.php```\n- 00:24:26 Desenvolvendo a Tela Inicial com Bootstrap\n- 00:26:11 Implementando Menu do Sistema com Navbar do Bootstrap\n- 00:32:56 Implementando a lista de alunos com Bootstrap\n- 00:34:26 Juntando a View de Lista de Alunos com a Controller\n- 00:39:17 Iterando a lista de alunos com foreach\n- 00:42:41 Implementando o formulário de Alunos\n- 00:48:07 Recebendo dados do formulário na Controller\n- 00:51:02 Abrindo detalhes do Aluno no Formulário\n- 00:53:57 Implementando Update vindo do formulário\n- 00:58:07 Implementando a funcionalidade Delete de Aluno\n- 01:02:30 Enviando alterações para GitHub\n\n### AULA 6 - COMO FAZER MVC COM PHP 8.4 E MYSQL - SISTEMA DE LOGIN COM SESSION E COOKIE (47mim)\n\nCódigo-fonte da videoula: [dde4804](https://github.com/tiagotas/Biblioteca/tree/dde4804cf6b444a17720b18c9a414d67d4a01858)\n\n- 00:00 Introdução\n- 01:55 Inserindo usuários no banco de dados\n- 03:39 Definindo a Controller de Login\n- 04:20 Definindo a DAO de Login\n- 04:34 Definindo a Model de Login\n- 06:17 Programando a DAO de Login\n- 08:37 Programando a Model de Login\n- 10:00 Programando a Controller de Login\n- 13:25 Definindo e Programando a View do Login\n- 17:07 SESSIONS no PHP\n- 19:53 Definindo a rota de Logout\n- 20:12 Implementando o método de logout com ```session_destroy()```\n- 21:30 Explicando o procedimento de Login\n- 29:21 Definindo a variável ```$_SESSION```\n- 32:11 Definindo o botão de sair\n- 34:01 Protegendo as rotas - acessar apenas com Login\n- 37:55 Lembrando e-mail do usuário com ```setcookie()```\n- 43:41 Recuperando o valor de um cookie com ```$_COOKIE```\n\n### AULA 7 - COMO FAZER MVC COM PHP 8.4 E MYSQL - TRATAMENTO DE ERROS E INSERT EM ENTIDADES N:N (1h45mim)\n\nCódigo-fonte da videoula: [ea32567](https://github.com/tiagotas/Biblioteca/tree/ea32567d99ea0a1f24b9c1816076378873cebcd3)\n\n- 00:00:00 Introdução\n- 00:03:43 Criação do Método ```render()``` na Controller\n- 00:06:01 Porque usar a palavra chave ```final```\n- 00:09:43 Refatorando o método listar da AlunoController\n- 00:10:58 Definindo a classe abstrata Model\n- 00:16:07 Definindo o tipo do parâmetro ```$model``` no método ```render()```\n- 00:17:54 Tratando mensagens de erro com Exception\n- 00:21:42 Definindo os métodos ```setError()``` e ```getErrors()``` na Model\n- 00:28:56 Introduzindo as Property Hooks do PHP\n- 00:35:26 Operador Null Coalescing\n- 00:36:49 Apresentando as mensagens de validação na View\n- 00:40:48 Definindo o método ```isPost()``` na Controller\n- 00:42:26 Definindo o método ```redirect()``` na Controller\n- 00:44:14 Padronizando os métodos e rotas\n- 00:48:56 Testando mensagens de erro\n- 00:50:43 Refatorando o método ```delete()``` da Controller\n- 00:53:47 Implementando as entidades Categoria e Autor\n- 00:57:32 Implementando Crud da entidade Livro\n- 00:58:50 Vinculando as entidades Categoria e Livro - Relação 1:N\n- 01:06:30 Ajuste das rotas no menu de navegação\n- 01:06:45 Vinculando as entidades Autor e Livro - Relação N:N\n- 01:07:29 Selecionando vários autores por Livros - Relação N:N\n- 01:15:13 Como é a chegada de múltiplas checkbox no ```$_POST```\n- 01:17:25 Usando ```var_dump()``` para ver o preenchimento da Model\n- 01:19:40 Inserindo em mais de uma tabela usando ```transactions``` do PDO\n- 01:27:00 Importância do ```commit``` nas ```transations``` em PDO\n- 01:27:58 Update, Delete e Insert na mesma transaction com PDO\n- 01:33:35 Selecionando dinamicamente uma option do select de Categoria\n- 01:36:41 Selecionando dinamicamente uma checkbox dos Autores\n- 01:42:31 Usando a função ```in_array()``` para selecionar o checkbox\n- 01:43:58 Testando as funcionalidades da entidade Livro\n\n### AULA 8 - COMO FAZER MVC COM PHP 8.4 E MYSQL - NULLABLE OPERATOR E SERIALIZE DE SESSIONS(47mim)\n\nCódigo-fonte da videoula: [5ef9483](https://github.com/tiagotas/Biblioteca/tree/5ef9483bc0acffc1f50569daf13a1d99af369905)\n\n- 00:00 Introdução\n- 03:22 Criando o arquido das Views de Empréstimo\n- 04:24 Criando o arquivo da Model de Empréstimo\n- 04:36 Criando o arquivo da DAO de Empréstimo\n- 04:57 Criando o arquivo da Controller de Empréstimo\n- 05:40 Implementando as rotas para Empréstimo\n- 06:52 Implementando a Controller de Empréstimo\n- 09:06 Implementando a Model de Empréstimo \n- 09:51 Implementando a DAO de Empréstimo\n- 12:07 Definindo as Propriedades da Model de Empréstimo\n- 13:24 Refatorando o método ```insert()``` na DAO de Empréstimo\n- 15:41 Refatorando o método ```update()``` na DAO de Empréstimo\n- 17:17 Refatorando o método ```selectById()``` na DAO de Empréstimo\n- 18:34 Refatorando o método ```select()``` na DAO de Empréstimo\n- 19:00 Definindo a propriedade Dados_Aluno e Dados_Livro na Model de Empréstimo\n- 23:27 Refatorando o método Delete da DAO de Empréstimo\n- 24:01 Refatorando a View de Listagem de Empréstimo\n- 29:15 Analisando o array de objetos Empréstimo com ```var_dump()```\n- 31:04 Refatorando a View de Formulário de Empréstimo\n- 31:57 Definindo a lista de alunos no cadastro de Empréstimo\n- 36:04 Definindo a listagem de alunos e de livros na Model de Empréstimo\n- 37:01 Carregando os registros de Alunos e Livros na Controller Empréstimo\n- 38:55 Usando o operador nullsafe (nulo-seguro) no PHP\n- 43:01 Refatorando a funcionalidade de Insert na Controller de Empréstimo\n- 45:38 Definido método para obter dados do usuário na LoginController\n- 46:00 Usando as funções ```serialize()``` e ```unserialize()``` para pegar objetos da ```$_SESSION```\n- 51:11 Selecionando dinamicamente Aluno e Livro no cadastro de Empréstimo\n- 54:07 Testando as funcionalidades CRUD de Empréstimo\n- 54:46 Conclusão e agradecimentos\n\n## CURTIU MEU TRABALHO?\nVocê pode me ajudar com um pix para tiago@tiago.blog.br 🍻\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiagotas%2Fbiblioteca","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftiagotas%2Fbiblioteca","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiagotas%2Fbiblioteca/lists"}