phalcon经验教程系列(四)controller的常用方法,mysql查询语言

时间:2024-03-13 13:15:16

当我们学会前几章以后,我们已经可以完成一些基本的phalcon页面的设置,现在我们开始学习如何使用phalcon完成更多的功能

一、页面layout控制
我们已经学会的css和js布局,当我们希望controller某个action不受layout控制
比如,用户首页(/user/index)头部和底部样式(使用app/views/layouts/sepcial.volt)和其他用户页(/user/xxx)头部和底部样式(使用app/views/layouts/user.volt)需要区分开。
当我们遇到这种情况的时候,就可以使用渲染级别,如下图所示
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
这样就可以完成对特定页面的layout控制

二、controller变量输出与渲染
当我们在action中想输出某个变量到页面时,可以使用$this->view->变量名 = 变量的方式
比如我们想输出变量 test到页面/products/index
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
在前端(app/views/products/index.volt)中,使用{{ 变量名 }}的方式渲染

phalcon经验教程系列(四)controller的常用方法,mysql查询语言
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
当我们变量输出为数组或者对象时,例如下图中articleList
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
我们可以使用for循环渲染数组中结果
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
输出
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807180254578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvb2tpbmdhdHNreQ==,size_16,color_FFFFFF,t_70phalcon经验教程系列(四)controller的常用方法,mysql查询语言

还可以在循环中或者循环外使用if做特殊判断,比如
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
这样就可以看到大于指定时间的文章会有“最新”标签
phalcon经验教程系列(四)controller的常用方法,mysql查询语言

下面是数组变量渲染生成多个图片上传控件
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
结合变量和渲染,我们可以生成很多有趣的功能,比如提示跳转
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
alert是我在userController中写的私有方法,当调用这个方法时将参数message,jump_url传递至/index/jump,在该页面写有weui的提示框,按照message提示,点击后跳转至jump_url
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
三、controller值传递
phalcon将变量值从一个页面传到另外一个页面分为get,post,路径参数(原理跟get类似,方式有很大区别)传递,session,cookie,全局变量等等
无论是get方式还是post方式都可以通过$this->request->getPost()方法获取参数值
phalcon经验教程系列(四)controller的常用方法,mysql查询语言

用$this->request->isPost() 、 $this->request->isAjax()来判断是否是post传值或者ajax传值,用 $this->security->checkToken()来判断是否通过token验证(注意token验证的页面不能有动态刷新。比如客服插件,因为会动态刷新表单页面,将会导致通不过token验证),以上几种方法在登录注册中会常常用到

当表单传输文件时,还可能使用$this->request->hasFiles()来判断是否有文件传输,具体可以参考文档
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
路径参数在查询模块经常会用到,因为用户会保留页面查询结果,其原理跟get方式类似,但是在conroller中可以直接取值不用获取
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
如上图所示phalcon的路径为 http://域名/controller名称/action名称/参数1/参数2/参数3/…无限叠加
session,cookie以及全局变量不细讲,大家自行去看文档

页面跳转,当后台处理完数据后,会将用户跳转到不同的页面,使用this>response>redirect()使使this->response->redirect()来实现,注意这里可以使用路径参数例如:使用this->response->redirect(‘/user/search/参数1/参数2’)
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
还有一种方式是$this->dispatcher->forward(),这种比较特殊,特殊原因在两点
1.页面url不变,页面重新渲染。例如我们在/products/search/页forward/index/index
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
2.不管在哪个页面,使用forward后,变量值都可以传递到新渲染的页面,比如我们在ProductsController的SearchAction中加入testParams变量,然后在/index/index.volt中渲染该变量
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
输出结果可以看到
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
上述方法可以构建封装之前我所说的提示跳转功能,也可以在特殊情况渲染特殊模板,以后用到的地方可能比较多

四、mysql查询语言
首先需要注意,mysql添加任何表都需要在app/models/中添加对应的模型!,比如添加article表后必须添加article模型

find和findFirst,find查询出来的是二维数组,findFirst查询出来的是一维数组,以下图为例
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
输出结果对比:
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
当然也可以设置多种查询条件,具体可以参考文档
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
phalcon经验教程系列(四)controller的常用方法,mysql查询语言

当我们需要联表查询时,就必须使用phalcon复合查询
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
上图以UserBank为主表,左联Bank表和Region表,取消UserBank、Bank、Region三张表中数据
,当然也可以innerJoin(内联查询)rightJoin(右联查询)

这里标点符号不能错,模型大小写必须对应,查询字段必须存在,否则都会报错

复合查询时排序和限数写法和find不一样
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
还有重要一点,这样取出来的结果集二维对象,如果只取一行数据,在最下面加->getFirst()
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
如果想要将对象转为数组使用->toArray()即可
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
最后还有一种情况,将同一表联两次,比如我的地址省和市都需要联region表,如下图所示
phalcon经验教程系列(四)controller的常用方法,mysql查询语言
在取出字段时,分别将RegionC和RegionP取出并重命名即可达到上述要求

下一章讲mysql集群和主从分离实现,memcached缓存实现