Skip to content

Instantly share code, notes, and snippets.

@klauskpm
Created November 13, 2014 13:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save klauskpm/26a251eb693f424e959a to your computer and use it in GitHub Desktop.
Save klauskpm/26a251eb693f424e959a to your computer and use it in GitHub Desktop.
Classe de Router para CodeIgniter, criado para facilitar o manuseio das rotas e próprio entendimento.
<?php
class MY_Router extends CI_Router {
private $rotas = array(); // Contem todas as rotas so sistema
private $classe; // Classe onde está sendo chamado
private $metodo; // Método onde está sendo chamado
public function __construct()
{
$this->iniciar();
}
/**
* Função para inicar configuração.
* Se um dia for instanciada, não precisa se preocupar em sobreescrever
* o __construct(), e a configuração pode ser chamada a qualquer hora.
*/
private function iniciar()
{
parent::__construct();
$this->configurarRotas();
}
/**
* Gera a configuração da propriedade $rotas, onde ficam todas as rotas
* do sistema, só que, com alguns diferenciais: as chaves e valores foram
* invertidos e o "default_controller", substituido por "/".
*/
private function configurarRotas()
{
// Inclui o arquivo de rotas, para receber o valor delas.
if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
{
include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
}
elseif (is_file(APPPATH.'config/routes.php'))
{
include(APPPATH.'config/routes.php');
}
$rotas = ( ! isset($route) OR ! is_array($route)) ? array() : $route;
unset($route);
// Troca inverte as chaves, pelos valores e substitui o
// "default_controller" por "/"
$rotas['/'] = $rotas['default_controller'];
unset($rotas['default_controller']);
$rotas = array_flip($rotas);
// Organiza as rotas em arrays multidimensionais
foreach($rotas as $caminho => $rota) {
$caminho_metodo = explode('/',$caminho);
if(!isset($this->rotas[$caminho_metodo[0]])) {
$this->rotas[$caminho_metodo[0]] = array();
}
if(isset($caminho_metodo[1])) {
$this->rotas[$caminho_metodo[0]][$caminho_metodo[1]] = $rota;
} else {
array_push($this->rotas[$caminho_metodo[0]], $rota);
}
}
unset($rotas);
}
/**
* Gerado para facilitar a chamada e configurar as propriedades do sistema.
* Só deve ser chamado, quando estiver dentro de um método, para
* configuração completa.
*/
private function configuraPropriedades()
{
$this->classe = $this->fetch_class();
$this->metodo = $this->fetch_method();
}
/**
* Retorna a rota do método em que é encontrado
* @return String Rota da atual classe e método
*/
public function retornaRotaAtual()
{
$this->configuraPropriedades();
return $this->rotas[$this->classe][$this->metodo];
}
/**
* Retorna a lista de rotas configuradas em /config/routes.php
* @param string $classe Nome da classe ao qual quer as rotas
* @param string $metodo Nome do método ao qual quer as rotas
* @return array|string Retorna a uma rota ou uma lista de rotas
*/
public function retornaRotas($classe = null, $metodo = null)
{
if(!is_null($classe) && isset($this->rotas[$classe])) {
if(!is_null($metodo) && isset($this->rotas[$classe][$metodo])) {
return $this->rotas[$classe][$metodo];
}
return $this->rotas[$classe];
}
return $this->rotas;
}
/**
* Retorna a url completa, da rota desejada
* @param string|array $rota Rota completa, ou só a classe
* @param string $metodo Método em string
* @return string|boolean Retorna a url caso tenha o método e false, caso não
*/
public function rotaUrl($rota, $metodo = null)
{
if($metodo) {
$rota = array($rota, $metodo);
}
if(!is_array($rota)) {
$rota = explode('/', $rota);
}
if(isset($rota[1])) {
return base_url() . $this->rotas[$rota[0]][$rota[1]];
} else {
return false;
}
}
/**
* Retorna a classe que está instanciada
* @return string Classe instanciada
*/
public function classe()
{
return $this->classe?$this->classe:$this->classe = $this->fetch_class();
}
/**
* Retorna o método que está instanciado
* @return string Método instanciado
*/
public function metodo()
{
return $this->metodo?$this->metodo:$this->metodo = $this->fetch_method();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment