空操作
网站访问者通过路由访问到相关模块的相关操作。
http://www.easyby.com/index.php/User/make
倘若访问的是如上的路由,并且在User模块中并没有make方法.这时候会让系统提示一个错误信息,而提示的错误信息可能会包含了我们文件所在路径或许其他的相关信息,这是很不安全的,可能会导致网站被人攻击的可能.因此空操作就是为了解决这种访问不存在的方法时所出现的问题.
当用户访问一个空操作的时候,此时会触发父类(Action.class.php)的魔术方法__call()
if(method_exists($this,'_empty')) {
// 如果定义了_empty操作 则调用
$this->_empty($method,$args);
}elseif(file_exists_case($this->view->parseTemplate())){
// 检查是否存在默认模版 如果有直接输出模版
$this->display();
}elseif(function_exists('__hack_action')) {
// hack 方式定义扩展操作
__hack_action();
}else{
_404(L('_ERROR_ACTION_').':'.ACTION_NAME);
}
系统首先会判断模块是不是有_empty操作,如果有则调用._empty
是否定义有函数__hack_action 如果有则调用它.
如果都没有那么就会调用系统定义的错误信息.
所以定义空操作有两种方法:
在模块中定义一个_empty方法
class IndexAction extends Action {
public function index(){
//var_dump(get_defined_constants());
$this->display();
}
public function _empty($d,$are){
echo "你访问的方法".$d."不存在";
}
}
如果已经在访问的模块中定义了_empty方法,并且在common.php中也定义了__hack_action方法 系统会调用_empty方法而不去调用__hack_action(由__call方法可以得知).
空模块
顾名思义 用户访问不存在的模块时所需要做的操作
if(!$module) {
if('4e5e5d7364f443e28fbf0d3ae744a59a' == MODULE_NAME) {
header("Content-type:image/png");
exit(base64_decode(App::logo()));
}
if(function_exists('__hack_module')) {
// hack 方式定义扩展模块 返回Action对象
$module = __hack_module();
if(!is_object($module)) {
// 不再继续执行 直接返回
return ;
}
}else{
// 是否定义Empty模块
$module = A($group.'Empty');
if(!$module){
_404(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME);
}
}
}
如果模块不存在,那么会判断是否有函数 __hack_module存在,如果没有定义有函数__hack_module (__hack_module定义在common.php中),则会判断是否有定义EmptyAction.class.php
<?php
class EmptyAction extends Action{
public function _empty(){
header("Content-Type:text/html;charset=utf-8");
echo "fdfsdaf";
echo "<center><img src='".IMG_URL_ADMIN."/500_error.gif' alt=''/>
<br/><a href='http://www.easyby.com' >返回首页</a>
</center>";
}
public function index(){
echo "你输入的模块不存在"
}
}
当访问的模块和方法都不存在的时候,会调用EmptyAction的_empty方法
当路由是这样;http://www.easybuy.com/index.php/Usrsnone/index
会调用EmptyAction的index方法
"你输入的模块不存在"
对于空模块和空操作,推荐使用使用在common中定义函数的方式来定义空模块和空操作.