0

多年来,我们一直在运行 Zend Framework 电子商务网站。它没有 100% 使用 MVC 结构,但我们尝试将其推进到“更好”的编码结构,因为我们在网站上执行新的升级等等。最近,我们也对网站进行了一些重大更改。由于有多个开发人员,这个问题有点难以跟踪,但我写在这里是为了获得任何帮助或建议。

在我们之前的站点上,我们的 ErrorController 用于在出现问题时简单地执行 301 重定向到“pagenotfound”页面,包括 404。这在我们的新站点上继续。我们意识到这不是网站应该做的,所以我们试图改变它——即当我们在 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. 我们在这里的主要目标是更新 pagesAction 以在我们的数据库中找不到特定 URL 时抛出 404(并且不重定向到另一个 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 状态代码,它也会改变页面的“标题”信息。例如,在第一次调整中。我正在检查 Routes/Controllers/Actions 如果没有找到然后设置 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 回答