思考:
是否需要为每一个功能都增加一个入口文件(前端控制器)?
回答:
不需要,但是,我们要想办法让一个前段控制器来执行一个控制器内的不同动作
这个时候,需要使用动作分发参数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();