phalcon-入门篇6(控制器)

北慕城南 提交于 2019-12-02 00:01:53

#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 欢迎大家的加入!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!