【发布时间】:2015-04-16 09:38:42
【问题描述】:
当我开始我的 MVC 之旅时,我正在尝试编写自己的路由器。我已经掌握了它的基础知识,但是当涉及到额外的 URL 参数时,我遇到了一些障碍。根据我迄今为止编写代码的方式,我不知道如何解决这个问题。
这是我的代码:
public/index.php
<?php
include '../config.php';
include '../routes.php';
include '../app/controllers/RouteController.php';
$rc = new RouteController($config, $routes);
?>
config.php
<?php
$config['app_url'] = 'http://localhost/mymvc'; // no ending slashes
?>
routes.php
<?php
$routes = array();
$routes[] = array('url' => '', 'controller' => 'HomeController');
$routes[] = array('url' => 'leads', 'controller' => 'LeadController');
$routes[] = array('url' => 'leads/page/[0-9]', 'controller' => 'LeadController', 'method' => 'update', 'params' => 'page=$1');
$routes[] = array('url' => 'leads/create', 'controller' => 'LeadController', 'method' => 'create');
$routes[] = array('url' => 'leads/update/[0-9]', 'controller' => 'LeadController', 'method' => 'update', 'params' => 'id=$1');
?>
app\controllers\RouteController.php
<?php
class RouteController {
private $config;
private $routes;
private $url;
private $controller = null;
private $method = null;
private $params = array();
public function __construct ($config, $routes) {
$this->config = $config;
$this->routes = $routes;
$this->setUrl();
$route_exists = false;
// check if route has been declared for security
foreach ($this->routes as $route) {
if ($route['url'] == $this->url) {
$this->controller = $route['controller'];
$this->method = isset($route['method']) ? $route['method'] : null;
$this->params = isset($route['params']) ? $route['params'] : array();
$route_exists = true;
}
}
// send them to app index if route does not exist
if ($route_exists) {
$this->route();
}
else {
header('Location: '.$this->config['app_url']);
die('route does not exist');
}
}
private function setUrl () {
$url = trim($_GET['url'], '/');
$url = filter_var($url, FILTER_SANITIZE_URL);
$this->url = $url;
}
private function route () {
// include '../controllers/'.$this->controller;
// do stuff with the controller, method, params
}
}
?>
现在,如果你看一下 routes.php 文件,你可以从我的代码中看到它对以下路由没有问题:
<?php
$routes = array();
$routes[] = array('url' => '', 'controller' => 'HomeController');
$routes[] = array('url' => 'leads', 'controller' => 'LeadController');
$routes[] = array('url' => 'leads/create', 'controller' => 'LeadController', 'method' => 'create');
?>
我需要弄清楚如何在我的路线中处理其他参数。这些是我试图找到解决方案的有问题的路线:
$routes[] = array('url' => 'leads/page/[0-9]', 'controller' => 'LeadController', 'method' => 'update', 'params' => 'page=$1');
$routes[] = array('url' => 'leads/update/[0-9]', 'controller' => 'LeadController', 'method' => 'update', 'params' => 'id=$1');
任何帮助将不胜感激。谢谢你:)
【问题讨论】:
-
看起来 foreach 循环中的 preg_match 可能是我最好的选择......然后我只需要弄清楚如何从 URL 本身中获取参数,以便它们可以在控制器中使用...... .