Avatar billede kasbas91 Nybegynder
19. juli 2011 - 20:18 Der er 4 kommentarer og
1 løsning

Mit routing system til mit mvc har jeg lidt problemer med, fordi jeg skal have mine parameter med over rigtigt ?

Mit routing system til mit mvc har jeg lidt problemer med, fordi jeg skal have mine parameter med over rigtigt..

I kan se min kode her:

<?php
    $router = new Router();
    $router->routes(array(
        array('url' => '/^(home)?$/', 'route' => 'user#index'),
        array('url' => '/^home\/$/', 'route' => 'user#index'),
        array('url' => '/^home\/(?P<id>\d+)\/add\/(?P<id2>\d+)\/$/', 'route' => 'user#add')
    ));
?>




<?php
    class Router extends Error {
        public $match = false;
        function __construct() { $this->error = new Error(); }
        function routes($routes) {
            foreach($routes as $urls => $route) {
                if(preg_match($route['url'], (isset($_GET['url']) ? $_GET['url'] : null), $matches)) {
                    $this->_setRoutes($route['route'], $matches);
                    $this->match = true;
                    break;
                }
            }
            echo (!$this->match ? $this->error->set(1, 'Kunne ikke finde ruten.') : null);
        }
        private function _setRoutes($route, $matches) {
            $rexplode = explode('#', $route);
            $filepath = controllers.ds.$rexplode[0].'_controller'.ext;
            if(!file_exists($filepath)) {
                echo $this->error->set(1, 'Du mangler desværre: <b>'.$rexplode[0].'_controller.php</b> under '.controllers.'.');
            } else {
                require $filepath;
                $instance = new $rexplode[0]();
                if(!method_exists($instance, $rexplode[1])) {
                    echo $this->error->set(1, 'Du mangler desværre: <b>'.$rexplode[1].'</b> under '.$filepath.'.');
                } else {
                    //$instance->{$rexplode[1]}();
                    call_user_func_array(array($rexplode[0], $rexplode[1]), $matches);
                }
            }
        }
    }
?>



Jeg får også sendt mine parameter såsom: id eller id2 med over, men det er ikke på den rigtige måde jeg gør det..
Hvis i lige gad og kigge lidt på det, og hjælpe mig lidt..
så kunne det være lækkert.
hvis jeg print_r($matches); så er det jo hele url'en jeg kigger i fra regular expressions, og det skulle vel engelig kun være id og id2 den skulle kigge i... hvis i forstår mig korrekt..
og jeg vil gerne have så man kan skrive $params['id'] i stedet for at man kun kan bruge det i den action fx: add eller index, som man sætter i call_user_func_array.

Tak...
Avatar billede Slettet bruger
19. juli 2011 - 23:18 #1
Forstår jeg dig rigtigt, hvis det du ønsker er at din 'metode' - User::Add - kun skal have ét parameter - $params (array)?

I så fald skal du lave funktionen således:
<?php
class User {
  public function Add(array $params) {
    $id = $params["id"];
    $id2 = $params["id2"];
  }
}
?>

Og når du kalder funktionen, skal du bruge call_user_func() istedet for call_user_func_array(). Eksempel:
call_user_func(array($rexplode[0], $rexplode[1]), $matches);

På den måde angiver du kun ét parameter - et array - hvor du så kan hente de forskellige data via arrayets index's.
Avatar billede kasbas91 Nybegynder
20. juli 2011 - 00:14 #2
Det var lige præcis det jeg søgte, mange tak :)

smid et svar .. :)
Avatar billede Slettet bruger
20. juli 2011 - 01:09 #3
Var da så lidt.
Du får dit svar her :)
Avatar billede kasbas91 Nybegynder
21. juli 2011 - 13:03 #4
nu har jeg et andet lille problem med call_user_func...

nu kan jeg ikke bruge $this->models->test() inde i user class.

fordi jeg bruger call_user_func.

da den siger: Using $this when not in object context in

jeg plejede at bruge $this->instance->{$rexplode[1]}();

hvad kan man lige gøre der.
Avatar billede kasbas91 Nybegynder
21. juli 2011 - 13:16 #5
jeg kan få den til at virke hvis jeg bruger :

Model::test();

men er det ikke også helt ok at bruge istedet for :

$this->models->test()
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