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,得到如下