0

我在我的 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)

4

2 回答 2

1

一种可能的方法是抛出异常。由于Zend_Controller_Plugin_ErrorHandler这将自动将您重定向到 ErrorController 而无需执行任何进一步的代码。

如果您不想访问 ErrorController 而只想访问当前控制器的错误操作,您可以简单地在控制器的 init 方法中修改插件:

public function init()
{
    $plugin = Zend_Controller_Front::getInstance()->getPlugin('Zend_Controller_Plugin_ErrorHandler');
    $plugin->setErrorHandlerModule('default')
       ->setErrorHandlerController('MyController')
       ->setErrorHandlerAction('error');
}

但是当然你也可以编写自己的 ErrorHandler 插件来进行更细粒度的错误处理。这在Zend Framework Manual on Plugins中有描述

于 2012-07-22T19:48:57.687 回答
1

对于像仅针对用户请求显示“* 不存在”这样简单的事情,我更愿意将用户留在应用程序中,然后用 flashmessenger 通知打他们,然后将他们留在页面上以发出另一个请求(如果合适):

public function indexAction() {

        //get form and pass to view
        $form = new Form();

        $this->view->form = $form;

        try {
            //get form values from request object
            if ($this->getRequest()->isPost()) {
                if ($form->isValid($this->getRequest()->getPost())) {

                    $data = $form->getValues();

                   // Do some stuff
                }
            }
        } catch (Zend_Exception $e) {

            $this->_helper->flashMessenger->addMessage($e->getMessage());//add message to flashmessenger
            $this->_redirect($this->getRequest()->getRequestUri());//perform redirect to originating page so the messenger will flash
        }
    }

当存在错误用户输入的可能性时,这很简单并且效果很好。

于 2012-07-23T05:00:00.620 回答