phalcon-入门篇6(控制器)

phalcon-入门篇6(控制器)

本教程基于phalcon2.0.9版本

前言

先在这里感谢各位phalcon技术爱好者,我们提供这样一个优秀的交流平台

废话不多说今天我们就开门见山的来讲一讲phalcon的控制器,控制器是MVC中的C层,也是业务逻辑处理相当重要的一个环节,它衔接了数据处理以及界面展示,phalcon的控制器为我们提供了非常丰富的函数方法,那么今天就来初步了解一下phalcon控制器的一系列基本使用知识!

注:笔者水平有限,说的不正确的地方希望大家多多指正,一同交流技术

附上:

喵了个咪的博客:http://w-blog.cn

教程代码库:http://git.oschina.net/wenzhenxi/Phalcon-tutorial

phalcon官网地址:https://phalconphp.com

phalcon中文社区:http://www.iphalcon.cn/

1. 参数,转发,依赖注入

说道控制器只要是使用过任何一个MVC框架的童鞋都不会陌生,控制器是处理业务逻辑的地方使用也是非常广泛的,在之前的教程Helloword里面我们简单的使用控制器打印了一段话,接下来简单来看看phalcon控制器为我们带来的其他有意思的功能,我们先做准备工作我们先建立一个名为ControllerController的控制器文件如下:

use Phalcon\Mvc\Controller;

// 控制器类 必须继承Controller
class ControllerController extends Controller {
}

1.1 参数

说道参数有人会问题了,上一篇不是讲了怎么获取请求参数吗?这里的参数是什么呢?

其实这里讲的参数是phalcon提供的一种特殊获取请求参数的方式我们在ControllerController中建立indexAction方法如下:

public function indexAction($Username, $Passwd, $email = 'test@test.com') {

    echo $Username . '</br>';
    echo $Passwd . '</br>';
    echo $email;
    echo '<h1>Controller/index!</h1>';
}

大家可以看到这个Action需要三个参数,这三个参数那里来呢?我们试着访问一下如下连接:

http://phalcon.w-blog.cn/phalcon/Controller/index/phalcon/passphalcon

结果如下:

机制的童鞋一定已经看懂了规则是这样的:

直接匹配http://地址/模块名/方法名/参数1/参数2为第一个和第二个变量,第三个为默认值演示

注意:当请求是没有传递参数1和参数2则会引起报错

1.2 转发

说道转发可能有这样一个场景,一个管理员用户请求了过来但是这个用户并没有使用这个业务的权限,我们需要让用户看到无权限提示,其实在前面介绍返回的时候已经可以使用返回的重定向跳转到无权限提示页面,或者可以使用如下方式:

public function index2Action() {

    $this->flash->error("当前用户尚无访问权限!");

    // 跳转到指定的控制器和方法
    $this->dispatcher->forward(array(
        "controller" => "Controller",
        "action"     => "index"
    ));

    echo '<h1>Controller/index2!</h1>';
}

大家试着访问一下如下地址:

http://phalcon.w-blog.cn/phalcon/Controller/index2/phalcon/passphalcon

结果如下:

大家会发现几个问题:

  1. 请求地址并没有改变,并不是跳转而是在原有index2Action执行了indexAction的内容
  2. 在转发之后剩下的语句也被执行了echo
  3. 请求中index2之后带有phalcon/passphalcon两个参数

注意1:通过转发之后本方法内的代码依然会被执行建议在转发之后直接return不然后面的代码会继续执行

注意2:当转发到indexAction需要传递参数1和参数2的方法如果index2访问的时候没有传递参数1和参数2则会引起转发之后的报错

1.3 依赖注入

在之前我们并没有介绍过依赖注入,但是我们确确实实已经开始使用了,在index.php中我们做了两件事情:

// 创建一个DI实例
$di = new FactoryDefault();

//初始化session
$di->setShared('session', function () {

    $session = new Session();
    $session->start();
    return $session;
});

