PHP7 0中的路由技术有哪些实现方式
洪振霞 2023-07-11编程经验
在PHP7.0中,实现路由技术的方式有很多,其中最流行的是使用模式匹配,将URL路径转换为控制器方法的调用。以下是一些在PHP7.0中使用模式匹配实现路由的方法。方法一:使用PHP内置的路由解析函数P
在PHP7.0 中,实现路由技术的方式有很多,其中最流行的是使用模式匹配,将URL路径转换为控制器方法的调用。以下是一些在PHP7.0中使用模式匹配实现路由的方法。
方法一:使用PHP内置的路由解析函数
PHP提供了一些内置的路由解析函数,如parse_url()和parse_str()函数,可以从定义的URL中提取出控制器名称和方法名。例如,以下是一个处理路由并呈现页面的示例:
<?php //获取路径 $parseUrl = parse_url($_SERVER['REQUEST_URI']); $path = $parseUrl['path']; //去掉第一个/,并分解路径 $routes = explode('/', ltrim($path, '/')); $controller = $routes[0]; $action = isset($routes[1]) ? $routes[1] : 'index'; //根据控制器名称加载控制器类 $controllerName = ucfirst($controller).'Controller'; require_once __DIR__."/controllers/{$controllerName}.php"; //实例化控制器并调用方法 $controller = new $controllerName(); $controller->$action(); ?>
方法二:使用正则表达式
正则表达式可以很容易地从URL中提取参数值。下面是一个基于正则表达式的路由技术示例:
<?php $routes = [ '/^\/users\/(\d+)$/' => 'UserController@show' ]; $uri = $_SERVER['REQUEST_URI']; $method = $_SERVER['REQUEST_METHOD']; $action = null; foreach ($routes as $pattern => $p_action) { if (preg_match($pattern, $uri, $matches) && strtolower($method) == 'get') { $action = $p_action; break; } } if (is_null($action)) { die('No route matched'); } list($controller, $method) = explode('@', $action); $controller = new $controller(); call_user_func_array(array($controller,$method), $matches); ?>
方法三:使用第三方路由库
PHP也提供了一些第三方路由库,可用于实现复杂的路由需求。例如,FastRoute是一个强大的路由库,可用于处理所有类型的URL路由,包括静态路由、参数路由和正则表达式路由。下面是一个使用FastRoute库实现路由的示例。
// composer require nikic/fast-route <?php require 'vendor/autoload.php'; $dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { $r->addRoute('GET', '/user/{id:\d+}', 'UserController@showUser'); // {id} must be a number (\d+) $r->addRoute('GET', '/articles/{id:[a-z0-9]+}', 'ArticleController@showArticle'); // {id} must be letters or numbers ([a-z0-9]+) $r->addRoute('GET', '/profile/{name}', 'UserController@showProfile'); // The /{title} suffix is optional $r->addRoute('GET', '/blog/{year}/{month}/{title:[a-zA-Z+]+}', 'BlogController@showBlog'); }); // 获取URI,并去除查询字符串 $uri = $_SERVER['REQUEST_URI']; if (false !== $pos = strpos($uri, '?')) { $uri = substr($uri, 0, $pos); } $routeInfo = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], $uri); switch ($routeInfo[0]) { case FastRoute\Dispatcher::NOT_FOUND: // ... 404 Not Found break; case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: $allowedMethods = $routeInfo[1]; // ... 405 Method Not Allowed break; case FastRoute\Dispatcher::FOUND: $handler = $routeInfo[1]; $vars = $routeInfo[2]; list($controller, $method) = explode('@', $handler); $controller = new $controller(); call_user_func_array(array($controller, $method), $vars); break; } ?>综上所述,使用内置函数、正则表达式、第三方路由库等方式都能实现PHP7.0中的路由技术。开发者可以选择适合自己需求的方式,将请求路由到相应的控制器方法中,并从控制器方法中获取相应的数据并将其呈现给用户。
很赞哦! ()