• 分发器-动作分发参数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();        
  • 相关阅读:
    Java
    Java
    Java
    Java
    Java
    Java
    Java
    Java
    JSON
    正则表达式
  • 原文地址:https://www.cnblogs.com/xiaowie/p/14324637.html
Copyright © 2020-2023  润新知