Minha pergunta é meio que baseada em opiniões, afinal cada um programa de um jeito.
Mas quero saber se é correto estender minha classe Database em um Helper, por exemplo:
Helper:
<?php class Settings extends Database { ... }
No caso Database é onde possuo meus métodos de Crud.
Pelo que pesquisei, o pessoal sempre diz:
No MVC se usa Database em Models
Mas achei desnecessário criar uma outra classe em Models pra Settings só pra guardar valores no banco.
Classe Database:
<?php namespace helpers; use PDO; class Database extends PDO { protected static $ _instances = array(); public static function get($ group = false) { $ group = !$ group ? array( 'type' => DB_TYPE, 'host' => DB_HOST, 'name' => DB_NAME, 'user' => DB_USER, 'pass' => DB_PASS ) : $ group; $ type = $ group['type']; $ host = $ group['host']; $ name = $ group['name']; $ user = $ group['user']; $ pass = $ group['pass']; $ id = $ type . $ host . $ name . $ user . $ pass; if (isset(self::$ _instances[$ id])) { return self::$ _instances[$ id]; } try { $ instance = new Database($ type . ':host=' . $ host . ';dbname=' . $ name . ';charset=utf8', $ user, $ pass); $ instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$ _instances[$ id] = $ instance; return $ instance; } catch (PDOException $ e) { Logger::newMessage($ e); Logger::customErrorMsg(); } } public function raw($ sql) { return $ this->query($ sql); } public function select($ sql, $ params = array(), $ fetchMode = PDO::FETCH_OBJ, $ class = '') { $ stmt = $ this->prepare($ sql); foreach ($ params as $ key => $ value) { if (is_int($ value)) { $ stmt->bindValue("$ key", $ value, PDO::PARAM_INT); } else { $ stmt->bindValue("$ key", $ value); } } $ stmt->execute(); if ($ fetchMode === PDO::FETCH_CLASS) { return $ stmt->fetchAll($ fetchMode, $ class); } else { return $ stmt->fetchAll($ fetchMode); } } public function count($ sql, $ params = array()) { $ stmt = $ this->prepare($ sql); foreach ($ params as $ key => $ value) { if (is_int($ value)) { $ stmt->bindValue("$ key", $ value, PDO::PARAM_INT); } else { $ stmt->bindValue("$ key", $ value); } } $ stmt->execute(); return $ stmt; } public function insert($ table, $ params) { ksort($ params); $ fieldNames = implode(',', array_keys($ params)); $ fieldValues = ':' . implode(', :', array_keys($ params)); $ sql = "INSERT INTO $ table ($ fieldNames) VALUES ($ fieldValues)"; $ stmt = $ this->prepare($ sql); foreach ($ params as $ key => $ value) { $ stmt->bindValue(":$ key", $ value); } $ stmt->execute(); return $ this->lastInsertId(); } public function update($ table, $ params, $ where) { ksort($ params); $ fieldDetails = null; foreach ($ params as $ key => $ value) { $ fieldDetails .= "$ key = :field_$ key,"; } $ fieldDetails = rtrim($ fieldDetails, ','); $ whereDetails = null; $ i = 0; foreach ($ where as $ key => $ value) { if ($ i === 0) { $ whereDetails .= "$ key = :where_$ key"; } else { $ whereDetails .= " AND $ key = :where_$ key"; } $ i++; } $ whereDetails = ltrim($ whereDetails, ' AND '); $ sql = "UPDATE $ table SET $ fieldDetails WHERE $ whereDetails"; $ stmt = $ this->prepare($ sql); foreach ($ params as $ key => $ value) { $ stmt->bindValue(":field_$ key", $ value); } foreach ($ where as $ key => $ value) { $ stmt->bindValue(":where_$ key", $ value); } $ stmt->execute(); return $ stmt->rowCount(); } public function delete($ table, $ where, $ limit = 1) { ksort($ where); $ whereDetails = null; $ i = 0; foreach ($ where as $ key => $ value) { if ($ i === 0) { $ whereDetails .= "$ key = :$ key"; } else { $ whereDetails .= " AND $ key = :$ key"; } $ i++; } $ whereDetails = ltrim($ whereDetails, ' AND '); if (is_numeric($ limit)) { $ uselimit = "LIMIT $ limit"; } $ sql = "DELETE FROM $ table WHERE $ whereDetails $ uselimit"; $ stmt = $ this->prepare($ sql); foreach ($ where as $ key => $ value) { $ stmt->bindValue(":$ key", $ value); } $ stmt->execute(); return $ stmt->rowCount(); } public function truncate($ table) { $ sql = "TRUNCATE TABLE $ table"; return $ this->exec($ sql); } }