Avatar billede delphiuser Mester
20. februar 2017 - 10:08 Der er 8 kommentarer og
1 løsning

Problemer med at hente default model.

Hej eksperter.

Jeg sidder og roder med et mvc som jeg er ved at være noget et godt stykke med. Men har et problem.

Når man kommer ind på siden skal den hente nogle dataer fra min database og smide ind på forsiden. Dette kan jeg simpelt hen ikke få den til. Jeg får denne fejl : Notice: Undefined property: Index::$model in C:\wamp64\www\portfolio\controllers\index.php on line 11. Ydermere så kommer den med nogle forskellige fejl under denne fejl.
det er som følgende.
#    Time    Memory    Function    Location
1    0.0032    366176    {main}( )    ...\index.php:0
2    0.0058    410832    Bootstrap->init( )    ...\index.php:14
3    0.0059    411208    Bootstrap->_loadDefaultController( )    ...\Bootstrap.php:15
4    0.0452    415808    Index->index( )    ...\Bootstrap.php:51

ud fra hvad jeg kan læse mig frem til kommer fejlen fra min bootstrap fil. Så her kommer koden på den. Jeg skal på en eller anden måde have den til at indlæse min index_model.php fra min models bibliotek når min url er tom. Kan simpelt hen ikke finde ud af hvad jeg skal gøre.

Bootstrap.php

<?php

class Bootstrap {

