当前位置: 首页 > 后端技术 > PHP

Phalcon控制器

时间:2023-03-29 18:53:03 PHP

PhalconController使用控制器(UsingControllers)Actions是控制器中用来处理请求的方法。默认情况下,控制器中的所有公共方法都映射到Actions,并且可以通过URL访问。动作负责解释请求并创建响应,通常以视图形式呈现或通过其他方式创建。当访问像http://localhost/blog/posts/show/2015/the-post-title这样的URL时,Phalcon将解析URL的各个部分如下:Phalcon目录博客控制器posts方法show参数2015参数the-post-title在这种情况下,控制器PostsController将负责处理请求。控制器可以通过Phalcon\Loader来加载,所以对于控制器在应用程序中的存储位置没有强制要求,可以根据需要自由组织控制器。控制器名称以Controller结尾,Actions名称以Action结尾。dispatcher->getParam('year');$postTitle=$this->dispatcher->getParam('postTitle');}}调度循环(DispatchLoop)调度循环在调度器中运行,直到没有剩余的操作要执行。在上面的例子中,只执行了一个动作。forward()方法在调度循环中提供了更复杂的操作流程,可以将操作转发给其他控制器/方法。flash->error("你没有权限访问这片区域”);//转发到另一个方法$this->dispatcher->forward(['controller'=>'users','action'=>'signin',]);}}如果用户没有访问某个方法,则将用户转发到UsersController控制器的登录方法。settings=['mySetting'=>'value',];}publicfunctionsaveAction(){if($this->settings['mySetting']==='value'){//...}}}只有当beforeExecuteRoute事件执行成功后,initialize()方法才会调用,避免了应用程序在初始化方法中的逻辑不能被擅自执行。如果想在controller对象构造完成后执行初始化逻辑,可以实现onConstruct()方法:set('storage',function(){returnnewStorage('/some/directory');},真的);可以通过多种方式访问??服务:storage->保存('/一些/文件');//从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');}}请求和响应(RequestandResponse)假设框架已经预先注册了服务。请求服务包含一个Phalocn\Http\Request实例,响应服务包含一个Phalcon\Http\Response实例,代表要发送给客户端的内容。request->isPost()){//getPOST数据$customerName=$this->request->getPost('name');$customerBorn=$this->request->getPost('born');}}}response对象通常不会直接使用,而是在方法执行之前的Build中使用。有时,例如在afterDispatch事件中,直接访问响应对象是有用的:404响应头$this->response->setStatusCode(404,'NotFound');}}会话数据(SessionData)Session可以维护请求之间的持久化数据,Phalcon\Session\Bag可以从任何控制器访问,封装持久化的需要自定义数据:persistent->name='Michael';}publicfunctionwelcomeAction(){echo'Welcome,',$this->persistent->name;}}ServiceasController(UsingServicesasController)服务可以充当控制器,控制器总是从服务容器中请求。因此,任何以类名注册的服务都可以充当控制器:set('IndexController',function(){$component=newComponent();return$component;});//带有命名空间的控制器$di->set('Backend\Controllers\IndexController',function(){$component=newComponent();return$component;});controllerEvents(EventsinControllers)控制器自动监听调度事件,实现与事件名同名的方法,可以在操作前/后实现hooks:getActionName()==='save'){$this->flash->error("你没有权限保存帖子");$this->dispatcher->forward(['controller'=>'home','action'=>'index',]);}}公共函数afterExecuteRoute($dispatcher){//在所有操作之后执行}}