多年来,我们一直在运行 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 仍然存在(在测试站点上)。因此我的问题是:
以前在旧站点(我们仍然可以通过另一个测试域访问)上,不会发生此问题。因此,某些东西——我们的引导配置或另一个核心文件的一些变化——导致我们的新站点上发生了这种情况。这对我们来说是一个新问题,我只是想找出在哪里寻找。有任何想法吗?但是,我在引导程序中没有看到对“errorcontroller”的任何引用。使用上面的错误占位符是因为我们正在使用一个布局(新站点的新布局),它出于某种原因隐藏了我们想要查看的任何 PHP 控制器错误。因此,我们将其存储在“错误”占位符中,以便从我们的视图中打印。这是一个单独的点,但可能值得注意,因为我们没有在旧网站上这样做。我们现在正在比较的新旧站点之间也有一些引导变化。
我们在这里的主要目标是更新 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 的任何帮助将不胜感激!