【thinkphp5】控制器相关操作

您所在的位置:网站首页 thinkphp5入门 【thinkphp5】控制器相关操作

【thinkphp5】控制器相关操作

2023-03-27 21:08| 来源: 网络整理| 查看: 265

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

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

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

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())是否为 cliif (Request::instance()->isCli())是否为 cgiif (Request::instance()->isCgi())二、关于_initialize()方法

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

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

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

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

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3