[ Labyrinthman @ 13.10.2016. 16:57 ] @
Pozdrav, pratim tutorial o pravljenju MVC-a i imam problem sa ucitavanjem controller klase.

Ovo je sav code koji imam:


Bootstrap.php

Code:

<?php  
class Bootstrap{
    private $controller;
    private $action;
    private $request;
    
    public function __construct($request){
        $this->request=$request;
            
        if(empty($this->request['controller'])){
            $this->controller='home';
        }else{
            $this->controller=$this->request['controller'];
        }
        
        if(empty($this->request['action'])) {
            $this->action='index';
        }else{
            $this->action=$this->request['action'];
        } 
        
         
    }
    
    public function createController(){
        if(class_exists($this->controller)){
            
            $parents=class_parents($this->controller);
            
            if(in_array('Controller',$parents)){
                
                if(method_exists($this->controller,$this->action)){
                    return new $this->controller($this->action,$this->request);
                    
                }else{
                    echo'<h1>method does not exist</h1>';
                    return;
                }
            }else{
                    echo'<h1>base controller not found</h1>';
                    return;
                    
                }
        }else{
                    echo'<h1>controller class does not exist</h1>';
                    return;
                }
    }
}


Controller.php

Code:

<?php
abstract class Controller{
    
    protected $request;
    protected $action;
    
    public function __construct($request,$action){
        $this->request=$request;
        $this->action=$action;
    }
    
    public function executeAction(){
        return $this->{$this->action}();
    }
    
    protected function returnView($viewModel,$fullview){
        $view='views/'.get_class($this).'/'.$this->action.'.php';
        
        if($fullview){
            require('views/main.php');
        }else{
            require($view);
        }
    }
}


Home.php

Code:

<?php

class Home extends Controller{
    protected function Index(){
        echo "home/index";
    }
}


index.php

Code:

<?php  
require('classes/Bootstrap.php');
require('classes/Controller.php');

require('controllers/Home.php');

$bootstrap=new Bootstrap($_GET);
$controller=$bootstrap->createController();

print_r($controller);

if($controller){
    $controller->executeAction();
}
[ Nemanja Avramović @ 13.10.2016. 19:29 ] @
Koji tačno problem imaš? Napiši nešto konkretnije
[ Labyrinthman @ 13.10.2016. 19:48 ] @
Problem je u tome sto se nista ne pojavljuje kada pokrenem index.php stranicu. Jedino pise da ne postoji Controller klasa ali ona je ucitana preko request.
[ Nemanja Avramović @ 13.10.2016. 21:07 ] @
Ok, iskopirao sam ove tvoje kodove u fajlove i kad pokrenem dobijam ovo:

Code:
Home Object ( [request:protected] => index [action:protected] => Array ( ) )
Fatal error: Method name must be a string in D:\wwwroot\test\mvc\classes\Controller.php on line 13


Ovo prvo je tvoj var_dump() u index.php a ovo drugo ti lepo kaže da ti ovde:

Code:
return $this->{$this->action}();


...$this->action nije string. Ako uradiš var_dump() na liniji iznad videćeš da je to prazan niz. A zašto je akcija niz kad bi trebalo da bude ime metode u klasi?

Onda kreneš malo da gledaš kod i vidiš da ti konstruktor klase Controller prihvata sledeće parametre:

Code:
public function __construct($request,$action)


A ti u Bootstrap klasi, u metodi "createController" radiš sledeće:

Code:
return new $this->controller($this->action,$this->request);


Nadam se da ti je sad jasnije u čemu je problem...

p.s. Nemoj da koristiš magije kao što je $this->{$this->action}() jer nije baš čitljivo i ko zna kako PHP može sutra da interpretira ovaj kod (mislim da su u verziji 7 nešto menjali oko ovih magija ). Lepo koristi call_user_func() kao čovek
[ Labyrinthman @ 13.10.2016. 21:33 ] @
Hvala na pomoci i izdvojenom vremenu :)