phalcon-入门篇6(控制器)

#phalcon-入门篇6(控制器)#php

本教程基于phalcon2.0.9版本git

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

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

注:笔者水平有限,说的不正确的地方但愿你们多多指正,一同交流技术框架

附上:函数

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

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

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

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

##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 欢迎你们的加入!

相关文章
相关标签/搜索