php控制器找到public,【thinkphp5】控制器相关操作

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

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

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

c890dee70180ae787009acd4459ee498.png

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()这样一个方法,肯定会优先执行这个方法。利用这一点,这个方法很有用,比如判断是否登录,权限验证之类的乱七八糟的操作,而我是这么考虑的

83b35d0e6800bff1d619e5f77e87129f.png

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

43173bfefc9e87bbda9d844578bdefb9.png

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

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

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

9ea1f31195646f2e2557ca313281a2ea.png

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

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

810c641544c427d322a6fd5c213fb605.png

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

2ffcc3ce37fa1bd3e8c77cb54a4e2531.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值