Avatar billede Jakie Juniormester
16. marts 2013 - 22:08 Der er 4 kommentarer og
1 løsning

Bootstrap - problemer med error

Hej Eksperter.

Jeg loader min bootstrap klasse sådan her:
$bootstrap = new Bootstrap();
$bootstrap->init();

Min klasse ser sådan her ud:
<?php

class Bootstrap {

    private $_url              = null;
    private $_controller        = null;
    private $_controllerPath    = 'controllers/';
    private $_modelPath        = 'models/';
    private $_errorFile        = 'error.php';
    private $_defaultFile      = 'index.php';
       

    public function init()
    {
        $this->_getUrl();

    if (empty($this->_url[0])) {
            $this->_loadDefaultController();
            return false;
        }

        $this->_loadExistingController();
        $this->_callControllerMethod();
    }

    public function setControllerPath($path)
    {
        $this->_controllerPath = trim($path, '/') . '/';
    }
   
    public function setModelPath($path)
    {
        $this->_modelPath = trim($path, '/') . '/';
    }

    public function setErrorFile($path)
    {
        $this->_errorFile = trim($path, '/');
    }
   
    public function setDefaultFile($path)
    {
        $this->_defaultFile = trim($path, '/');
    }
   
    private function _getUrl()
    {
        $url = isset($_GET['url']) ? $_GET['url'] : null;
        $url = rtrim($url, '/');
        $url = filter_var($url, FILTER_SANITIZE_URL);
        $this->_url = explode('/', $url);
    } 

    private function _loadDefaultController()
    {
        require $this->_controllerPath . $this->_defaultFile;
        $this->_controller = new Index();                                                                                                                 
        $this->_controller->index();
    }

    private function _loadExistingController()
    {
        $file = $this->_controllerPath . $this->_url[0] . '.php';
       
        if (file_exists($file)) {
            require $file;
            $this->_controller = new $this->_url[0];
            $this->_controller->loadModel($this->_url[0], $this->_modelPath);
        } else {
            $this->_error();
            return false;
        }
    }

    private function _callControllerMethod()
    {
        $length = count($this->_url);
       
        if ($length > 1) {
            if (!method_exists($this->_controller, $this->_url[1])) {
                $this->_error();
            }
        }
       
        switch ($length) {
            case 5:
                $this->_controller->{$this->_url[1]}($this->_url[2], $this->_url[3], $this->_url[4]);
                break;
           
            case 4:
                $this->_controller->{$this->_url[1]}($this->_url[2], $this->_url[3]);
                break;
           
            case 3:
                $this->_controller->{$this->_url[1]}($this->_url[2]);
                break;
           
            case 2:
                $this->_controller->{$this->_url[1]}();
                break;
           
            default:
                $this->_controller->index();
                break;
        }
    }
   
    private function _error() {
        require $this->_controllerPath . $this->_errorFile;
        $this->_controller = new Error();
        $this->_controller->index();
        return false;
    }

}

Problemet er, hvis url'en www.xxx.dk/hkgkh (altså en url, der ikke findes på siden) vil errorsiden kommer frem to gange.
Derudover hvis url'en er www.xxx.dk/artikler/ghfgfgfgfg (altså hvor artikler er en url, men eftefølgende ikke er en url, der passer) så vil den udskrive det, der står på artikler. Derbed at www.xxx.dk/artikler havde uendelige urls med samme indhold..

Er der nogen, der kan fortælle mig, hvordan det rettes?

Hvis det ikke gav mening, er i meget velkomne til at spørge :)
Avatar billede olebole Juniormester
16. marts 2013 - 22:59 #1
<ole>

De to errors klarer du vel med:


if ($this->_loadExistingController()) {
    $this->_callControllerMethod();
}

/mvh
</bole>
Avatar billede Jakie Juniormester
17. marts 2013 - 01:58 #2
Jeg har siddet og kigget på det og har også prøvet dit forslag Ole..

Men har ikke fundet frem til en løsning :)
Avatar billede olebole Juniormester
17. marts 2013 - 16:35 #3
Løsning på hvad? Får du stadig fejlsiden frem to gange?
Avatar billede Jakie Juniormester
18. marts 2013 - 11:19 #4
Nej, jeg beklager, at jeg ikke uddybede - det var blevet lidt sent :)

Problemet lå i min private function _callControllerMethod(), hvor jeg ikke fik tjekket om hvorvidt at en method eksisterede og derefter returnerede false.

Ved at skrive:
        // Make sure the method we are calling exists
        if ($length > 0) {
            if (!method_exists($this->_controller, $this->_url[0])) {
                return false;
            }
        }

fik jeg løst min problemstilling :)

Jeg takker for hjælpen :)
Avatar billede Jakie Juniormester
16. december 2013 - 00:16 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester