thinkphp3.2实现控制器请求截断

大兄弟 2018年12月23日0   155

以前看用lavaral做的项目的时候,看见过类似这样的写法:

$obj->request->get(function(){
    //逻辑代码
});

我没用过lavaral,个人猜测这是get请求的时候会运行匿名函数中的代码块。

所以我在使用thinkphp3.2的时候,也想使用这种方式进行封装不同请求时运行不同的代码段。

经过研究,可以直接使用__call魔术方法进行实现,如下代码:

public function __call($name, $arguments)
{
    if(preg_match('!^IS_!i', $name)) {
      // 请求判断运行
      if(constant($name)) {
          // 输出常量
          if(is_callable($arguments[0])) {
            return $arguments[0]();// 判断是否为合法的可调用结构
        }
      }
    }
    parent::__call($name, $arguments);
}

因为父类存在了一个__call(),所以写的时候需要else兼容一下。

这样做的话会联想到一个问题,就是is_前缀的空请求都会被拦截,庆幸的是拦截内部还有一个is_callable判断,所以拦截成功的概率算偏低的。

实现了这个功能后,我们就不再需要if(IS_POST){}这类繁琐的判断了,并且if语句多了也不利于阅读。