分发器-动作分发参数a -控制器分发参数c

思考:

是否需要为每一个功能都增加一个入口文件(前端控制器)?

回答:

不需要,但是,我们要想办法让一个前段控制器来执行一个控制器内的不同动作

这个时候,需要使用动作分发参数a

 

基本概念

在请求前端控制器index.php的时候,向其传递参数啊,表示当前所需要执行的动作的名字!

比如:

  index.php?a=show         代表 当前请求的是Myabnk列表功能

  index.php?a=delete        代表当前请求的是学生删除的功能

 

注意:用户第一次访问网站入口文件的时候,不会主动的也带a参数,此时应该给入口

文件增加一个默认的a参数,而在用户访问其他的功能的时候,应该主动在html代码中确定a参数当前所执行的动作!

 

在Mybank.html 添加一个删除的连接,并手动携带参数a=delete&要携带删除的id

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table{
            width: 300px;
            border: solid 1px solid;
        }
        td{
            width:80px ;
            text-align: center;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <th>编号</th>
            <th>卡号</th>
            <th>金额</th>
        </tr>
    <?php foreach ($rs as $value):?>
    <tr>
        <td><?=$value['id']?></td>
        <td><?=$value['carNo']?></td>
        <td><?=$value['money']?></td>
        <!-- 添加删除,并且动作分发参数a 等于 MybankContreoller.class.php 中的删除动作 -->
        <td> <a href="index.php?a=delete&id=<?=$value['id']?>">删除</a> </td>
    </tr>
    <?php endforeach?>
    </table>
</body>
</html>

入口文件index.php  增加动作分发操作;

<?php 
    /**
     * 
     * 入口文件、前端控制器,代码分发器
     */
    //实例化MybankController.class.php控制器
    include './MybankController.calss.php';

    //获取动作参数a
    $a=isset($_GET['a']) ? $_GET['a'] : "show";
    //拼接a  注意,我在MybankController 中的方法都是以“Action” 结尾的。
    $a=$a."Action";
    //调用showAction方法
    $action=new MybankController;
    $action->$a();        //可变方法 如果点击删除,$a的值会等于delete 调用的方法就是 deleteAction()

思考:

  需不需要为不同的控制器创建不同的入口文件?index.php?

不需要:

  此时,需要使用控制器Controller 的分发参数c

 

 

控制器分发参数c

基本概念

  在请求前端控制器index.php的时候,向其传递c擦和你熟,表示当前所需要执行的控制类的类名:

  例如:

  Mybank列表动作

  index.php?c=MybankController&a=show

  Mybank删除动作

  index.php?c=MybankController&a=delete

  Myuser 列表动作

  index.php?c=Myuser&a=show

  Myuser 删除动作

  index.php?c=Myuser&a=delete

同a参数一样,在入口文件中也需要定义一个默认的参数c,而也需要在html连接地址中主动增加c参数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table{
            width: 300px;
            border: solid 1px solid;
        }
        td{
            width:80px ;
            text-align: center;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <th>编号</th>
            <th>卡号</th>
            <th>金额</th>
            <th>操作</th>
        </tr>
    <?php foreach ($rs as $value):?>
    <tr>
        <td><?=$value['id']?></td>
        <td><?=$value['carNo']?></td>
        <td><?=$value['money']?></td>
        <!-- 添加删除,并且动作分发参数a 等于 MybankContreoller.class.php 中的删除动作 -->
        <td> <a href="index.php?c=Mybank&a=delete&id=<?=$value['id']?>">删除</a> </td>
    </tr>
    <?php endforeach?>
    </table>
    <p>
        <a href="index.php?c=Myuser&a=show">获取my_user表</a>
    </p>
</body>
</html>

入口文件,分发参数c

<?php 
    /**
     * 
     * 入口文件、前端控制器,代码分发器
     */
    //实例化MybankController.class.php控制器
    include './MybankController.calss.php';
    include './MyuserController.class.php';
    //获取动作参数a
    $a=isset($_GET['a']) ? $_GET['a'] : "show";
    //获取控制器参数c
    $c=isset($_GET['c']) ? $_GET['c'] : "Mybank";
    //拼接a  注意,我在MybankController 中的方法都是以“Action” 结尾的。
    $a=$a."Action";
    //拼接c 注意没我在创建控制器类的时候都是以Controller结尾的。
    $c=$c."Controller";
    //调用showAction方法
    $action=new $c;
    $action->$a();        //可变方法 如果点击删除,$a的值会等于delete 调用的方法就是 deleteAction()

思考:

  1.在一次请求周期中,所请求的当前控制器名和所请求的方法名会不会改变?

  不会!

  2.如何从语法的角度,保证在一次请求周期内,a和c不会改变呢?

  使用常量

 

入口文件参数c和a 使用常量定义;

<?php 
    /**
     * 
     * 入口文件、前端控制器,代码分发器
     */


    //使用常量来保存参数c 控制器的名字
    $default_controller="Mybank";
    define('CONTROLLER',isset($_GET['c']) ? $_GET['c'] : $default_controller);

    //使用常量来保存参数a 动作的名字
    $default_action="show";
    define('ACTION',isset($_GET['a']) ? $_GET['a'] : $default_action);

    //确定控制器的名字
    $controller_name=CONTROLLER.'Controller';
    
    //确定动作的名字
    $action_name=ACTION.'Action';

    //载入当前所需要的控制器
    include "./{$controller_name}.class.php";
    //调用showAction方法
    $controller=new $controller_name;
    $controller->$action_name();        

 

posted @ 2021-01-25 13:00  WhiteSpace  阅读(138)  评论(0编辑  收藏  举报