Skip to content

Instantly share code, notes, and snippets.

@alganet
Created February 11, 2013 18:23
Show Gist options
  • Save alganet/4756406 to your computer and use it in GitHub Desktop.
Save alganet/4756406 to your computer and use it in GitHub Desktop.
One of my first frameworks. Not really proud of it. I've quickly acknowledged that other people can't read this code (but it works like a charm!).
<?php
//Exibe TODOS os erros de todos os níveis
error_reporting(E_ALL|E_NOTICE);
/* Controlador-base
* Criado para PHP5 e adaptado para PHP4 por Alexandre Gomes Gaigalas
* Faz a ponte entre a URL do navegador e métodos de classe dentro do padrão MVC
*/
class baseApp
{
/* Array com o caminho da URL, cada segmento em um índice numérico
* Por exemplo, na URL http://exemplo.com/arquivo.php/sistema/incluir a array é
* array('sistema','incluir');
*/
var $_path = array();
var $data = NULL;
//Construtor
function baseApp($path = 0)
{
$this->data = new stdClass;
if (method_exists($this, 'init')) $this->init();
//Define o caminho padrão desse script na URL
$this->data->_basePath = $_SERVER['PHP_SELF'];
$this->data->_baseDir = dirname($_SERVER['SCRIPT_NAME']);
//Direciona pela primeira vez a chamada
if (($this->_path = $this->_parsePath($this->_customName(),$path)) || empty($this->_path[0])) $this->_call(array(&$this, (empty($this->_path[0]) || (strtolower($this->_path[0]) == strtolower($this->_customName()) && count($this->_path) <= 1) ? 'index' : $this->_path[0])), $this->_path);
if (method_exists($this, 'postInit')) $this->postInit();
}
function _customName()
{
//if (strtolower(substr(get_class($this),-3,3)) == 'app') return substr(get_class($this),0,-3);
return 'forumSinistro';
}
// Caso nenhum caminho específico seja passado, retorna o PATH_INFO
function _choosePath(&$path)
{
return !$path ? (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/index') : $path;
}
/* Quebra um caminho em string separado por barras (ex: sistema/incluir/3) e retorna uma array de segmentos
* Caso o primeiro segmento seja idêntico à primeira porção do nome capitalizado da classe ("base" de "baseApp") tal segmento é ignorado
*/
function _parsePath($name, $path = 0)
{
return is_array($path) ? array_values($path) : preg_split('#(^/'.$name.')?/#i', baseApp::_choosePath($path), -1, PREG_SPLIT_NO_EMPTY);
}
/* Faz a chamada do método à partir do caminho segmentado. O primeiro segmento chama um método, os demais são passados como parâmetros
* Caso nenhum nome de método equivalente ao primeiro segmento seja encontrado, chama o método "index" com todos os segmentos passados como parâmetros
*/
function _call($obj, $args)
{
// Caso exista um método correspondente, chama com os parâmetros restantes
$this->data->_template = (dirname($_SERVER['SCRIPT_NAME']).'/tpl/'.$this->_customName().'.'.$obj[1].'.php');
isset($args[1]) && method_exists($obj[0], $obj[1].ucfirst($args[1])) ? $this->_call(array($obj[0], $obj[1].ucfirst($args[1])), array_slice($args, 1)) : call_user_func_array($obj, array_slice($args, 1));
}
// Escolhe com base no primeiro segmento do caminho qual classe deve ser usada como controlador
function morph($between='', $path = 0)
{
if (($appName = is_array($path) ? $path[0] : preg_replace('#^/('.$between.')((/[^/]+)*/?)$#i','$1',baseApp::_choosePath($path)).'App') == (baseApp::_choosePath($path)).'App' && !(preg_match('#^[^\|]+#i', $between, $appName) && $appName = $appName[0].'App')) ($path = baseApp::_parsePath('baseApp')) and $appName = $path[0].'App';
$r = new $appName($path);
extract(get_object_vars($r->data),EXTR_PREFIX_ALL,substr($appName,0,-3));
${substr($appName,0,-3)} = &$r;
if (file_exists($fileName = 'tpl/'.$r->_customName().'.php')) include $fileName;
}
//Inclui um arquivo de template assinado com as variáveis do escopo no qual o método foi chamado
function template($templateName = NULL)
{
if (is_null($templateName)) return 'tpl/'.$this->_customName().'.'.(empty($this->_path[0]) ? 'index' : $this->_path[0]).'.php';
if (file_exists('tpl/'.$this->_customName().'.'.$templateName.'.php')) return 'tpl/'.$this->_customName().'.'.$templateName.'.php';
}
// Método index "burro", DEVE ser sobrescrito
function index(){}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment