├── .gitignore ├── README.md ├── composer.json ├── composer.lock ├── core ├── Controller.php ├── Database.php ├── Model.php ├── Request.php ├── Router.php └── RouterBase.php ├── public ├── .htaccess └── index.php └── src ├── Config.php ├── controllers ├── ErrorController.php └── HomeController.php ├── models └── Test.php ├── routes.php └── views ├── pages ├── 404.php ├── home.php └── sobre.php └── partials └── header.php /.gitignore: -------------------------------------------------------------------------------- 1 | composer.phar 2 | /vendor/ 3 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Instalação 2 | Você pode clonar este repositório OU baixar o .zip 3 | 4 | Ao descompactar, é necessário rodar o **composer** pra instalar as dependências e gerar o *autoload*. 5 | 6 | Vá até a pasta do projeto, pelo *prompt/terminal* e execute: 7 | > composer install 8 | 9 | Depois é só aguardar. 10 | 11 | ## Configuração 12 | Todos os arquivos de **configuração** e aplicação estão dentro da pasta *src*. 13 | 14 | As configurações de Banco de Dados e URL estão no arquivo *src/Config.php* 15 | 16 | É importante configurar corretamente a constante *BASE_DIR*: 17 | > const BASE_DIR = '/**PastaDoProjeto**/public'; 18 | 19 | ## Uso 20 | Você deve acessar a pasta *public* do projeto. 21 | 22 | O ideal é criar um ***alias*** específico no servidor que direcione diretamente para a pasta *public*. 23 | 24 | ## Modelo de MODEL 25 | ```php 26 | =5.4.0" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": "4.*" 28 | }, 29 | "type": "library", 30 | "autoload": { 31 | "psr-4": { 32 | "ClanCats\\Hydrahon\\": "src/" 33 | } 34 | }, 35 | "notification-url": "https://packagist.org/downloads/", 36 | "license": [ 37 | "MIT" 38 | ], 39 | "authors": [ 40 | { 41 | "name": "Mario Döring", 42 | "role": "Developer" 43 | } 44 | ], 45 | "description": "Fast & standalone PHP MySQL Query Builder library.", 46 | "homepage": "https://github.com/ClanCats/Hydrahon", 47 | "keywords": [ 48 | "builder", 49 | "database", 50 | "mysql", 51 | "query", 52 | "sqlite" 53 | ], 54 | "time": "2019-09-19T10:59:20+00:00" 55 | } 56 | ], 57 | "packages-dev": [], 58 | "aliases": [], 59 | "minimum-stability": "stable", 60 | "stability-flags": [], 61 | "prefer-stable": false, 62 | "prefer-lowest": false, 63 | "platform": [], 64 | "platform-dev": [] 65 | } 66 | -------------------------------------------------------------------------------- /core/Controller.php: -------------------------------------------------------------------------------- 1 | getBaseUrl().$url); 10 | exit; 11 | } 12 | 13 | private function getBaseUrl() { 14 | $base = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? 'https://' : 'http://'; 15 | $base .= $_SERVER['SERVER_NAME']; 16 | if($_SERVER['SERVER_PORT'] != '80') { 17 | $base .= ':'.$_SERVER['SERVER_PORT']; 18 | } 19 | $base .= Config::BASE_DIR; 20 | 21 | return $base; 22 | } 23 | 24 | private function _render($folder, $viewName, $viewData = []) { 25 | if(file_exists('../src/views/'.$folder.'/'.$viewName.'.php')) { 26 | extract($viewData); 27 | $render = fn($vN, $vD = []) => $this->renderPartial($vN, $vD); 28 | $base = $this->getBaseUrl(); 29 | require '../src/views/'.$folder.'/'.$viewName.'.php'; 30 | } 31 | } 32 | 33 | private function renderPartial($viewName, $viewData = []) { 34 | $this->_render('partials', $viewName, $viewData); 35 | } 36 | 37 | public function render($viewName, $viewData = []) { 38 | $this->_render('pages', $viewName, $viewData); 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /core/Database.php: -------------------------------------------------------------------------------- 1 | prepare($queryString); 21 | $statement->execute($queryParameters); 22 | 23 | if ($query instanceof FetchableInterface) 24 | { 25 | return $statement->fetchAll(\PDO::FETCH_ASSOC); 26 | } 27 | }); 28 | } 29 | 30 | self::$_h = self::$_h->table( self::getTableName() ); 31 | } 32 | 33 | public static function getTableName() { 34 | $className = explode('\\', get_called_class()); 35 | $className = end($className); 36 | return strtolower($className).'s'; 37 | } 38 | 39 | public static function select($fields = []) { 40 | self::_checkH(); 41 | return self::$_h->select($fields); 42 | } 43 | 44 | public static function insert($fields = []) { 45 | self::_checkH(); 46 | return self::$_h->insert($fields); 47 | } 48 | 49 | public static function update($fields = []) { 50 | self::_checkH(); 51 | return self::$_h->update($fields); 52 | } 53 | 54 | public static function delete() { 55 | self::_checkH(); 56 | return self::$_h->delete(); 57 | } 58 | 59 | } -------------------------------------------------------------------------------- /core/Request.php: -------------------------------------------------------------------------------- 1 | routes['get'][$endpoint] = $trigger; 11 | } 12 | 13 | public function post($endpoint, $trigger) { 14 | $this->routes['post'][$endpoint] = $trigger; 15 | } 16 | 17 | public function put($endpoint, $trigger) { 18 | $this->routes['put'][$endpoint] = $trigger; 19 | } 20 | 21 | public function delete($endpoint, $trigger) { 22 | $this->routes['delete'][$endpoint] = $trigger; 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /core/RouterBase.php: -------------------------------------------------------------------------------- 1 | $callback) { 19 | // Identifica os argumentos e substitui por regex 20 | $pattern = preg_replace('(\{[a-z0-9]{1,}\})', '([a-z0-9-]{1,})', $route); 21 | 22 | // Faz o match da URL 23 | if(preg_match('#^('.$pattern.')*$#i', $url, $matches) === 1) { 24 | array_shift($matches); 25 | array_shift($matches); 26 | 27 | // Pega todos os argumentos para associar 28 | $itens = array(); 29 | if(preg_match_all('(\{[a-z0-9]{1,}\})', $route, $m)) { 30 | $itens = preg_replace('(\{|\})', '', $m[0]); 31 | } 32 | 33 | // Faz a associação 34 | $args = array(); 35 | foreach($matches as $key => $match) { 36 | $args[$itens[$key]] = $match; 37 | } 38 | 39 | // Seta o controller/action 40 | $callbackSplit = explode('@', $callback); 41 | $controller = $callbackSplit[0]; 42 | if(isset($callbackSplit[1])) { 43 | $action = $callbackSplit[1]; 44 | } 45 | 46 | break; 47 | } 48 | } 49 | } 50 | 51 | $controller = "\src\controllers\\$controller"; 52 | $definedController = new $controller(); 53 | 54 | $definedController->$action($args); 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine On 2 | RewriteCond %{REQUEST_FILENAME} !-f 3 | RewriteCond %{REQUEST_FILENAME} !-d 4 | RewriteCond %{REQUEST_FILENAME} !-l 5 | RewriteRule ^(.*)$ index.php?request=$1 [QSA,L] -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | run( $router->routes ); -------------------------------------------------------------------------------- /src/Config.php: -------------------------------------------------------------------------------- 1 | render('404'); 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /src/controllers/HomeController.php: -------------------------------------------------------------------------------- 1 | render('home', ['nome' => 'Bonieky']); 10 | } 11 | 12 | public function sobre() { 13 | $this->render('sobre'); 14 | } 15 | 16 | public function sobreP($args) { 17 | print_r($args); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /src/models/Test.php: -------------------------------------------------------------------------------- 1 | get('/', 'HomeController@index'); 7 | $router->get('/sobre/{nome}', 'HomeController@sobreP'); 8 | $router->get('/sobre', 'HomeController@sobre'); -------------------------------------------------------------------------------- /src/views/pages/404.php: -------------------------------------------------------------------------------- 1 |

Página não encontrada

-------------------------------------------------------------------------------- /src/views/pages/home.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | Opa, -------------------------------------------------------------------------------- /src/views/pages/sobre.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Sobre

-------------------------------------------------------------------------------- /src/views/partials/header.php: -------------------------------------------------------------------------------- 1 |

Header

--------------------------------------------------------------------------------