PHP com MVC - Atualização 1

Para acessar os projetos desse curso executar o comando $ composer server no diretório do projeto. Acessar no endereço localhost:8081



Aula 02 a 04 - Falando sobre MVC / Estrutura / Composer e autoload
O padrão MVC foi criado na década de 70 para organizar a construção de aplicações. A sigla significa M - Model, V - View, C - Controller.
Criação das pastas da aplicação e do arquivo composer.json em princípio apenas com a definição do namespace. Instalação do composer (fiz a instalação com o .phar para ter a versão mais atual).
Aula 05 a 06 - Iniciando o controle de rotas / Controllers
Criamos um arquivo com a classe que irá controlar as rotas. Nessa classe criamos dois métodos, um deles para recuperar o valor da URL. Usamos esse método para testar a comunicação com as classes através do namespace. Essa classe foi instanciada no arquivo index.php que irá processar a aplicação.
Criamos um arquivo .htaccess para direcionar todas as requisições para o arquivo index.php
No arquivo de Route() criamos um método que inicializa as rotas. Nesse método criamos um array que contém o nome das rotas e que é composto por arrays que indicam o caminho da URL, o arquivo responsável pelo controle e a ação a ser executada. Esse método é executado pelo construtor da classe.
O segundo método criado seta a variável routes com as rotas definidas no método anterior.
O terceiro método é executado também pelo construtor e recebe o método que recupera a URL como parametro. Esse método utiliza a função array_walk() que percorre o array e executa uma callback que testa a URL recebida e verifica se ela existe no array. Caso positivo chamamos o método correspondente no Controller. Para isso instanciamos uma classe recuperada em um dos atributos do array (alterando a primeira letra para maiusculo com a função ucfirst()) por fim executamos o método recuperado no atributo action.
Aula 07 a 08 - Abstraindo a classe rotas / Exibindo as views
Com a classe de rotas testada e funcionando, vamos fazer a abstração dessa classe para manter os métodos protegidos.
Criamos um novo arquivo no diretório vendor\SON\Init que contém uma classe abstract com os métodos criados anteriormente com visibilidade protected.
O único método mantido na classe Route é o que define os parametros das rotas. Os demais métodos (inclusive o construtor) foram todos transferidos.
Feito isso criamos no diretório de View os arquivos html. Esses arquivos foram incluidos na classe IndexController com o include para serem executados de acordo com o método chamado pela classe Route. Outras informações que precisem ser passadas pela camada de Controller para a camada de View podem ser incluidas nesse método e se necessário abstraidas posteriormente.
Aula 09 - Criando o método render
Criamos um método render() na classe IndexController que tem como função pegar o nome do objeto que essa classe se refere e remover algumas palavras para endereçar para o diretório que queremos.
Quando executamos os métodos da classe IndexControler this se refere ao objeto App\Controller\IndexController.
Recuperamos esse nome de objeto e passamos substituimos as palavras App\Controller\ e IndexController por '' com a função str_replace(). Em seguida passamos a string resultante Index para letra minusculas com strtolower(). Com isso temos o nome do diretório que queremos acessar dentro do diretório View restando apenas passar como parametro para o método render() o nome da ação (por enquanto de maneira fixa, mas é possivel fazer de modo programático).
Aula 10 a 11 - Abstraindo o controller / Layout
Aqui fizemos como nas rotas e separamos os métodos em uma classe abstract Action com métodos protected.
Criamos a seguir o arquivo de template layout.phtml. Esse arquivo possui uma estrutura html e recebe através do include o método content() criado na classe Action.
O método render() faz um teste (verifica se deseja que seja utilizado o layout) e caso positivo inclui o layout (que carrega o content() no próprio html) caso contrário executa apenas o content() (sem o arquivo de layout).
O método content() por sua vez passa a executar a rotina que antes estava no método render() que é apenas definir a rota para os arquivos de view.
Aula 12 a 13 - Conexão com o banco de dados / Container DI
Iniciamos um banco de dados de exemplo para mostrar dados na View. Primeiramente foi criada a classe Conn que faz a conexão com o DB através do PDO.
No Model criamos uma classe Client que recebe como parametro o DB através do método criado na classe Conn. Essa classe tem o método responsável pela query ao DB.
Por fim instanciamos a classe Client no Controller para que esse processe a query e envie os dados para o arquivo de exibição na View.
Tive problemas para a execução do PDO pois ele não estava habilitado no arquivo php.ini. Verificar isso sempre que for utilizar ferramentas diferentes do habitual.
Em seguida foi feita uma alteração para reduzir o acoplamento na classe IndexController pois ela estava utilizando as classes Conn e Client. Para isso criamos uma classe Container com um método que recebe o nome do Model que será executado, cria seu caminho () e instancia o objeto já com o parametro de conexão. Desse modo ao invés de instanciarmos o objeto Model na classe IndexController apenas executamos o método getModel() passando o modelo a ser consultado.
Aula 14 - Abstraindo Model
Transferimos os métodos que eram executados no Model para uma nova classe Table no diretório SON. A classe do Model principal agora apenas envia o nome da tabela a ser consultada e a nova classe Table que contém as querys.
Por fim criamos uma nova query para selecionar apenas 1 registro a ser enviada para a página contact.