превратить URL-адрес в аргументы funciton php mvc

Я пишу пользовательскую структуру 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 } } ?> 

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

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

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

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

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

Для тех, кто хочет знать, что я делал, окончательный код ниже … (это из моего 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 } } ?> 

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

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

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