【问题标题】:Phalcon url parameter missing but action still gets executedPhalcon url 参数丢失,但仍会执行操作
【发布时间】:2015-07-08 11:37:20
【问题描述】:

我正在使用最新的 phalcon 版本,并且我发现在缺少所需参数时很难找到有关如何使操作不执行的信息,如下所示

class TestController extends ControllerBase{

public function detailsAction($id) {
        $this->view->SetVar('theid',$id);
    }
}

当我如下访问时

http://localhost/phalcon/test/details

视图仍然被执行,但 id 丢失,当我通过

访问它时
http://localhost/phalcon/test/details/5

我得到了 5 的值。

如果缺少所需的参数,有人可以告诉我如何将其设置为“NotFound”或其他内容。而且我有很多功能都有这样的要求,所以如果在路由中有一般设置或者如果有人可以帮助我,我会非常感激。

谢谢大家

【问题讨论】:

  • 你能告诉我们你的路由配置吗?
  • 路由器是默认的。没有多余的

标签: php routing phalcon


【解决方案1】:

您可以拦截调度程序事件 beforeExecuteRoute 并对目标方法进行一些内省:

        if ($event->getType() == 'beforeExecuteRoute') {
            $cn = $dispatcher->getNamespaceName().'\\'.$dispatcher->getHandlerClass();
            $r = new ReflectionMethod($cn, $dispatcher->getActiveMethod());
            $method_params = $r->getParameters();
            $url_pars = $dispatcher->getParams();
            $pass = true;
            $i = 0;
            foreach ($method_params as $param) {
                if(!$param->isOptional() && !isset($url_pars[$i++])) {
                    $pass = false;
                }
            }
            if(!$pass) {
                return $dispatcher->forward(array('controller' => 'error', 'action' => 'route404'));
            }
            return true;
        }

这段代码用于调度服务。

当您没有为每个没有默认值的操作参数提供 GET 参数时(isOptional 在这种情况下为 false),$pass 变量设置为 false,您将被路由到 404。

这是一种情况,当然,更复杂的条件会让你进行更细粒度的控制。

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2017-04-22
    • 2020-08-06
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多