DI就是我们所说的依赖注入,但是在这里并不打算仔细讲解会在后续教程单独开放一个章节来细细讲解

大家可以看到我们已经在di实例中注册了session也在index.php中体验过了但是我们怎么在控制器中去使用session呢我们看如下方法:

public function index3Action() {

    $this->session->set('phalcon', 'test');                            // 以和服务相同名字的类属性访问

    echo $this->di->getsession()->get('phalcon') . '</br>';            // 另一种方式:使用魔法getter来访问
    echo $this->di->get('session')->get('phalcon') . '</br>';          // 通过DI访问服务
    echo $this->di['session']->get('phalcon') . '</br>';               // 使用数组下标
    echo $this->getDI()->getsession()->get('phalcon') . '</br>';       // 通过getDI方法获取实例

    echo '<h1>Controller/index3!</h1>';
}

结果就是打印了4个test,通过以上这么多种方式我们都可以获得DI实例并且从DI实例里面取出我们想要使用的资源

2. 流程函数,钩子函数

在很多特定的时候我们需要验证权限啊或者是在返回的时候进行特殊的处理,我们当然不会在每一个控制器的方法中反复的重写,普遍的做法是写一个公用的方法然后大家都去请求它完成相应的操作,phalcon也提供很很多意义上的流程函数和钩子函数,来方便我们做不同的处理

2.1 流程函数

流程函数有两个一个是onConstruct一个是initialize我们先来看一下官方的解释

onConstruct:紧接着创建控制器对象的后面执行一些初始化的逻辑

initialize:初始化的函数,它会最先执行,并优于任何控制器的其他action。

注意:即使待执行的action在控制器不存在“onConstruct”都会被执行。

我们加入如下代码以便使用:

public function onConstruct() {

    echo '<h1>onConstruct!</h1>';
}

public function initialize() {

    echo '<h1>initialize!</h1>';
}

2.2 钩子函数

钩子函数顾名思义,就是在程序执行前后对程序可以执行处理,phalcon中提供两个函数beforeExecuteRouteafterExecuteRoute一样我们先看下官方解释

beforeExecuteRoute:钩子函数在控制器被找到之前执行优先级高于initialize

afterExecuteRoute:钩子函数在控制器执行完之后执行

我们加入如下代码以便使用:

public function beforeExecuteRoute($dispatcher) {

    echo '<h1>beforeExecuteRoute!</h1>';
}

public function afterExecuteRoute($dispatcher) {

    echo '<h1>afterExecuteRoute!</h1>';
}

2.3 优先级

在上面我们对流程函数,钩子函数都进行了建立,并且都有输出我们来请求一下看看他们执行的优先级

http://phalcon.w-blog.cn/phalcon/Controller/index/phalcon/passphalcon

如下:

3. 小结

今天教程讲的phalcon控制器的两块内容仅仅只是冰山一角,大家如果有使用phalcon-tools可以查看一下\Phalcon\Di\Injectable中通过$this可以获取34种实例以供使用,可以见得phalcon确实下了很多功夫,那么今天的教程就到这里了,也希望大家能多多尝试不要偷懒哦!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

时间: 2024-12-01 00:19:29

phalcon-入门篇6(控制器)的相关文章

Phalcon入门教程之控制器

原文发表于:Phalcon入门教程之控制器 控制器在MVC分层中的主要作用是处理请求与响应.Phalcon中的控制器类必须以" Controller "为后缀,action则以" Action "为后缀. " Phalcon\Mvc\Controller "是Phalcon中控制器的基类,我们写的控制器类通过继承此基类,可以调用在DI中注册的各种服务.一个简单的控制器类示例如下: namespace Marser\App\Frontend\Con

Phalcon入门教程之模型CURD(2)

