PHP实现一个简单url路由功能实例

请参考以下完整攻略,步骤如下:

1. 了解URL路由的概念

路由,通俗来说就是将URL映射到对应的程序上去执行,以满足不同需求的访问需求。比如我们可以把 URL 中的参数作为查询数据库的条件,或者是根据 URL 中的参数选择不同的模板文件来渲染页面等等。

2. 编写.htaccess文件

.htaccess是apache生成服务器配置文件通道之一,使用它可以对本主机全局或单文件进行配置,我们可以通过以下代码获取用户提交的URL。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

上面的代码就是实现请求 URL 的路由,将请求传递到 index.php 文件并将 URL 作为参数传递。

3. 编写PHP代码解析URL参数

if(isset($_GET['url'])){
    $urlArray = explode('/',$_GET['url']);
}

在这段代码中,我们检查 URL 是否存在并将 URL 参数进行分割,并以数组形式存储在 $urlArray 变量中。

例如,如果用户访问的 URL 是 http://example.com/user/edit/2 ,则该数组中的内容将是:

$urlArray = array(
    'user',
    'edit',
    '2'
);

4. 编写路由调度控制器

现在我们已经得到了请求 URL 的参数,下一步就是编写路由调度控制器来决定哪一个文件和方法需要被执行,我们以 $urlArray 中的第一个参数作为控制器名,并以第二个参数作为该控制器执行的方法名。

$controllerName = ucfirst($urlArray[0]);
if(file_exists('controllers/'.$controllerName.'.php')){
    require_once('controllers/'.$controllerName.'.php');
    $controller = new $controllerName();
    $actionName = isset($urlArray[1]) ? $urlArray[1] : 'index';
    if(method_exists($controller,$actionName)){
        $controller->$actionName();
    }else{
        echo '方法不存在';
    }
}else{
    echo '控制器不存在';
}

在这段代码中,我们首先使用 ucfirst() 方法将控制器名中的首字母变为大写,然后使用 file_exists() 函数检查控制器文件是否存在。如果存在,则引入该文件并实例化该控制器,然后执行控制器中的方法。

例如,如果访问的 URL 为 http://example.com/user/edit/2 ,则将会执行 UserController 控制器中的 edit 方法,并将 2 作为参数传递。

5. 示例说明

示例一:

假设我们有一个简单的网站,需要实现一个留言板功能,通过URL来识别不同的行为,例如:

  1. 显示留言列表:http://example.com/message/list
  2. 显示添加留言页面:http://example.com/message/add
  3. 处理添加留言:http://example.com/message/post

我们可以根据这些URL来编写控制器和方法,例如:

controllers/
    MessageController.php
class MessageController{
    public function list(){
        //显示留言列表
    }
    public function add(){
        //显示添加留言页面
    }
    public function post(){
        //处理添加留言,并跳转回留言列表
    }
}

然后,在PHP文件中解析URL参数和路由调度控制器。

//解析URL参数
if(isset($_GET['url'])){
    $urlArray = explode('/',$_GET['url']);
}

//路由调度控制器
$controllerName = ucfirst($urlArray[0]);
if(file_exists('controllers/'.$controllerName.'.php')){
    require_once('controllers/'.$controllerName.'.php');
    $controller = new $controllerName();
    $actionName = isset($urlArray[1]) ? $urlArray[1] : 'index';
    if(method_exists($controller,$actionName)){
        $controller->$actionName();
    }else{
        echo '方法不存在';
    }
}else{
    echo '控制器不存在';
}

现在,当我们访问 http://example.com/message/list 时,将会执行 MessageController 中的 list 方法。

示例二:

假设我们有一个电商网站,需要实现一个商品列表功能,通过URL来识别不同的行为,例如:

  1. 显示所有商品列表:http://example.com/product/list
  2. 显示指定商品详细信息:http://example.com/product/detail/{id}

我们可以根据这些URL来编写控制器和方法,例如:

controllers/
    ProductController.php
class ProductController{
    public function list(){
        //显示所有商品列表
    }
    public function detail($id){
        //根据$id查询商品详细信息,并显示出来
    }
}

然后,在PHP文件中解析URL参数和路由调度控制器。

//解析URL参数
if(isset($_GET['url'])){
    $urlArray = explode('/',$_GET['url']);
}

//路由调度控制器
$controllerName = ucfirst($urlArray[0]);
if(file_exists('controllers/'.$controllerName.'.php')){
    require_once('controllers/'.$controllerName.'.php');
    $controller = new $controllerName();
    $actionName = isset($urlArray[1]) ? $urlArray[1] : 'index';
    if(method_exists($controller,$actionName)){
        if(isset($urlArray[2])){
            $controller->$actionName($urlArray[2]);
        }else{
            $controller->$actionName();
        }
    }else{
        echo '方法不存在';
    }
}else{
    echo '控制器不存在';
}

现在,当我们访问 http://example.com/product/detail/1 时,将会执行 ProductController 中的 detail 方法,并将 1 作为参数传递。

本文链接:https://my.lmcjl.com/post/15249.html

展开阅读全文

4 评论

留下您的评论.