Avatar billede palito Nybegynder
07. juli 2008 - 12:08 Der er 9 kommentarer

Hjælp til controller-system

Lige nu bruger jeg nedenstående script til at finde ud af hvilken handling, der skal ske på min hjemmeside, men jeg synes, at det bliver ret uoverskueligt hurtigt, og så har jeg hørt noget med, at man kan gøre det samme med et controller-system, så man laver nogle filer, der indeholder en controller hver, og så finder man de respektive controllere i index.php. Er det noget nogle kan hjælpe mig med? og ikke blot et stort MVC-system.

switch($_GET['module']) {
    case "bruger":
        switch($_GET['action']) {
            case "log_ind":
                // log ind
                break;
            case "log_ud":
                // log ud
                break;
        }
        break;
    default:
        switch($_GET['action']) {
            case "opret":
                // opret artikel
                break;
            default:
                // vis artikel
                break;
        }
}
Avatar billede palito Nybegynder
07. juli 2008 - 13:38 #1
Nu har jeg gjort som nedenfor, og så kalder jeg den på min index.php med "$router = new Router($controller, $action);". Er der nogle, der har nogle forslag til hvad der mangler eller er forkert? Jeg har aldrig forsøgt at bygge et controller-system, så jeg er helt på bar bund - så alle forslag er velkomne :)

<?php
class Router {
    public function __construct($controller, $action) {
        $filename = CONTROLLERS_PATH . DIRECTORY_SEPARATOR . $controller . ".php";
        if(file_exists($filename)) {
            include($filename);
           
            $class = $controller . "Controller";
            $controller = new $class;
            $controller->$action();
        }
    }
}
?>
Avatar billede dkfire Nybegynder
07. juli 2008 - 16:01 #2
Det er helt klart en fordel hvis du har godt kendskab til klasser for at lave sådan et system.
Men jeg har for nogle måneder siden selv prøvet at lave et lille MVC system.
Til det fandt jeg en del artikler på nettet, som gav et udmærket udgangspunkt.
Bla kan jeg anbefale:
http://www.phpro.org/tutorials/Model-View-Controller-MVC.html
eller
http://www.phpit.net/article/simple-mvc-php5/

Ellers søg på google for "MVC php tutorial" eller "MVC php article"
Avatar billede palito Nybegynder
07. juli 2008 - 16:10 #3
Jeg har et fint kendskab til klasser, og det eksempel jeg har postet er lavet akkurakt som på de to sider.
Avatar billede dkfire Nybegynder
07. juli 2008 - 16:25 #4
Virker det så ikke eller hvad mangler du ??
Avatar billede palito Nybegynder
07. juli 2008 - 16:36 #5
Jo det virker fint, men jeg vil gerne høre nogle kommentarer til om det er rigtig gjort m.v.
Avatar billede dkfire Nybegynder
07. juli 2008 - 16:41 #6
Jeg vil nok lave noget tjek om din controller klasse findes og om din action findes.
Søg for også at have en default controller og en default action.
Avatar billede palito Nybegynder
07. juli 2008 - 17:36 #7
class Router {
    public function __construct($controller, $action) {
        $filename = sprintf("%s.php", $controller);
       
        if(file_exists(CONTROLLERS_PATH . DIRECTORY_SEPARATOR . $filename)) {
            require_once(CONTROLLERS_PATH . DIRECTORY_SEPARATOR . $filename);
           
            $class_name = sprintf("%sController", $controller);
           
            if(class_exists($class_name)) {
                if(is_subclass_of($class_name, "Controller")) {
                    $controller = new $class_name;
                   
                    if(method_exists($controller, $action)) {
                        call_user_method($action, $controller);
                    } else {
                        throw new Exception("Method '{$action}' could not be found!");
                    }
                } else {
                    throw new Exception("Class '{$class_name}' is not a child of Controller!");
                }
            } else {
                throw new Exception("Class '{$class_name}' could not be found!");
            }
        } else {
            throw new Exception("Controller '{$controller}' could not be found!");
        }
    }
}


Det ser ud til, at nogle kalder den klasse for "Dispatcher". Er det et mere passende navn?
Avatar billede palito Nybegynder
07. juli 2008 - 17:42 #8
Hvis jeg i min controller har en funktion, der hedder index(), men man kun må se index() når man er logget ind, skal jeg så bruge header("location: ..") eller bare $this->login()? Altså videresende eller blot vise en anden funktion?
Avatar billede dkfire Nybegynder
09. juli 2008 - 16:20 #9
Jeg vil nok bruge header(), da du så har lidt mere fast rutine i hvordan de enkelte moduler bliver kaldt.

Om du kalder din klasse for router eller Dispather kommer jo lidt an på hvilket funktioner du ligger i klassen. Jeg personlig vælger at kalde den router, men den bruger jeg så også kun til at finde ud af hvilket modul/controller som skal kaldes.
Jeg har så en anden klasse som søger for at kalde de rigtige moduler/controller.
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