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确实下了很多功夫,那么今天的教程就到这里了,也希望大家能多多尝试不要偷懒哦!

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

Phalcon技术交流:364520707 PhalCon中文社区:287484785 欢迎大家的加入!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏岑玉海

hadoop 参数

看《Hadoop:权威指南》的时候收集了书上写的一些需要优化的参数,记录了一下子,给大家分享一下吧。 1.mapred.task.timeout ...

38840
来自专栏ytkah

dedecms自增标签[field:global.autoindex/]的运用

  用bootstrap建站时用到幻灯片切换模块,里面有个active(下面代码中的data-slide-to="0"),其余的按顺序递增(1,2),如果用de...

35940
来自专栏Golang语言社区

Goroutine(协程)为何能处理大并发?

简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。 进程、线程、协程的关系和区别: 进程拥有自己独立的堆和栈,既不共享堆,亦不共享...

34960
来自专栏飞雪无情的博客

Go语言实战笔记(一)| Go包管理

这本是In Action系列的书籍,这个系列做研发的都知道,在研发届评价很多,很多新的技术、语言等都会有一本实战的书籍。既然是实战,那么这本书假设了他的读者有了...

13330
来自专栏马洪彪

spss C# 二次开发 学习笔记(六)——Spss统计结果的输出

Spss的二次开发可以很简单,实例化一个对象,然后启用服务,接着提交命令,最后停止服务。 其中重点为提交命令,针对各种统计功能需求,以及被统计分析的数据内容等,...

35950
来自专栏Java进阶架构师

手把手带你实现JDK动态代理

业务接口Interface、业务实现类target、业务处理类Handler、JVM在内存中生成的动态代理类$Proxy0

8420
来自专栏极乐技术社区

微信小程序开发日记:重要的var that=this

什么是微信小程序 关于什么是微信小程序在网络上已经有很多文章介绍,这里就不再阐述了。简单来说微信小程序应该是嵌套在微信里面的应用,这个应用体现“用完即走”的理念...

353100
来自专栏xingoo, 一个梦想做发明家的程序员

图解NodeJS【基于事件、回调的单线程高性能服务器】原理

刚开始了解Node感觉很吊,各种说高性能,可是一直不理解为什么单线程会比多线程快?为什么异步IO比非阻塞IO快?因此,本篇在阅读相关书籍后,根据自己的理解,整...

21070
来自专栏java一日一条

40+个对初学者非常有用的PHP技巧(二)

考虑使用ob_gzhandler?不,别这样做。它没有任何意义。PHP应该是来写应用程序的。不要担心PHP中有关如何优化在服务器和浏览器之间传输的数据。

10210
来自专栏张尧博客

10个有用的”ls”命令面试问题(2)

36180

扫码关注云+社区

领取腾讯云代金券