    private $_url = null;
    private $_controller = null;
    private $_controllerPath = 'controllers/';
    private $_modelPath = 'models/';
    private $_errorFile = 'cmserror.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() {
        $file = $this->_controllerPath .  $this->_defaultFile;
        if(file_exists($file)) {
            require $file;
            $this->_controller = new Index();
            $this->_controller->loadModel($this->_url[0], $this->_modelPath);
            $this->_controller->index();

        }
        /*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->loadModel($this->_url[0], $this->_modelPath);
        } else {
            $this->cmserror();
            return false;
        }
    }

    private function _callControllerMethod() {
        $length = count($this->_url);
        if($length > 1) {
            if(!method_exists($this->_controller, $this->_url[1])) {
                $this->cmserror();
            }
            switch ($length) {
                case 7:
                    $this->_controller->{$this->_url[1]}($this->_url[2], $this->_url[3], $this->_url[4], $this->_url[5], $this->_url[6]);
                    break;
                case 6:
                    $this->_controller->{$this->_url[1]}($this->_url[2], $this->_url[3], $this->_url[4], $this->_url[5]);
                    break;
                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 cmserror() {
        require $this->_controllerPath . $this->_errorFile;
        $this->_controller = new CmsError();
        $this->_controller->index();
        exit;
    }

}

Håber i kan hjælpe mig med hvad jeg skal skrive og hvorfor og hvor det skal stå. På forhånd tak for hjælpen...

venlig hilsen

Delphiuser
Avatar billede Slater Ekspert
20. februar 2017 - 10:21 #1
Der står fejlen er i din controllers/index.php på linje 11. Den fil skal vi nok også se.
Avatar billede repox Seniormester
20. februar 2017 - 10:21 #2

Notice: Undefined property: Index::$model in C:\wamp64\www\portfolio\controllers\index.php


Der ser umiddelbart ud som om at du har en klasse navngivet Index hvor du forsøger at tilgå en udefineret egenskab.

Hvad er der i index.php omkring linie 11?
Avatar billede delphiuser Mester
20. februar 2017 - 10:29 #3
Dette er min index.php controller som skal hente noget inde fra min index_model.php i for lige begge filer.

index.php

<?php

class Index extends Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        $this->view->title = ' - Forsiden';
        $this->view->info = $this->model->index();

        $this->view->render('header');
        $this->view->render('index/index');
        $this->view->render('footer');
    }
}

her kommer min index_model.php

<?php

class Index_Model extends Model {

    function __construct() {
        parent::__construct();
    }

    function index() {
        echo 'Hej med dig!';
    }
}

den tekst der står. er en test for at se om jeg kan få det til at virke. inden jeg ville begynde med alt for meget database kodning.
Avatar billede repox Seniormester
20. februar 2017 - 10:59 #4
Jeg antager at linie 11 i index.php er denne:


        $this->view->info = $this->model->index();


Umiddelbart lader det ikke til at $this->model eksisterer - hvor sætter du den egenskab? I klassen Controller som du extender Index med?
Avatar billede delphiuser Mester
20. februar 2017 - 11:24 #5
Jeg sætter den herinde i min Controller.php

<?php

class Controller {

    function __construct() {
        $this->view = new View();
    }

    function loadModel($name) {
        $path = 'models/'.$name.'_model.php';
        if(file_exists($path)) {
            require 'models/'.$name.'_model.php';
            $modelName = $name.'_Model';
            $this->model = new $modelName();
        }
    }
}
Avatar billede repox Seniormester
20. februar 2017 - 11:34 #6
Enten bliver loadModel metoden ikke kørt eller også kommer du ikke ind i din if-betingelse.

Best practice ville også være at i din Controller klasse at definere klasseegenskaben inden du sætter den.
Avatar billede delphiuser Mester
20. februar 2017 - 11:38 #7
hvordan vil du gøre det?

nu spørger jeg sikkert dumt...
Avatar billede repox Seniormester
20. februar 2017 - 11:53 #8
Det er lidt svært for mig at gennemskue om din loadModel metode ikke bliver kørt eller om du ikke kommer ind i din if-betingelse, men det nemmeste ville være at smide noget output for at kontrollere det.

Eksempelvis:


function loadModel($name) {
        exit(var_dump('loadModel funktion kørt'));
        $path = 'models/'.$name.'_model.php';
        if(file_exists($path)) {
            require 'models/'.$name.'_model.php';
            $modelName = $name.'_Model';
            $this->model = new $modelName();
        }
    }


Hvis du får beskeden frem om at "loadModel funktion kørt", så rammer du i hvert fald funktionen.

Derefter kan du flytte exit(var_dump()) ned i din if-betingelse for at teste om du nogensinde kommer derind:


function loadModel($name) {
        $path = 'models/'.$name.'_model.php';
        if(file_exists($path)) {
            exit(var_dump('if-betingelse er opfyldt'));
            require 'models/'.$name.'_model.php';
            $modelName = $name.'_Model';
            $this->model = new $modelName();
        }
    }



Hvis du ikke kommer ind i din if-betingelse, så er det fordi at:
        $path = 'models/'.$name.'_model.php';
ikke eksisterer.

For at overholde lidt almen best practice, bør du sætte model egenskaben i din klasse.

Det gør du således:



class Controller {

    protected $model; // protected kan anvendes i nedarvede klasser

    public function __construct() {

    [ ... ]

Avatar billede delphiuser Mester
20. februar 2017 - 12:19 #9
nu fik jeg løst problemet. det som jeg manglede at få gjort var at sætte standard index i mit kald til inde i min bootstrap under defaultController. hvor jeg prøver at hente min model først. da jeg skrev index ind der. bum så virkede det. så den del jeg har ændret er dette.

private function _loadDefaultController() {
        $file = $this->_controllerPath .  $this->_defaultFile;
        if(file_exists($file)) {
            require $file;
            $this->_controller = new Index();
            $this->_controller->loadModel($this->_url[0], $this->_modelPath);
            $this->_controller->index();

        }
        /*require $this->_controllerPath .  $this->_defaultFile;
        $this->_controller = new Index();
        $this->_controller->index();*/
    }

til

private function _loadDefaultController() {
        $file = $this->_controllerPath .  $this->_defaultFile;
        if(file_exists($file)) {
            require $file;
            $this->_controller = new Index();
            $this->_controller->loadModel('index', $this->_modelPath);
            $this->_controller->index();

        }
        /*require $this->_controllerPath .  $this->_defaultFile;
        $this->_controller = new Index();
        $this->_controller->index();*/
    }
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

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