Phalcon Micro应用notFound路由异常:子页面触发无关联处理器错误
解决Phalcon Micro所有路由指向Index处理器的问题
这个问题我之前也碰到过,其实是Phalcon Micro的路由机制和你想的有点不一样~
你以为没配置路由的话所有请求都会进notFound回调,但实际上Phalcon Micro对非根路径的请求,会默认认为匹配到了一个路由规则——只是这个规则没有绑定任何处理器,所以它会抛出Matched route doesn't have an associated handler错误,而不是走notFound。notFound只有在完全找不到任何匹配的路由时才会触发,比如请求一个完全不符合路由规则的路径(不过在没配置任何路由的情况下,根路径是默认匹配的,子路径会被当成未绑定处理器的路由)。
方法一:添加通配符路由(推荐)
最优雅的方式是直接配置一个通配符路由,让所有请求都被这个路由捕获,直接指向你的Index处理器。这样就不会触发异常,所有请求都会按预期进入处理器:
$App = new \Phalcon\Mvc\Micro; $App->setDI($DI); // 匹配所有HTTP方法的任意路径 $App->map(['GET', 'POST', 'PUT', 'DELETE'], '/{params:.+}', function() { $Index = new \Handler\Index(); $Index->handle(); }); // 保留notFound作为兜底(极端情况备用) $App->notFound(function(){ $Index = new \Handler\Index(); $Index->handle(); }); $App->handle();
这里的/{params:.+}是正则路由规则:
{params}是捕获的路径参数(如果需要在处理器里获取路径内容,可以用$this->request->get('params')).+表示匹配任意非空的路径内容,确保所有子页面请求都被这个路由覆盖
方法二:捕获特定异常(兜底方案)
如果不想修改路由配置,也可以通过捕获Phalcon抛出的特定异常来处理:
$App = new \Phalcon\Mvc\Micro; $App->setDI($DI); $App->notFound(function(){ $Index = new \Handler\Index(); $Index->handle(); }); try { $App->handle(); } catch (\Phalcon\Mvc\Micro\Exception $e) { // 精准捕获"无关联处理器"的异常 if (strpos($e->getMessage(), "Matched route doesn't have an associated handler") !== false) { $Index = new \Handler\Index(); $Index->handle(); } else { // 其他Micro异常按原有逻辑抛出 throw $e; } }
不过这种方法依赖异常捕获,不如路由配置的方式直接推荐优先用第一种方法。
内容的提问来源于stack exchange,提问作者Quasipickle
相关产品推荐
相关产品推荐

