空操作和空模块处理

空操作

    网站访问者通过路由访问到相关模块的相关操作。

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中定义函数的方式来定义空模块和空操作.


转载于:https://my.oschina.net/osmyblog/blog/294381

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值