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 マニュアルで説明されています。

于 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 に答える