PHP MVC 404/错误URL的错误处理

PHP MVC 404/错误URL的错误处理,php,model-view-controller,error-handling,Php,Model View Controller,Error Handling,我正在尝试用PHP构建一个自定义MVC框架。我只是从MVC和框架开始,我不是很好 我创造了所有一般的东西。模型库、控制器库和视图库,我启动并运行了一个通用应用程序 现在我想合并一些错误处理。主要是在用户端,用于错误的URL。我想使网页找不到或404错误。所以我需要一种方法来检查坏的控制器、操作和查询字符串。然后将用户发送到404页面 在MVC环境中这样做的最佳实践是什么 编辑 这是一个基于学习的项目,不用于生产。您可以使用.htaccess(如果使用apache)将所有请求路由到索引页。通常,控

我正在尝试用PHP构建一个自定义MVC框架。我只是从MVC和框架开始,我不是很好

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

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

在MVC环境中这样做的最佳实践是什么

编辑


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

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

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

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

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


谈到这个问题。首先编写一个用于管理404的自定义异常处理程序。我建议在你的system/core类中调用它们,在那里你可以创建控制器的对象并调用操作,如果它们不存在的话。

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

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

if ( RoutingManager::RouterExists($route) )
{
   $router = RoutingManager::GetRouter($route);

   if ( !$router->IsValid )
      RoutingManager::RedirectTo404();
}

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

if ( RoutingManager::RouterExists($route) )
{
   $router = RoutingManager::GetRouter($route);

   if ( !$router->IsValid )
      RoutingManager::RedirectTo404();
}
其思想是将404处理程序定位到一个类中,并将路由任务委托到不同的类中,以允许各种路由器,并使您的应用程序更加可变(可伸缩)


希望我能帮忙

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

例如,我有:

public function error(){        
         $this->view->msg = 'Page not found';      
         $this->view->render('error/index');       
}
在引导中添加方法的检查。位置取决于你的结构。如果找不到该方法或控制器,请调用error()方法


这可能是最简单的方法。

您是否使用单个控制器将请求路由到其他控制器?如果你是,你可以简单地检查文件是否存在,如果它没有发送给你的默认错误控制器我有类似的东西。我有一个路由文件,它读取url并将其分解为控制器和操作。然后检查控制器文件是否存在以及该控件中的操作是否存在。如果不是,它将设置一个404控制器和我创建的操作。现在,我还必须处理URL后面的查询字符串,该字符串是否主要由我的模型处理?当您说自定义异常处理程序时,我会检查URL中传递的控制器和/或操作是否存在?您不会检查异常处理程序中是否存在控制器/操作。它将从一些路由类中完成。在该路由类中,如果不存在异常,您将抛出异常。希望这有意义。