摘要:控制器使用控制器是控制器中用于处理请求的方法。控制器名称以结尾,名称以结尾。控制器如果继承基类,便可以访问应用中的各种服务。初始化控制器提供了方法,它在所有方法被执行前执行,不建议使用构造方法。
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将负责处理该请求。控制器可以通过PhalconLoader加载,因此控制器存放在应用中什么地方,并没有强制要求,可以根据需求自由的组织控制器。
控制器名称以Controller结尾,Actions名称以Action结尾。
额外的URI参数被定义为Action的参数,可以通过局部变量访问它们。控制器如果继承基类PhalconMvcController,便可以访问应用中的各种服务。
没有默认值的参数被视为必选参数,可以像PHP那样为参数设定默认值:
参数按照它们在路由中传递的顺序进行分配,可以通过参数名称获取任意参数:
dispatcher->getParam("year"); $postTitle = $this->dispatcher->getParam("postTitle"); } }调度循环(Dispatch Loop)调度循环在调度器中运行,直到没有剩余操作需要执行。上例中,只有一个动作被执行。forward()方法在调度循环中提供更复杂的操作流,可以将操作转发给其他控制器 / 方法。
flash->error( "You don"t have permission to access this area" ); // 转发给另一个方法 $this->dispatcher->forward( [ "controller" => "users", "action" => "signin", ] ); } }如果用户没有访问某个方法的权限,则将用户转发到UsersController控制器的signin方法。
初始化控制器(Initializing Controllers)PhalconMvcController提供了initialize()方法,它在所有方法被执行前执行,不建议使用构造方法__construct()。
settings = [ "mySetting" => "value", ]; } public function saveAction() { if ($this->settings["mySetting"] === "value") { // ... } } }只有当beforeExecuteRoute事件成功执行时,initialize()方法才被调用,避免了初始化方法中的应用逻辑无法在未授权的情况下执行。
如果想在构造控制器对象之后执行初始化逻辑,可以实现onConstruct()方法:
注意,即使被调用的方法不存在于控制器中,或者用户无权访问(根据开发者定义的权限控制)该方法,onConstruct()方法仍会被执行。
注入服务(Injecting Services)继承了PhalconMvcController的控制器,可以访问应用中的服务容器。例如,如果注册了这样的服务:
set( "storage", function () { return new Storage( "/some/directory" ); }, true );可以通过多种方式访问该服务:
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服务包含一个PhalocnHttpRequest实例,response服务包含一个PhalconHttpResponse实例,表示将要发送给客户端的内容。
request->isPost()) { // 获取POST数据 $customerName = $this->request->getPost("name"); $customerBorn = $this->request->getPost("born"); } } }响应对象通常不是直接被使用,而是在方法执行前构建。有时,比如afterDispatch事件中,直接访问响应对象很有用:
response->setStatusCode(404, "Not Found"); } }Session数据(Session Data)Session能够在请求之间维持持久的数据,可以从任何控制器中访问PhalconSessionBag来封装需要持久化的数据:
persistent->name = "Micheal"; } public function welcomeAction() { echo "Welcome, ", $this->persistent->name; } }服务充当控制器(Using Services as Controller)服务可以充当控制器,控制器总是从服务容器中请求。因此,以类名称注册的任何服务,都可以充当控制器角色:
set( "IndexController", function () { $component = new Component(); return $component; } ); // 带命名空间的控制器 $di->set( "BackendControllersIndexController", function () { $component = new Component(); return $component; } );控制器事件(Events in Controllers)控制器自动监听调度事件,实现与事件名称同名的方法,可以在操作执行之前 / 之后实现钩子:
getActionName() === "save") { $this->flash->error( "You don"t have permission to save posts" ); $this->dispatcher->forward( [ "controller" => "home", "action" => "index", ] ); } } public function afterExecuteRoute($dispatcher) { // 在所有动作之后执行 } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/29659.html
摘要:原文发表于入门教程之目录结构很多初学的朋友,对于以框架为基础构建的项目,应该如何组织目录结构有点摸不着头脑。只需要通过注册这些目录结构,即可正常使用。 原文发表于:Phalcon入门教程之目录结构 很多初学Phalcon的朋友,对于以Phalcon框架为基础构建的项目,应该如何组织目录结构有点摸不着头脑。比如多模块的项目中,如何共用libs类库和models目录中模型类的情况,就有很...
摘要:本文描述了框架中数据库操作方法,主要讨论框架的组件中的操作方法。属性方法在框架中支持属性的扩展查询,在上例中,可以把条件语句改为同时省略查询条件结果不变。 本文描述了PHP-Phalcon框架中数据库操作方法,主要讨论Phalcon框架的Model组件中的操作方法。更详细的Model介绍请参考:官方文档 1. 连接数据库 在Phalcon框架中,通过在DI中注入db参数来实现数据库的...
摘要:一般至少要在执行路由前要判断用户是否具有权限一般在中,所以应该在它之前获得填充。以下代码可参考这里的方法就是重点。参考这里把对象保存在中。 showImg(https://segmentfault.com/img/bVkdih); 使用如下图解释这个组件: showImg(https://segmentfault.com/img/bVkdii); 实际最终真正要使用的是access_l...
摘要:后端开发的疑惑后端开发最常面对的一个问题性能高并发等等。而到了时代,在方面有了前后端分离概念移动后端更是无力渲染天然前后端分离。 先来上一张前端页面的效果图(Vue + Vux + Vuex + Vue-Router)。showImg(https://segmentfault.com/img/remote/1460000010207850); 第一次做gif 没什么经验,太大了。加载...
本文将记录我在Phalcon开发过程中遇到的问题,以及如何如何解决。 本文首发在我的博客,我更新之后会更新过来;如果想查看最新的,可以到我的博客:Phalcon填坑手册:开发中会遇到的问题和解决方案(不断更新) 1. 正确地在控制器中获取参数 一般情况下,GET/POST请求获取参数: $this->request->get(参数名); $this->request->getPost(参数名) 路...
阅读 1262·2021-09-22 15:09
阅读 2589·2021-08-20 09:38
阅读 2385·2021-08-03 14:03
阅读 841·2019-08-30 15:55
阅读 3353·2019-08-30 12:59
阅读 3531·2019-08-26 13:48
阅读 1868·2019-08-26 11:40
阅读 612·2019-08-26 10:30