直截了当。
interface DispatcherInterface {
/**
* @param RouteInterface $route
* @return ResponseInterface
* @throws InvalidRouteException
*/
public function dispatch(RouteInterface $route);
}
正如您所看到的,上面的方法会抛出InvalidRouteException
,因为它会验证控制器是否存在,操作是否存在于控制器类等中。
然后我需要将内部方法设为公开:
/**
* @param RouteInterface $route
* @throws InvalidRouteException
*/
private function verifyRoute(RouteInterface $route);
所以现在我可以做的应用程序:
$route = $this->router->route( $request->getUri() );
try {
$this->dispatcher->verifyRoute($route);
// Check if the user has access to this page/controller/action
$response = $this->dispatcher->dispatch($route);
}
catch(InvalidRouteException $ex) {
// Error 404
}
由于路线已经过验证,dispatch(RouteInterface $route)
方法不再需要运行verifyRoute(RouteInterface $route)
方法,因此不会抛出InvalidRouteException
。
我希望dispatch(RouteInterface $route)
方法在API中有选项来验证提供的路由或跳过验证部分。
该方法将成为:
/**
* @param RouteInterface $route
* @param bool $verifyRoute
* @return ResponseInterface
* @throws InvalidRouteException if $verifyRoute = true
*/
public function dispatch(RouteInterface $route, $verifyRoute);
我认为我没见过像这样的东西:
@throws InvalidRouteException if $verifyRoute = true
在之前的API文档中,我有点不确定这是否是错误的编程?
如果我在Java中正确地记得一个方法要么抛出异常,要么不抛出异常,两者之间没有,所以这增加了我对我想要做的事情的怀疑。
答案 0 :(得分:1)
方法抛出异常或不抛出异常
嗯,几乎没有类似的方法;)通常,方法会根据逻辑和条件抛出异常。在您的情况下,如果verifyRoute == true 并且路由无效,则会抛出异常。我假设如果verifyRoute == true并且路由有效,则抛出异常 not 。
@throws条目表示方法可以抛出某个异常。你这么说的时候 verifyRoute == false它不会抛出该异常。但通常,您的方法可以抛出该异常。您可能希望记录verifyRoute控制方法是否验证路由,如果为false,则阻止InvalidRouteException异常。
然后,依靠调用者知道路由是否有效似乎是糟糕的设计。您应该重新处理类/接口以获得优化的性能,而无需调用者传递路由是否已知有效。