我在我的 zend 框架应用程序中一遍又一遍地使用以下代码。它用于检查action()
文章是否存在。如果没有,用户将看到一条错误消息:
$article = ArticleQuery::create()->findOneByUrl($this->_getParam('url', ''));
if (!$article) {
$this->getResponse()
->setRawHeader('HTTP/1.1 404 Not Found');
return $this->_forward('error', null, null, array(
'message' => 'Article not found',
));
}
我想知道如何将其分解为自己的方法以减少所有操作中的代码负载。
我遇到了这样的事情:
protected function myAction() {
$article = $this->getArticleIfExists($this->_getParam('url', ''));
if ($article == null) {
return;
}
}
protected function getArticleIfExists($url) {
$article = ArticleQuery::create()->findOneByUrl($this->_getParam('url', ''));
if ($article) {
return $article;
} else {
$this->getResponse()
->setRawHeader('HTTP/1.1 404 Not Found');
$this->_forward('error', null, null, array(
'message' => 'Article not found',
));
return nulL;
}
}
我仍然想摆脱中的if
情况myAction()
,但_forward()
不允许退出执行(当然,因为它仍然需要执行其他操作)。
另一种可能性(我已经在其他一些控制器中实现)是这样的:
protected function myAction() {
$article = ArticleQuery::create()->findOneByUrl($this->_getParam('url', ''));
if (!$article) {
return $this->notFound('Article does not exist');
}
}
protected function notFound($message) {
$this->getResponse()
->setRawHeader('HTTP/1.1 404 Not Found');
return $this->_forward('error', null, null, array(
'message' => $message,
));
}
我们再次if
在操作中进行了此检查。它已经比以前更好了,但我们还能做得更好吗?
我该如何规避这个?有没有可能在不丢失当前 URL 的情况下做到这一点?我Redirector
当然可以退出,但是我会丢失当前的 URL ( /controller/myaction/url/hello -> /error/error/message/Article%20not%20found
)