0

ZendFrameworkのeコマースサイトを何年も運営しています。MVC構造を100%使用していませんが、サイトで新しいアップグレードを実行するなどして、「より良い」コーディング構造に向けて進歩させようとしています。最近、サイトにもいくつかの重要な変更を加えました。複数の開発者がいるため、この問題を追跡するのは少し難しいですが、私はあらゆる種類のヘルプやアドバイスを得るためにここに書いています。

以前のサイトでは、ErrorControllerを使用して、404などの問題が発生したときに「pagenotfound」ページに301リダイレクトするだけでした。これは新しいサイトでも継続されます。これはWebサイトが行うべきことではないことを認識しているため、これを変更しようとしています。つまり、404を使用している場合は適切な404コードを使用します。テストサイトでErrorControllerを更新したところ、サイトのすべてのアクションが何らかの形でErrorControllerを実行していることに気付きました。どうすればこれを知ることができますか?私の現在のテストサイトErrorControllerは次のとおりです。

<?php 
/** @see Zend_Controller_Action */ 
require_once 'Zend/Controller/Action.php'; 

class ErrorController extends Zend_Controller_Action
{  
public function errorAction()
{
    $errors = $this->_getParam('error_handler');

    switch ($errors->type) {
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $e = $this->_getParam('error_handler');
                $this->view->message = $e['exception']->getMessage();
                break;
    }
    $this->view->exception = $errors->exception;
    $this->view->request   = $errors->request;
}
}

上記のコードは現在私のテストサイトにありますが、作業ページ(Firebugの[NET]タブを表示)に移動すると、「500」サーバーエラーステータスコードが表示されます。作業ページの場合、ErrorControllerを正しくロードするべきではないため、これは驚くべきことです。ただし、そうであり、ステータスコード500(上記のデフォルトのスイッチケースから)が送信されます。

私たちのサイトもIndexControllerを使用しており、それ以上のコントローラーは使用していません。すべてのアクションはIndexController内にあります。次のような特別なPagesActionがあります。

public function pagesAction() 
{
    $this->view->placeholder('errors')->captureStart();
    //proceed as normal
    if ($this->checkSiteCode()) { //this will be false if we are not on the correct site code (ignore this)
        $this->view->this_includefile = "pages/view";
        $this->getControllerIncludeFile($this->view->this_includefile); //include some special include file for our work
    }
    $this->view->placeholder('errors')->captureEnd();
} 

上記のブートストラップのデフォルトアクション。たとえば、www.mydomain.com /stores /にアクセスすると、上記のpagesAction()が呼び出され、データベース(CMS)に「ストア」が存在するかどうかが確認され、コンテンツが適切に読み込まれます。 。コンテンツは正常に読み込まれていますが、エラー500はまだ存在しています(テストサイト上)。したがって、私の質問は次のとおりです。

  1. 以前は古いサイト(別のテストドメインを介してアクセスできます)では、この問題は発生しません。したがって、ブートストラップ構成または別のコアファイルの変更により、新しいサイトでこれが発生しました。これは私たちにとって新しい問題であり、私はどこを見ればよいかを見つけようとしています。何か案は?ただし、ブートストラップに「errorcontroller」への参照はありません。上記のエラーのプレースホルダーは、何らかの理由で見たいPHPコントローラーエラーを非表示にするレイアウト(新しいサイトの新規)を使用しているために使用されます。したがって、ビューから印刷するために「エラー」プレースホルダーに保存します。これは別のポイントですが、以前のサイトではこれを行わなかったため、おそらく注目に値します。また、現在比較している古いサイトと新しいサイトの間には、いくつかのブートストラップの変更があります。

  2. ここでの主な目的は、データベースで特定のURLが見つからない場合に404​​をスローするようにpagesActionを更新することです(別のCMS管理ページである「pagenotfound」にリダイレクトされません。つまり、www.mydomain.com /pagenotfound/は通常です。ページ)。基本的に、pagesActionが特定のURLが存在しないことを認識したときに、エラーコントローラーが実際に呼び出されるようにコーディングする方法を尋ねています。上記の問題1が解決したら、この問題を解決して、ErrorControllerが必要な場合にのみロードできるようにする必要があります。

アップデート

bootstrap.phpの次のコードを削除すると、ErrorControllerと501エラーが読み込まれなくなることがわかりました。

$acl = new Zend_Acl();
$registry = Zend_Registry::getInstance();
$registry->set('acl', $acl);  // store whole ACL definition to registry for use in AuthPlugin plugin

ただし、上記では$ Registryを完全に無効にしているため、$ Registryにアクセスするコードが他にもあるため、実際に問題を引き起こしている行を探しています。この投稿は最新の状態に保ちますが、上記の問題1と2に関するサポートをいただければ幸いです。

4

1 に答える 1

2

あなたが正しいです。欲求不満も同じです(私はその気持ちを知っています、仲間!)

とにかく、 Zend_Http *を使用して、どのタイプのエラーがどこに発生するかを定義できます。

ご覧のとおり、ErrorControllerを調整して、HTTPステータスコードを「SET」しました。これにより、ページの「ヘッダー」情報も変更されます。例、最初の微調整。ルート/コントローラー/アクションが見つからない場合はチェックしています。404を設定し、インシデントをログに記録して、スクリプトをレンダリングします。

class ErrorController extends Zend_Controller_Action {

  public function errorAction() {
    $errors = $this->_getParam('error_handler');

    if (!$errors || !$errors instanceof ArrayObject) {
      $this->view->message = 'You have reached the error page';
      return;
    }

    switch ($errors->type) {
      case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
      case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
      case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
        // 404 error -- controller or action not found
        $this->getResponse()->setHttpResponseCode(404);
        $priority = Zend_Log::NOTICE;
        $this->view->error_code = $this->getResponse()->getHttpResponseCode();
        $this->view->message = "Page Not Found";
        $this->renderScript('error/error_404.phtml');
        break;
      default:
        // application error
        print_r($this->getResponse());
        $this->getResponse()->setHttpResponseCode(500);
        $priority = Zend_Log::CRIT;
        $this->view->error_code = $this->getResponse()->getHttpResponseCode();
        $this->view->message = 'Application error';
        if ($log = $this->getLog()) {
        $log->log($this->view->message, $priority, $errors->exception);
        $log->log('Request Parameters', $priority, $errors->request->getParams());
        $this->renderScript('error/error_500.phtml');
        }

    // conditionally display exceptions
        if ($this->getInvokeArg('displayExceptions') == true) {
                $this->view->exception = $errors->exception;
        }

        $this->view->request = $errors->request;
        $this->view->error_code = $this->getResponse()->getHttpResponseCode();
        $this->renderScript('error/error_500.phtml');
        break;
    }

    // Log exception, if logger available
    if ($log = $this->getLog()) {
      $log->log($this->view->message, $priority, $errors->exception);
      $log->log('Request Parameters', $priority, $errors->request->getParams());
    }

    // conditionally display exceptions
    if ($this->getInvokeArg('displayExceptions') == true) {
      $this->view->exception = $errors->exception;
    }

    $this->view->request = $errors->request;
  }

  public function getLog() {
    $bootstrap = $this->getInvokeArg('bootstrap');
    if (!$bootstrap->hasResource('Log')) {
      return false;
    }
    $log = $bootstrap->getResource('Log');
    return $log;
  }

}

これを使って :) :)

人生を楽しむ!

ハッピーコーディング!:)

于 2012-08-31T07:01:14.217 に答える