【thinkphp5】控制器相关操作

一、判断当前浏览器请求方式

用thinkphp3版本开发习惯了,感觉一些方法用着还是比较顺手的,比如在使用Ajax进行前后端数据交互时,判断请求类型是否是ajax的,在请求edit方法时,是get类型的添加数据呢,还是post类型的插入数据或者更新数据呢?但是这几个查用的方法在thinkphp版本升级后被阉割了,咋办呢?后来在分析开源电商--【tpshop】时,发现了一种解决办法--既然thinkphp3中的这几个方法好用,为啥不拿到thinkphp中用呢?怎么用呢?其实也很简单的

打开thinkphp框架的\thinkphp\library\think 找到controller.php文件,然后再找到控制器的构造方法部分

【thinkphp5】控制器相关操作_第1张图片

public function __construct(Request $request = null){
        $this->view    = View::instance(Config::get('template'), Config::get('view_replace_str'));
        $this->request = is_null($request) ? Request::instance() : $request;
		
	    //新增判断是post/get/ajax请求的方法
	    $this->request->isAjax() ? define('IS_AJAX',true) : define('IS_AJAX',false);	
	    ($this->request->method() === 'GET') ? define('IS_GET',true) : define('IS_GET',false);
	    ($this->request->method() === 'POST') ? define('IS_POST',true) : define('IS_POST',false);
		
	    define('MODULE_NAME',$this->request->module());				//当前模块名
	    define('CONTROLLER_NAME',$this->request->controller());		        //当前控制器名
	    define('ACTION_NAME',$this->request->action());				//当前操作名	
		
        // 控制器初始化
        $this->_initialize();

        // 前置操作方法
        if ($this->beforeActionList) {
            foreach ($this->beforeActionList as $method => $options) {
                is_numeric($method) ?
                $this->beforeAction($options) :
                $this->beforeAction($method, $options);
            }
        }
    }
当然也可用thinkphp5带的方法判断请求方式,我比较喜欢偷懒,上面的方法用着习惯了
作用 代码
是否为 GET 请求 if (Request::instance()->isGet())
是否为 POST 请求 if (Request::instance()->isPost())
是否为 PUT 请求 if (Request::instance()->isPut())
是否为 DELETE 请求 if (Request::instance()->isDelete())
是否为 Ajax 请求 if (Request::instance()->isAjax())
是否为 Pjax 请求 if (Request::instance()->isPjax())
是否为手机访问 if (Request::instance()->isMobile())
是否为 HEAD 请求 if (Request::instance()->isHead())
是否为 Patch 请求 if (Request::instance()->isPatch())
是否为 OPTIONS 请求 if (Request::instance()->isOptions())
是否为 cli if (Request::instance()->isCli())
是否为 cgi if (Request::instance()->isCgi())

二、关于_initialize()方法

    这是一个控制器初始化方法,因为所有的自定义控制器都要继承thinkphp框架controller.php这个控制器,而在这个控制器的构造方法里又执行了这个方法,所以,如果自定义控制器里有_initialize()这样一个方法,肯定会优先执行这个方法。利用这一点,这个方法很有用,比如判断是否登录,权限验证之类的乱七八糟的操作,而我是这么考虑的

【thinkphp5】控制器相关操作_第2张图片

在后台先定义一个base.php的控制器,里面定义一个_initialize()方法,在这个方法里验证是否登录,权限操作的,但是目前还没有写,先写了一个类似于_initialize()方法的if条件判断----判断子类控制器是否有init()方法,有的话,优先执行init()方法,为啥要这么做呢?因为这么做好处多多呀!!!

【thinkphp5】控制器相关操作_第3张图片

像商品分类控制器,就定义了init()方法,在init()方法里,定义了本控制器的操作模型能够$this->_db ,以及给视图所有都要分配的标题,还有就是一个上传路径,因为上传图片的方法写在刚才的base控制器里,根据子控制器定义的保存路径不同,就可以上传到不同的路径下;

三、如何执行自定义的多表连接查询的SQL

执行一个表的sql,太so easy了,那执行关于多个表的连接查询呢?因为这样的SQL不单单属于某一个表的,怎么操作呢?

【thinkphp5】控制器相关操作_第4张图片

同样的在执行一个插入记录/更新的的自己手写的SQL呢?用DB::execute($SQL);

还有,在执行插入数据时,如何判断插入数据是否成功呢?---Db::('表名')->getLastInsID()


如果SQL执行失败,想要吧SQL语句打印出来,看看是不是SQL那出问题了,怎么办呢?





你可能感兴趣的:(php)