资讯专栏INFORMATION COLUMN

Phalcon控制器

Miyang / 2003人阅读

摘要:控制器使用控制器是控制器中用于处理请求的方法。控制器名称以结尾,名称以结尾。控制器如果继承基类,便可以访问应用中的各种服务。初始化控制器提供了方法,它在所有方法被执行前执行,不建议使用构造方法。

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将负责处理该请求。控制器可以通过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的朋友,对于以Phalcon框架为基础构建的项目,应该如何组织目录结构有点摸不着头脑。比如多模块的项目中,如何共用libs类库和models目录中模型类的情况,就有很...

    reclay 评论0 收藏0
  • PHP-Phalcon框架中的数据库操作

    摘要:本文描述了框架中数据库操作方法,主要讨论框架的组件中的操作方法。属性方法在框架中支持属性的扩展查询,在上例中,可以把条件语句改为同时省略查询条件结果不变。 本文描述了PHP-Phalcon框架中数据库操作方法,主要讨论Phalcon框架的Model组件中的操作方法。更详细的Model介绍请参考:官方文档 1. 连接数据库 在Phalcon框架中,通过在DI中注入db参数来实现数据库的...

    xiaotianyi 评论0 收藏0
  • PHP框架Phalcon 之 ACL

    摘要:一般至少要在执行路由前要判断用户是否具有权限一般在中,所以应该在它之前获得填充。以下代码可参考这里的方法就是重点。参考这里把对象保存在中。 showImg(https://segmentfault.com/img/bVkdih); 使用如下图解释这个组件: showImg(https://segmentfault.com/img/bVkdii); 实际最终真正要使用的是access_l...

    mikyou 评论0 收藏0
  • 后端开发者从零做一个移动应用(后端篇)

    摘要:后端开发的疑惑后端开发最常面对的一个问题性能高并发等等。而到了时代,在方面有了前后端分离概念移动后端更是无力渲染天然前后端分离。 先来上一张前端页面的效果图(Vue + Vux + Vuex + Vue-Router)。showImg(https://segmentfault.com/img/remote/1460000010207850); 第一次做gif 没什么经验,太大了。加载...

    codergarden 评论0 收藏0
  • Phalcon填坑手册:开发中会遇到的问题和解决方案(不断更新)

    本文将记录我在Phalcon开发过程中遇到的问题,以及如何如何解决。 本文首发在我的博客,我更新之后会更新过来;如果想查看最新的,可以到我的博客:Phalcon填坑手册:开发中会遇到的问题和解决方案(不断更新) 1. 正确地在控制器中获取参数 一般情况下,GET/POST请求获取参数: $this->request->get(参数名); $this->request->getPost(参数名) 路...

    sf190404 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<