O projeto pode ser utilizado como base para uma noção de como deve ser estruturado um framework em php, mas sempre deve-se levar em consideração utilizar Frameworks de ampla utilização como Laravel, Synfony entre outros afim de de maior agilidade no processo mas se necessario o desenvolvimento de estrutura personalizada, este projeto pode ser utilizado ou servir como base de inspiração.
- Esté é um projeto de didatico usado para ensinar php e os principios de construção de um Framework não deve ser ser usado em projetos do jeito que está.
- Este projeto devido a sua natureza não é compativel com as especificações PSR-7 e PSR-17
- O projeto utiliza PSR-4 Para efetuar o autoload das classes
- Há apenas o design pattern Singleton aplicado não há outros afim de facilitar o entendimento da linguagem ao natural o codigo precisa ser refatorado para atender diversos fundamentos Clean Code, Solid, aumentar a orientação a objeto.
- Application - Contem toda aplicação
- Resource - Pasta para compilação de frameworks frontend (React ou Vue)
- Public - Pasta publica onde o browser tera acesso a aplicação
- cache - Armazena toda a compilação do template engine
- config - Contem todos os arquivos de configuração
- middlewares - Contem todos os middlewares do sistema
- core - modulo principal do sistema
- modules - Armazena novos modulos criados para a aplicação
- system - Armazena todas as Classes de logica do sistema
- helpers - Contem os arquivos para registro de fuções globais
- libraries - Arquivos com classes que vão ser ligadas automaticamente a instancia do controller adicionando recursos ao mesmo podendo ser acessado usando $this->nomedaclasse->metodo();
Todo modulo do sistema seja o Core(principal) ou criados pelo usuario na pasta modules Devem ter a seguinte estrutura:
- Controllers - Contem todos os controllers do sistema
- Models - Contem todos os models do sistema
- Routes - Contem o arquivo de rotas do modulo
- View - Contem todas as views do modulo
A pasta resource e responsavel por conter os componentes de frontend que serão compilados via Webpack para serem utilizados pelo projeto. A estrutura e formada por:
- components - Contem todos os componentes em geral que não sejam referente a uma View
- routes - Contem arquivos de configuração refente a rotas SPA do vue-router(não implementado por padrão)
- store - Contem arquivos relacionados a configuração do vuex(Gerenciador de estados do vue)
- View - Contem componentes vue referente as telas do sistema.
- App.js Ponto de entrada do Vue(Onde todos os arquivos devem ser importados)
Todos os modulos tem um arquivo Route.php que contem uma estrutura semelhante a seguir:
<?php
return [
"/"=>array(
"module"=>"core",
"controller"=>"HomeController",
"action" =>"index",
"request_type"=>"GET",
"middlewares"=>[]
),
"produtos"=>array(
"module"=>"core",
"controller"=>"ProdutosController",
"action"=>"home",
"request_type"=>"GET",
"middlewares"=>[]
),
"teste"=>array(
"module"=>"core",
"controller"=>"ProdutosController",
"action"=>"teste",
"request_type"=>"GET",
"middlewares"=>[]
),
]
Para definição das rotas dos modulos e utilzado um array associativo que é analisado pelo RouteManager para definir qual controller deve atender a requisição os parametros que deve ser informado são:
<?php
return [
"nomedarota"=>array(
"module"=>"Nome do modulo",
"controller"=>"Nome do controller",
"action"=>"Nome da action",
"request_type"=>"Tipo de requisição(POST,GET,PUT,DELETE,PATCH)",
"middlewares"=>["Nome_da_classe","Nome_da_class"] Obs: Caso nao va usar middlewares na rota deixa vazio o array
)
]
Qualquer parametro a ser passado para a rota deve ser colocado entre chaves, segue abaixo exemplo:
<?php
return [
"nomedarota/{nome_parametro}/..."=>array(
"module"=>"Nome do modulo",
"controller"=>"Nome do controller",
"action"=>"Nome da action",
"request_type"=>"Tipo de requisição(POST,GET,PUT,DELETE,PATCH)"
)
]
Este pasta contem todas as classes que fazem o sistema funcionar os arquivos são:
- Boot.php - Singleton responsavel por iniciar o processamento de requisições.
- ConfigManager - Class Responsavel por Gerenciar os arquivos de configuração da pasta config
- Controller - Controller padrão do sistema contem todas as funcionalidades necessaria para o controller do sistema
- db Class Gerenciadora do Illuminate/Database para acesso ao banco de dados
- RouterManager - Class Para processamento das requisições enviadas pelo browser e direcionando para o controller correto
- TemplateEngine - Class Para processamento de template do sistema.
O sistema permite registrar funções globais que podem ser utilizada em todos os lugares do sistema Views, Controllers entre outros para criar suas proprias função é somente criar um arquivo dentro da pasta Application/system/helpers com suas fuções que elas estarão disponiveis em todos os escopos do sistema.
- Assets - gera urls para vincular os assets nas paginas.
- Url - gera urls para as rotas do sistema
Linguagens Backend: PHP 7.3
Design Patterns: Singleton Facade
Frontend: VueJs 2.6 + Webpack + Babel
PHP Template Engine: Blade template by Laravel 1.6.1
Query Builder Illuminate/Database by Laravel 5.8.0
- O projeto deve ser clonado deste repositorio para dentro de um servidor com nginx ou apache com php 7.3
- O ambiente em questão deve conter os seguintes gerenciados de dependencias e recursos:
- node 12.x ou superior
- composer 1.7 ou superior
- Yarn ou npm na ultima versão
- executade o comando composer install para instalar as dependencias do projeto
- para o frontend execute o comando npm install ou yarn install(opcional)
- No navegador acesse a pasta public
- no prompt de comando execute o comando npm run build para o sistema começar a compilar os componentes do frontend
o framework possui um modulo embarcado para construção das estruturas basicas do sistema as estruturas que pode ser construidas pelo Manager são:
- Modulos
- Controllers
- Models
- Middlewares
Gerando apartir do manager o mesmo já irá gerar os arquivos no formato a ser utilizado na arquitetura do sistema.
- Estrutura basica
- RouteManager
- TemplateEngine (Utilizando Blade 1.6, sistema de templates do laravel)
- Estrutura para utilização de Vuejs + Webpack
- QueryBuilder(Utilizando Illuminate/Database 5.8.0 componente usado no laravel)
- SQL Injection Protection (Recurso já implementado no Illuminate/Database 5.8.0)
- Interface Web para criação de controllers
- Middleware(Utilizando a biblioteca onion adaptada ao projeto)
- Gerenciador de Sessão(Basico sem suporte a flashdata por enquanto)
- Sistema de Bibliotecas Personalizadas
- Helpers Globais para os diversos fins
Todos desenvolvidos ate o momento.
- TemplateEngine Blade: https://laravel.com/docs/5.8/blade
- Query Builder: https://laravel.com/docs/5.8/queries
- Onion Before/After Middleware https://github.com/esbenp/onion