Phalcon 控制器

使用控制器(Using Controllers)

Actions是控制器中用于处理请求的方法。默认情况下,控制器中所有公共方法都映射到Actions,能够通过URL访问。Actions负责解释请求并创建响应,响应通常以视图形式呈现,或通过其他方式创建。

当访问类似http://localhost/blog/posts/show/2015/the-post-titleURL时,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控制器相关推荐

  1. phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

    制作简单的acl, dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等) ...

  2. phalcon: Profiling分析 profilter / Plugin结合,dispatcher调度控制器 监听sql执行日志

    个人觉得profilter 跟 logger 功能差不多,logger的功能在于写入,profilter功能在于sql后及时显示分析.都是对sql执行的的分析:一个是写入log文件,一个是直接在页面展 ...

  3. phalcon系列(1) hello phalcon

    2019独角兽企业重金招聘Python工程师标准>>> 接触和对比了了比较多的php框架,要说性能上,c类框架肯定比其他框架的性能要突出很多,就yaf跟phalcon而言,phalc ...

  4. linux调用php项目,在Centos/Linux系统下使用Phalcon开发PHP项目

    1.Phalcon安装 最好采取源码编译安装.这样可以体验最新的稳定版本.安装过程比较简单,下载tar.gz源码后,解压编译将 phalcon.so 加到php.ini中即可.重启php-fpm,查看 ...

  5. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...

  6. phalcon index.php,Phalcon环境搭建与项目开发

    简介 Phalcon 是开源.全功能栈.使用 C 扩展编写.针对高性能优化的 PHP 5 框架. 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来,可以直接使用. ...

  7. php高性能框架phaicon,3分钟快速入门php高性能框架Phalcon

    Phalcon 是什么,我们为啥要选择它?Phalcon 是开源.全功能栈.使用 C 扩展编写.针对高性能优化的 PHP 框架.开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类 ...

  8. php phalcon 安装,Phalcon框架安装与使用教程介绍

    Phalcon是一款php中国外非常的流程的框架了,但在国内Phalcon框架还不怎么样了,小编今天来为各位介绍Phalcon框架安装与使用教程,希望下文可以帮助到各位. linux服务器安装phal ...

  9. 在Centos/Linux系统下使用Phalcon开发PHP项目

    2019独角兽企业重金招聘Python工程师标准>>> 1.Phalcon安装 最好采取源码编译安装.这样可以体验最新的稳定版本.安装过程比较简单,下载tar.gz源码后,解压编译将 ...

最新文章

  1. 计算上月、下月、上周、下周..日期范围
  2. file control
  3. PHP返回数据json数据样式要求是对象{},而不是[]
  4. swift 可变參数
  5. django富文本编辑器
  6. ASP.NET后台调用前台JS函数的三种常见方法
  7. Hive设置参数-指定引擎-队列
  8. 为 Windows 用户准备的简明 Linux 词汇表
  9. Office在线预览及PDF在线预览的实现方式大集合
  10. 读书笔记∣元数据:用数据的数据管理你的世界 Ch.5-8
  11. (转载)mysql书籍
  12. iPhone硬件拆机解锁方法 十步!
  13. AE剪辑快捷键有哪些?这波快捷键分享拿好了
  14. 东哥带你们认清五险一金︿( ̄︶ ̄)︿
  15. 如何搭建DNS--域名系统
  16. python非线性可分支持向量机模型(实现iris分类)
  17. 学校校车运营各项安全管理制度_学校校车安全管理的规章制度
  18. Docker搭建Pikachu靶场
  19. Java8之Lambda函数式编程(一)
  20. 保利威视频播放器功能抽取,仅作为播放课程资源使用,去除多余功能

热门文章

  1. 成都python工作-成都python就业
  2. deep learning with python 中文版-Deep Learning with Python
  3. python九九乘法口诀表-python 99乘法口诀表
  4. python比java简单好学-是不是Python比Java更容易学,更容易就业?
  5. python编程爱心-用python 打印出爱心
  6. python小项目实例流程-公司内项目对接钉钉审批流程(python)
  7. 搞定Linux只要半年
  8. SPOJ Substring Problem(Rabin Karp TLE)
  9. zh-cn 与 zh-hans 是什么关系、有什么区别
  10. hdoj5317【素数预处理】