Phalcon控制器
Phalcon 控制器
使用控制器(Using Controllers)
Actions
是控制器中用于处理请求的方法。默认情况下,控制器中所有公共方法都映射到Actions
,能够通过URL
访问。Actions
负责解释请求并创建响应,响应通常以视图形式呈现,或通过其他方式创建。
当访问类似http://localhost/blog/posts/show/2015/the-post-title
的URL
时,Phalcon
会像下面这样解析URL
的各个部分:
Phalcon目录 | blog |
控制器 | posts |
方法 | show |
参数 | 2015 |
参数 | the-post-title |
这种情况下,控制器PostsController
将负责处理该请求。控制器可以通过Phalcon\Loader
加载,因此控制器存放在应用中什么地方,并没有强制要求,可以根据需求自由的组织控制器。
控制器名称以Controller
结尾,Actions
名称以Action
结尾。
<?phpuse Phalcon\Mvc\Contrller;class PostsController extends Contrller
{public function indexAction(){}public function showAction($year, $postTitle){}
}
额外的URI
参数被定义为Action
的参数,可以通过局部变量访问它们。控制器如果继承基类Phalcon\Mvc\Controller
,便可以访问应用中的各种服务。
没有默认值的参数被视为必选参数,可以像PHP
那样为参数设定默认值:
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function indexAction(){}public function showAction($year = 2015, $postTitle = 'some default title'){}
}
参数按照它们在路由中传递的顺序进行分配,可以通过参数名称获取任意参数:
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function indexAction(){}public function showAction(){$year = $this->dispatcher->getParam('year');$postTitle = $this->dispatcher->getParam('postTitle');}
}
调度循环(Dispatch Loop)
调度循环在调度器中运行,直到没有剩余操作需要执行。上例中,只有一个动作被执行。forward()
方法在调度循环中提供更复杂的操作流,可以将操作转发给其他控制器 / 方法。
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function indexAction(){}public function showAction($year, $postTitle){$this->flash->error("You don't have permission to access this area");// 转发给另一个方法$this->dispatcher->forward(['controller' => 'users','action' => 'signin',]);}
}
如果用户没有访问某个方法的权限,则将用户转发到UsersController
控制器的signin
方法。
<?phpuse Phalcon\Mvc\Controller;class UsersController extends Controller
{public function indexAction(){}public function signinAction(){}
}
初始化控制器(Initializing Controllers)
Phalcon\Mvc\Controller
提供了initialize()
方法,它在所有方法被执行前执行,不建议使用构造方法__construct()
。
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public $settings;public function initialize(){$this->settings = ['mySetting' => 'value',];}public function saveAction(){if ($this->settings['mySetting'] === 'value') {// ...}}
}
只有当beforeExecuteRoute
事件成功执行时,initialize()
方法才被调用,避免了初始化方法中的应用逻辑无法在未授权的情况下执行。
如果想在构造控制器对象之后执行初始化逻辑,可以实现onConstruct()
方法:
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function onConstruct(){// ...}
}
注意,即使被调用的方法不存在于控制器中,或者用户无权访问(根据开发者定义的权限控制)该方法,onConstruct()
方法仍会被执行。
注入服务(Injecting Services)
继承了Phalcon\Mvc\Controller
的控制器,可以访问应用中的服务容器。例如,如果注册了这样的服务:
<?phpuse Phalcon\Di;$di = new Di();$di->set('storage',function () {return new Storage('/some/directory');},true
);
可以通过多种方式访问该服务:
<?phpuse Phalcon\Mvc\Controller;class FilesController extends Controller
{public function saveAction(){// 访问与服务同名的属性来注入服务$this->storage->save('/some/file');// 从DI中访问服务$this->di->get('storage')->save('/some/file');// 使用魔术方法getter$this->di->getStorage()->save('/some/file');$this->getDi()->getStorage()->save('/some/file');// 使用数组语法$this->di['storage']->save('/some/file');}
}
请求和响应(Request and Response)
假设框架预先注册好了服务。request
服务包含一个Phalocn\Http\Request
实例,response
服务包含一个Phalcon\Http\Response
实例,表示将要发送给客户端的内容。
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function indexAction(){}public function saveAction(){// 检查是否POST请求if ($this->request->isPost()) {// 获取POST数据$customerName = $this->request->getPost('name');$customerBorn = $this->request->getPost('born');}}
}
响应对象通常不是直接被使用,而是在方法执行前构建。有时,比如afterDispatch
事件中,直接访问响应对象很有用:
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function indexAction(){}public function notFoundAction(){// 发送HTTP 404 响应头$this->response->setStatusCode(404, 'Not Found');}
}
Session数据(Session Data)
Session
能够在请求之间维持持久的数据,可以从任何控制器中访问Phalcon\Session\Bag
来封装需要持久化的数据:
<?phpuse Phalcon\Mvc\Controller;class UserController extends Controller
{public function indexAction(){$this->persistent->name = 'Micheal';}public function welcomeAction(){echo 'Welcome, ', $this->persistent->name;}
}
服务充当控制器(Using Services as Controller)
服务可以充当控制器,控制器总是从服务容器中请求。因此,以类名称注册的任何服务,都可以充当控制器角色:
<?php// 将控制器注册为服务
$di->set('IndexController',function () {$component = new Component();return $component;}
);// 带命名空间的控制器
$di->set('Backend\Controllers\IndexController',function () {$component = new Component();return $component;}
);
控制器事件(Events in Controllers)
控制器自动监听调度事件,实现与事件名称同名的方法,可以在操作执行之前 / 之后实现钩子:
<?phpuse Phalcon\Mvc\Controller;class PostsController extends Controller
{public function beforeExecuteRoute($dispatcher){// 在所有动作之前执行if ($dispatcher->getActionName() === 'save') {$this->flash->error("You don't have permission to save posts");$this->dispatcher->forward(['controller' => 'home','action' => 'index',]);}}public function afterExecuteRoute($dispatcher){// 在所有动作之后执行}
}
Phalcon控制器相关推荐
- phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl
制作简单的acl, dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等) ...
- phalcon: Profiling分析 profilter / Plugin结合,dispatcher调度控制器 监听sql执行日志
个人觉得profilter 跟 logger 功能差不多,logger的功能在于写入,profilter功能在于sql后及时显示分析.都是对sql执行的的分析:一个是写入log文件,一个是直接在页面展 ...
- phalcon系列(1) hello phalcon
2019独角兽企业重金招聘Python工程师标准>>> 接触和对比了了比较多的php框架,要说性能上,c类框架肯定比其他框架的性能要突出很多,就yaf跟phalcon而言,phalc ...
- linux调用php项目,在Centos/Linux系统下使用Phalcon开发PHP项目
1.Phalcon安装 最好采取源码编译安装.这样可以体验最新的稳定版本.安装过程比较简单,下载tar.gz源码后,解压编译将 phalcon.so 加到php.ini中即可.重启php-fpm,查看 ...
- php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记
phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...
- phalcon index.php,Phalcon环境搭建与项目开发
简介 Phalcon 是开源.全功能栈.使用 C 扩展编写.针对高性能优化的 PHP 5 框架. 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来,可以直接使用. ...
- php高性能框架phaicon,3分钟快速入门php高性能框架Phalcon
Phalcon 是什么,我们为啥要选择它?Phalcon 是开源.全功能栈.使用 C 扩展编写.针对高性能优化的 PHP 框架.开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类 ...
- php phalcon 安装,Phalcon框架安装与使用教程介绍
Phalcon是一款php中国外非常的流程的框架了,但在国内Phalcon框架还不怎么样了,小编今天来为各位介绍Phalcon框架安装与使用教程,希望下文可以帮助到各位. linux服务器安装phal ...
- 在Centos/Linux系统下使用Phalcon开发PHP项目
2019独角兽企业重金招聘Python工程师标准>>> 1.Phalcon安装 最好采取源码编译安装.这样可以体验最新的稳定版本.安装过程比较简单,下载tar.gz源码后,解压编译将 ...
最新文章
- 计算上月、下月、上周、下周..日期范围
- file control
- PHP返回数据json数据样式要求是对象{},而不是[]
- swift 可变參数
- django富文本编辑器
- ASP.NET后台调用前台JS函数的三种常见方法
- Hive设置参数-指定引擎-队列
- 为 Windows 用户准备的简明 Linux 词汇表
- Office在线预览及PDF在线预览的实现方式大集合
- 读书笔记∣元数据:用数据的数据管理你的世界 Ch.5-8
- (转载)mysql书籍
- iPhone硬件拆机解锁方法 十步!
- AE剪辑快捷键有哪些?这波快捷键分享拿好了
- 东哥带你们认清五险一金︿( ̄︶ ̄)︿
- 如何搭建DNS--域名系统
- python非线性可分支持向量机模型(实现iris分类)
- 学校校车运营各项安全管理制度_学校校车安全管理的规章制度
- Docker搭建Pikachu靶场
- Java8之Lambda函数式编程(一)
- 保利威视频播放器功能抽取,仅作为播放课程资源使用,去除多余功能
热门文章
- 成都python工作-成都python就业
- deep learning with python 中文版-Deep Learning with Python
- python九九乘法口诀表-python 99乘法口诀表
- python比java简单好学-是不是Python比Java更容易学,更容易就业?
- python编程爱心-用python 打印出爱心
- python小项目实例流程-公司内项目对接钉钉审批流程(python)
- 搞定Linux只要半年
- SPOJ Substring Problem(Rabin Karp TLE)
- zh-cn 与 zh-hans 是什么关系、有什么区别
- hdoj5317【素数预处理】