【问题标题】:PHP MVC 404/Error Handling for bad URLSPHP MVC 404/错误 URL 的错误处理
【发布时间】:2011-03-17 05:13:40
【问题描述】:

我正在尝试在 PHP 中构建自定义 MVC 框架。我刚刚开始使用这个 MVC 和框架的东西,我不是很好。

我创造了所有通用的东西。模型、控制器和视图的库,我启动并运行了一个通用应用程序。

我现在想加入一些错误处理。主要是在用户端的错误网址。我想制作页面未找到或 404 错误。所以我需要一种方法来检查坏控制器、操作和查询字符串。然后将用户发送到 404 页面。

在 MVC 环境中执行此操作的最佳做​​法是什么?

编辑

这是一个基于学习的项目,不用于生产。

【问题讨论】:

  • 您是否使用单个控制器将请求路由到其他控制器?如果是,您可以简单地检查文件是否存在,以及它是否没有将其发送到您的默认错误控制器

标签: php model-view-controller error-handling


【解决方案1】:

首先,如果您计划将其用于生产,则不建议您自行开发自定义框架。您可以使用许多出色的框架,它们具有良好的灵活性,更重要的是具有更高的性能。

解决问题。首先编写一个用于管理 404 的自定义异常处理程序。我建议在您的系统/核心类中调用它们,您可以在其中创建控制器的对象并调用操作(如果它们不存在)。

【讨论】:

  • 当您说自定义异常处理程序时,这就是我检查在 url 中传递的控制器和/或操作是否存在的地方?
  • 您不会从异常处理程序中检查控制器/操作是否存在。这将通过一些路由类来完成。在该路由类中,如果异常不存在,您将抛出异常。希望这有意义。
【解决方案2】:

在您的引导程序中添加错误处理程序。

例如,我有:

public function error(){        
         $this->view->msg = 'Page not found';      
         $this->view->render('error/index');       
}

在引导程序中添加对方法的检查。哪里取决于你的结构。如果找不到方法或控制器,请调用 error() 方法。

这可能是最简单的方法。

【讨论】:

    【解决方案3】:

    您可以使用.htaccess(如果使用 apache)将所有请求路由到您的索引页面。通常控制器(和动作)、视图与文件或函数相关联。因此,如果您想显示自定义错误消息,只需检查文件、类或其方法即可。

    例如:-index.php?controller=control1&action=action1.

    if(!file_exists('control1.php'))
        if(!method_exists($controller, 'action1'))
            //route to error handler
    

    【讨论】:

      【解决方案4】:

      好吧,如果你像你说的那样学习,你不应该将你的框架用于生产代码,因为一件事是在家里破坏应用程序,另一件事是因为愤怒的客户而赔钱:)

      回到问题。我已经为 PHP 应用程序构建了自己的自定义框架,并且我的框架中有几个路由器。这个想法是每个路由器处理一个特定的路由模式,如下所示:

      http://someapplication.org/services/awebservice/

      此代码将调用处理路由 Web 服务的 ServiceRouter。在调用任何路由器之前,我会检查路由器是否存在,如果存在,那么我会调用一个方法来检查路由是否有效,如下所示:

      if ( RoutingManager::RouterExists($route) )
      {
         $router = RoutingManager::GetRouter($route);
      
         if ( !$router->IsValid )
            RoutingManager::RedirectTo404();
      }
      

      这个想法是将你的 404 处理程序定位到一个类,并将路由任务委托给不同的类,以允许各种路由器,并使你的应用程序更具可变性(可扩展性)

      希望我能帮上忙!

      【讨论】:

      • 我有类似的东西。我有一个路由文件,它读取 url 并将其分解为控制器和操作。然后它检查控制器文件是否存在以及该控件中的操作是否存在。如果不是,它将 a 设置为我创建的 404 控制器和操作。现在我还必须处理主要由我的模型处理的 URL 之后的查询字符串?
      猜你喜欢
      • 2010-10-17
      • 2016-06-05
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多