Phalcon搭建多模块框架五:扩展调度器插件组合pathinfo模式参数

phalcon在控制器中获取pathinfo模式参数或者说是路由参数有三种方法:
第一种是利用控制器方法传参的形式,如下图
这里写图片描述
第二种利用调度器获得参数,调度器获得参数有两种,一种是获得单个参数,一种是获得全部参数,如下图所示
获取单个参数
这里写图片描述
获取全部参数
这里写图片描述
第三种是利用路由服务获取,如下图所示
这里写图片描述
其实通过查看源码可以发现调度器的参数也是来源于router中的getParams()方法。
我们在app/home/controllers下创建DispatcherTestController.php控制器。

<?php
/** 
 * @desc 测试调度器 
 * @author zhaoyang 
 * @date 2018年5月7日 下午10:13:47 
 */
namespace App\Home\Controllers;

use Phalcon\Mvc\Controller;

class DispatcherTestController extends Controller {

    public function index1Action($param1, $param2, $param3, $param4) {
        var_dump($param1, $param2, $param3, $param4);
        exit;
    }

    public function index2Action() {
        echo '使用dispatcher分别获取参数:';
        var_dump($this->dispatcher->getParam(0));
        var_dump($this->dispatcher->getParam(1));
        var_dump($this->dispatcher->getParam(2));
        var_dump($this->dispatcher->getParam(3));
        echo '<hr/>使用dispatcher获取所有参数:';
        var_dump($this->dispatcher->getParams());
        echo '<hr/>使用router获取所有参数:';
        var_dump($this->router->getParams());
        exit;
    }
}

接下来分别访问index1和index2方法
这里写图片描述
这里写图片描述
可以看到参数都是单个的,现在我们想把它组合成键值对的方式,即key1/value1/key2/value2方式。在上面的例子中,我们想得到的是a=aaa,b=bbb。所以可以通过扩展调度器插件来实现。
这里写图片描述

1、打开library/plugins下的DIspatcherPlugin.php插件
添加以下代码

public function beforeDispatchLoop(Event $event, MvcDispatcher $dispatcher) {
        $params = $dispatcher->getParams();
        $newParams = [ ];
        foreach ($params as $k => $v) {
            if ($k & 1) {
                $newParams[$params[$k - 1]] = $v;
            }
        }
        $dispatcher->setParams($newParams);
    }

完整的代码:

<?php
/**
 * @desc 调度器插件
 * @author zhaoyang
 * @date 2018年5月6日 下午11:48:50
 */
namespace Library\Plugins;

use Exception;
use Phalcon\Events\Event;
use Phalcon\Mvc\User\Plugin;
use Phalcon\Dispatcher;
use Phalcon\Mvc\Dispatcher\Exception as DispatcherException;
use Phalcon\Mvc\Dispatcher as MvcDispatcher;

class DIspatcherPlugin extends Plugin {

    /**
     * @desc 处理 Not-Found 错误
     * @author zhaoyang
     * @date 2018年5月6日 下午11:49:22
     */
    public function beforeException(Event $event, MvcDispatcher $dispatcher, Exception $exception) {
        $isAjax = $this->request->isAjax();
        $notfoundConfig = $this->config->services->dispatcher->notfound;
        // 处理404异常,你可以根据自己的业务特点来处理
        if ($exception instanceof DispatcherException) {
            if ($isAjax) {
                $this->response->setStatusCode($notfoundConfig->status_code, $notfoundConfig->message)->setContent($notfoundConfig->message)->send();
                // $this->response->setJsonContent([
                // 'status' => $notfoundConfig->status_code,
                // 'message' => $notfoundConfig->message
                // ])->send();
                exit();
            }
            $dispatcher->forward([
                'namespace' => $notfoundConfig->namespace,
                'controller' => $notfoundConfig->controller,
                'action' => $notfoundConfig->action
            ]);
            return false;
        }

        // 代替控制器或者动作不存在时的路径
        switch ($exception->getCode()) {
            case Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
            case Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
                if ($isAjax) {
                    $this->response->setStatusCode($notfoundConfig->status_code, $notfoundConfig->message)->setContent($notfoundConfig->message)->send();
                    // $this->response->setJsonContent([
                    // 'status' => $notfoundConfig->status_code,
                    // 'message' => $notfoundConfig->message
                    // ])->send();
                    exit();
                }
                $dispatcher->forward([
                    'namespace' => $notfoundConfig->namespace,
                    'controller' => $notfoundConfig->controller,
                    'action' => $notfoundConfig->action
                ]);
                return false;
        }
    }

    /** 
     * @desc 组合pathinfo参数 
     * @author zhaoyang 
     * @date 2018年5月7日 下午10:27:38 
     */
    public function beforeDispatchLoop(Event $event, MvcDispatcher $dispatcher) {
        $params = $dispatcher->getParams();
        $newParams = [ ];
        foreach ($params as $k => $v) {
            if ($k & 1) {
                $newParams[$params[$k - 1]] = $v;
            }
        }
        $dispatcher->setParams($newParams);
    }
}

app/home/controllers下的DispatcherTestController.php控制器中增加index3Action方法。

public function index3Action() {
        echo '使用dispatcher分别获取参数:';
        var_dump($this->dispatcher->getParam('a'));
        var_dump($this->dispatcher->getParam('b'));
        echo '<hr/>使用dispatcher获取所有参数:';
        var_dump($this->dispatcher->getParams());
        exit;
    }

再来访问index3Action,得到如下
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值