原文发表于:Phalcon入门教程之模型CURD(2) 上一篇 Phalcon入门教程之模型CURD(1) 中介绍了 Phalcon 模型的 insert 和 select 操作,本篇将介绍 update 和 delete 的用法.文中所用的示例代码皆沿用上一篇的数据表,这里不在赘述. 更新记录 Phalcon 模型更新记录的示例代码如下: $articleModel = new ArticlesModel(); //先调用 findFirst() 获取一条记录,返回值是当前模型对象 $arti

Phalcon入门教程之Volt模板引擎

原文发表于:Phalcon入门教程之Volt模板引擎 volt 是Phalcon中集成的模板引擎,我们也可以更换为其他模板引擎或同时使用多个模板引擎.本文只介绍 Phalcon 自带的 volt 模板引擎. 启用Volt 和其他模板引擎一样,我们需要将 volt 模板注册到 views 组件中,并设置模板文件通用后缀名,或者直接使用标准化的后缀名 .phtml 才能正常使用: //文件路径:Marser\App\Frontend\FrontendModule.php $di->setShared

Phalcon入门教程之模型CURD(1)

原文发表于:Phalcon入门教程之模型CURD(1) 上一篇<Phalcon入门教程之模型>中介绍了数据库模型操作的一些基础功能,本篇将介绍模型的 select 和 insert 用法.由于数据库模型操作的内容比较多和细,所以本篇只是粗略的介绍基础用法,以及补充文档中没有提及的一些用法和注意点.因此,强烈建议大家在熟读文档的前提下,再阅读此篇教程. 数据表 假设数据表名为 test_articles,数据结构及记录下: mysql> select * from test_article

码农学ODL之SDN入门篇

本文作为码农学ODL系列的SDN基础入门篇,分为两部分.第一部分,主要讲述SDN是什么,改变了什么,架构是什么样的,第二部分,简要介绍如何去学习SDN. 1.什么是SDN SDN(Software Define Network) ,即为软件定义网络,可以看成网络界的操作系统.从SDN的提出至今,其内涵和外延也不断地发生变化,越来越多的人认为"可以集中控制.开放可编程和转控分离的网络"就是SDN网络,并且还延伸出软件定义计算.软件定义存储以及软件定义安全等.SDN加快了新业务引入的速度,

Phalcon入门教程之目录结构

原文发表于:Phalcon入门教程之目录结构 很多初学Phalcon的朋友,对于以Phalcon框架为基础构建的项目,应该如何组织目录结构有点摸不着头脑.比如多模块的项目中,如何共用"libs"类库和"models"目录中模型类的情况,就有很多刚接触Phalcon朋友经常在群里问这种问题. 我们在翻阅Phalcon文档的时候,会看到"教程2:INVO简介"中有一个项目结构的demo,其中总结到" Phalcon不会强求应用程序使用特定的

ASP漏洞全接触-入门篇

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入. SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果

扩展你的PHP之入门篇

1. 扩展你的php2. 扩展的3种方式3. extension dll方式的扩展4. 小结 首先注意, 以下所有的一切皆在win下进行, 使用的工具的vc++6.0.扩展你的PHPPHP以方便快速的风格迅速在web系统开发中占有了重要地位. PHP本身提供了丰富的大量的函数及功能. 长话短说. 我们看看我们如何进行扩展. 扩展的3种方式External ModulesBuilt-in ModulesThe Zend Engine3种方式的优缺点可参见PHP手册.http://www.php.n

Flash动画基础教程①入门篇

flash动画|基础教程 這個教程是本人的一些經驗之談,為了初學者的入門教程,未經本人許可請勿轉載!謝謝 Flash动画基础教程--入门篇①首先我们来说说什么是Flash? Flash是Macromedia公司出品的软件,对于Flash是什么很多的描述,大致是"交互性矢量多媒体制作软件"的意思!首先,它是一种多媒体制作软件,Flash的产品往往都是一些"有声有色"给人视觉冲击的动画.其次,Flash是以矢量图为基础的,矢量图最大的特点就是它能无限的缩放,不会因为图像