превратить маршрут URL в аргументы функции php mvc - PullRequest
3 голосов
/ 06 ноября 2010

Я пишу пользовательский MVC-фреймворк для PHP-проекта, и все прекрасно, пока не получим аргументы из URL-маршрута. Я застрял при передаче части URL-маршрута в аргумент функции динамически. У меня уже есть метод, который заключается в том, чтобы просто взорвать маршрут и использовать массив для аргументов функции, но мне бы очень хотелось узнать, как это сделать, как в CodeIgnitor или CakePHP.

Вот что я хочу сделать. URL сайта будет ...

url: http://yoursite.com/profile/view/35/foo

и в моем контроллере у меня будет ...

<?php

Class profileController Extends baseController 
{

    public function view($ID, $blah)
    {
        echo $ID; //would show 35
        echo $blah; //would show foo
    }

}

?>

Мне бы очень хотелось узнать, как это делается. Большое спасибо!

Ответы [ 3 ]

6 голосов
/ 06 ноября 2010

Самый простой способ справиться с этим - использовать функцию call_user_func_array ().Вы можете использовать его следующим образом:

call_user_func_array(array($controller, $method), $params);

$ controller будет объектом контроллера, который вы уже создали, а $ method будет методом контроллера.Тогда $ params - это массив параметров, собранных из URI.Вам просто нужно извлечь часть контроллера / метода URI.

Вы также можете сделать это, используя Отражение , но это обычно медленнее, чем при использовании вышеописанного метода.

3 голосов
/ 06 ноября 2010

Для тех, кто хочет знать, что я в итоге делал, окончательный код приведен ниже ... (это из моего router.class.php)

<?php

$route = (empty($_GET['rt'])) ? '' : $_GET['rt'];
$this->route = explode('/', $route);

/*** a new controller class instance ***/
$class = $this->controller . 'Controller';
$controller = new $class($this->registry);

/*** load arguments for action ***/
$arguments = array();
foreach ($this->route as $key => $val) 
{
    if ($key == 0 || $key == 1)
    {
    }
    else
    {
        $arguments[$key] = $val;
    }
}

/*** execute controller action w/ parameters ***/
call_user_func_array(array($controller, $action), $arguments);

?>

если мой URL был

http://mysite.com/documentation/article/3

мой контроллер выглядит так ...

<?php

Class documentationController Extends baseController 
{

    public function article($article_ID = '')
    {
        echo $article_ID; //shows 3
    }

}

?>

Спасибо за помощь.

1 голос
/ 06 ноября 2010

Проще говоря, RewriteRules справиться с этим. Однако в каждой структуре есть более сложный код маршрутизации, который направляет запросы и данные на конкретный контроллер.

Мое предложение состояло бы в том, чтобы посмотреть на код в этих других структурах и исследовать, как они решают эти проблемы. Те, что вы упомянули, с открытым исходным кодом.

...