好了,phalcon安装完毕后开始正式项目吧
环境:1.php
2.phalcon
3.mysql
4.httpd
以上是最简单的phalcon项目部署环境,可以完成大多数小型项目
首先介绍一款phalcon的框架invo,按照mvc规则设计,基于框架可以开发出丰富多彩的项目
invo的github地址 https://github.com/phalcon/invo.git 注意分支是 0.6.x
最新1.0.0的invo结构发生很大改变,不做解释
克隆命令 " git clone -b 0.6.x git://github.com/phalcon/invo.git "
克隆invo后,先看下invo基本目录结构
一、目录结构
这是刚克隆完的invo的目录结构
下面是我的一个商家端项目的目录结构
因为有重定向文件.htaccess,当httpd访问目录时会自动进入public文件下的index.php文件
注意:httpd必须开启重定向模块,否则不能正常加载
二、基础配置
打开数据库mysql,创建库invo,将invo/schemas/invo.sql 导入该库
数据库导入成功后,配置invo/app/config/config.ini文件
最后,配置本地httpd的虚拟域名,本人以test.com为例
在httpd的vhosts.conf中配置
host中也需加入
完成上述配置后,重启httpd,打开浏览器输入test.com
如下图所示,项目就可以正常显示了
三、目录路径和MVC架构
invo的目录路径是按controller和action对应的,比如说 http://test.com/products/search
对应后台代码地址即 invo/app/controllers/ProductsController.php中searchAction
而视图代码对应在 invo/app/view/products/search.volt
(同样的如果路径是http://test.com/companies/new,以此对应后台代码则在invo/app/controllers/CompaniesController.php中newAction,而前端视图代码则在invo/app/views/companies/new.volt)
但是我们打开http://test.com/products/search,提示没有权限
那是因为该目录加入了权限控制,权限控制文件 invo/app/plugins/SecurityPlugin.phpinvo设置了两种权限分别是开放权限publicResources和私人权限 privateResources
在文件下面可以看到,通过获取session“auth”来获得角色“客人”和“用户”,而“客人”和“用户”分别对应了私人和开放权限。
当面临路径不存在或者没有对应权限的时候,跳转至404页面(/errors/show404)和401页面(/errors/show401)
看明白上面那点,我们就知道为什么http://test.com/products/search打开后是401页面了,我们需要先登录注册session(/session/index)
这里打开session/index前端视图代码(app/views/sesssion/index.volt)可以看到这里用到了form控件
register(app/form/RegisterForm.php)做有效性验证,然后提交至/session/start
打开SessionController看startAction 可以看到,提交后的数据会被Users模型(app/models/Users.php)用于数据库查询
,密码通过后,进入_registerSession方法,注册session“auth”,完成登录操作
*如果我们想用新的数据库表来设置用户,比如admin
我们则需要在app/models/目录中添加对应的Admin.php
修改class名称后,就可以使用admin模型了,在/session/start/中 使用name和password来验证
在线上项目中可能还会用到cookie和token验证(防止伪造表单暴力**)
这是我的商家端项目的登录验证
当用户登录时,输入手机号失去焦点会做注册有效性验证,登录后调用腾讯图形验证码控件,通过后提交mobile、password和图形验证码票据ticket,code至后台
使用 $this->security->checkToken()进行token验证
登录模块这块就可以避免各种风险了
四、视图布局
invo有一套完整的视图布局,当我们学会后,会非常方便我们进行项目的页面布局
当我们打开app/views/index/index.volt后发现没有头部和底部代码,代码去哪里了?
打开indexController我们可以看到
所有的controller文件都继承于ControllerBase(app/controller/ControllerBase.php)
打开ControllerBase我们发现,所有视图都要继承模板main(app/views/layouts/main.volt)
打开main.volt模板
我们可以尝试修改
那这里导航栏怎么设置
打开app/library/Elements.php,修改数组中的caption
这样通用的头部和底部模板就设置好了,个人觉得去掉Elements.php来设置menu会更加方便
如果我们一个模块对应一套头部和底部文件怎么办呢?
比如products模块中所有对应 /products/xxxx路径的视图都用单独一套头部和底部
选择编辑app/views/layouts/products.volt浏览器打开http://test.com/products/index http://test.com/products/search http://test.com/products/new可以看到,单独的头部底部代码已经加载出来了
invo视图结构上
app/view/index.volt 最低层,引用了js和css文件
app/view/layouts/main.volt 中间层 ,引入了通用的头部和底部(如果去掉ControllerBase中$this->view->setTemplateAfter(‘main’) ,则没有该层)
app/view/layouts/products.volt 中间层,引入了单独模块的头部和底部
app/view/products/xxxx.volt 最终层,所有主要内容写在该视图层
综上,products模块下所有视图都采用上视图结构
打开app/view/index.volt,可以看到invo默认使用的是bootrap的样式
这里我们可以替换,我们喜欢的前端框架,比如weui或者mui
比如我在用户端项目中就是用了weui
五、标题title和网站图标icon
图标对应位置invo/public/favicon.ico ,我们只需要把自己的网站图标改成ico格式替换即可
而title分为前置title和内容title
前置title在app/controller/ControllerBase.php中设置
而内容title则在每个controller的初始化中设置,比如IndexController.php
总结:个人感觉phalcon的invo框架上手比较难,很多地方没有文档可以参考,全得靠个人摸索。有些地方比较冗余,比如menu和tabs的设置,其实这里设置通用layout后,代码不必重写,个人感觉用不着专门设置elements。
但是当我们摸索通透以后invo框架会非常方便,不论是添加新的页面,还是新的数据库model模型,还是权限控制等等,都能举一反三。
这套invo框架推出已经很多年了,设计思想可以说非常超前。但是介于没有文档的缘故,一直没有火起来,可以说非常可惜!
下一章我讲讲ACL权限控制进阶