Я пишу пользовательскую структуру 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 справится с этим. Однако в рамках каждой структуры более сложный код маршрутизации, который направляет запросы и данные конкретному контроллеру.
Мое предложение состояло бы в том, чтобы посмотреть на код в рамках этих других структур и исследовать, как они решают эти проблемы. Те, кого вы упомянули, являются с открытым исходным кодом.