c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

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中的路由技术。开发者可以选择适合自己需求的方式,将请求路由到相应的控制器方法中,并从控制器方法中获取相应的数据并将其呈现给用户。

文章评论