ConfigController.php 6.44 KB
<?php

Class ConfigController{

    private $url;
    private $urlConjunto;
    private $urlController;
    private $urlMetodo;
    private $urlParametro;
    private static $formatar;

    public function __construct(){

        if (!empty(filter_input(INPUT_GET, 'url', FILTER_DEFAULT))){
            $this->url = filter_input(INPUT_GET, 'url', FILTER_DEFAULT);
            //echo $this->url;

            //echo "<br />Antes da formatação: " .$this->url;
            $this->clearUrl();
            //echo "<br />Depois da formatação: " .$this->url;

            // SEPARA OS VALORES EM ARRAY
            $this->urlConjunto = explode("/", $this->url);

            /*echo "<pre>";
            print_r($this->urlConjunto);
            echo "</pre>";*/
            // trata o controller, caso exista
            if (isset($this->urlConjunto[0])){
                $this->urlController = $this->validarController($this->urlConjunto[0]);
            }
            // trata o método, caso exista
            if (isset($this->urlConjunto[1])){
                $this->urlMetodo = $this->validarMetodo($this->urlConjunto[1]);
            }
            // trata o parâmetro, caso exista
            if (isset($this->urlConjunto[2])){
                $this->urlParametro = (int)$this->urlConjunto[2];
                //echo "<br />{$this->urlParametro}";
            }else {
                $this->urlParametro = null;
            }

        }else{
            $this->urlController = $this->validarController(CONTROLLER);
            $this->urlMetodo = $this->validarMetodo(METHOD);
        }
    }

    public function clearUrl(){
        // eliminar as tags html
        $this->url = strip_tags($this->url);
        // retirar espaços em branco contidos nas laterais da variável URL
        $this->url = trim($this->url);
        // retirar a última barra, caso exista
        $this->url = rtrim($this->url, "/");
        // FORMATA OS CARACTERES
        self::$formatar = array();
        self::$formatar['a'] = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜüÝÞßàáâãäåæçèéêëìíîï
                                ðñòóôõöøùúûýýþÿRr"!@#$%&*()_-+={[}]?;:.,\\\'<>°ºª ';
        self::$formatar['b'] = 'aaaaaaaceeeeiiiidnoooooouuuuuybsaaaaaaaceeeeiiii
                                dnoooooouuuyybyRr--------------------------------';
        // traduz os caracteres do padrão A para o padrão B
        $this->url = strtr(utf8_decode($this->url), utf8_decode(self::$formatar['a']),
            self::$formatar['b']);
    }

    // método que trata o nome do controller passado na url para o padrao CamelCase.
    // Ex.: ControlleUsuario de Classe
    public function validarController($controller){
        // retiro os espaços entre as palavras e acrescento as palavras para o
        // primeiro caracter em maiúsculo
        // separa o - para retirá-lo
        $controller = explode("-", strtolower($controller));
        // Junto através de espaços para que eu possa colocar as primeiras em maiúsculo
        $controller = implode(" ", $controller);
        // Coloco as primeiras palavras em maiúsculo
        $controller = ucwords($controller);
        // Substituo o espaço em branco para juntar as palavras
        $controller = str_replace(" ", "", $controller);
        //echo "<br />{$controller}";
        return $controller;
    }

    // método que trata o nome do método passado na url
    public function validarMetodo($metodo) {
        // retiro os espaços entre as palavras e acrescento as palavras para
        // o primeiro caracter em minúsculo
        // separa o - para retirá-lo
        $metodo = explode("-", strtolower($metodo));
        // Junto através de espaços para que eu possa colocar as primeiras em maiúsculo
        $metodo = implode(" ", $metodo);
        // Coloco as primeiras palavras em maiúsculo
        $metodo = ucwords($metodo);
        // Substituo o espaço em branco para juntar as palavras e coloco a primeira em minúsculo
        $metodo = lcfirst(str_replace(" ", "", $metodo));
        //echo "<br />{$metodo}";
        // retorna o nome do método, com o primeiro caracter em minúsculo. Ex.: index
        return $metodo;
    }

    public function carregar() {
        //Verifica se a classe que está na urlController existe
        //echo "Classe a ser carregada: {$this->urlController}";
        if (class_exists($this->urlController)) {
            try {
                // verifica se o usuario está logado
                $this->validarSessao();
                // peço para carregar o método
                $this->carregarMetodo();
            } catch (Exception $e) {
                echo "Erro ao carregar a classe e o método: " . $e->getMessage() . "<br />";
                $this->urlController = $this->validarController(CONTROLLER);
                $this->urlMetodo = $this->validarMetodo(METHOD);
                $this->carregar();
            }
        }else {
            //echo "Erro ao carregar a classe {$this->urlController} <br />";
            $this->urlController = $this->validarController(CONTROLLER);
            $this->urlMetodo = $this->validarMetodo(METHOD);
            $this->carregar();
        }
    }

    public function carregarMetodo()
    {
        $classeCarregar = new $this->urlController();

        //Verificar se existe o método
        if (method_exists($classeCarregar, $this->urlMetodo)){
            //echo "<br />Método a ser carregador: {$this->urlMetodo}";
            if ($this->urlParametro !== null) {
                $classeCarregar->{$this->urlMetodo}($this->urlParametro);
            }else {
                $classeCarregar->{$this->urlMetodo}();
            }
        }else{
            //echo "<br />Erro ao carregar o método: {$this->urlMetodo}";
            $this->urlController = $this->validarController(CONTROLLER);
            $this->urlMetodo = $this->validarMetodo(METHOD);
            $this->carregarMetodo();
        }
    }

    private function validarSessao(){
        if (!isset($_SESSION['id'])) {
            if (($this->urlController != 'ControllerAuth') && ($this->urlMetodo != 'auth')){
                $_SESSION['msg'] = "
                        <div class='alert alert-danger' role='alert'>
                          Você não pode acessar esta página. Realize o login primeiro!
                        </div>
                            ";
                $this->urlController = 'ControllerAuth';
                $this->urlMetodo = 'auth';
            }
        }
    }

}