【问题标题】:Best way to control an object existence控制对象存在的最佳方法
【发布时间】:2025-12-24 21:15:06
【问题描述】:

在许多控制器中,我需要验证一个对象(在 URL 中传递的 ID)是否存在。

实际上每个控制器都有这个骨架:

public function my_page($id){

$object = $this->Object_model->getObject($id);

if($object == NULL){ // If id mentions a non-existant object, redirect to home
  redirect("home");
}

/** MYCONTROLLER **/
}

这是最好的方法,最干净的方法吗?

其他一些选项是帮助器/模型方法/控制器方法...我不知道 PHP 的哲学是什么。

【问题讨论】:

    标签: php codeigniter doctrine-orm


    【解决方案1】:

    不要将控制器与路由应用程序的任务混在一起。首先你路由,然后根据给定的结果实例化你的一个控制器。

    也许这个关于路由器的答案澄清了我的意思:How does MVC routing work?

    【讨论】:

    • 如果 ID 存在于 CI 路由中,我不知道如何进行控制。路由将带有 URL 的访问者发送到我的控制器,除了 URL 读取和发送到控制器之间的正则表达式之外,我不能使用任何函数或方法
    【解决方案2】:

    您的数据库查询的答案是布尔值,因此您必须检查它是否为 FALSE,而不是 NULL

    public function my_page($id){
    
      $object = $this->Object_model->getObject($id);
    
      if($object === FALSE){
        redirect("home");
      }
    
      /** MYCONTROLLER **/
    }
    

    【讨论】:

      【解决方案3】:
          if ( ! $object = $this->Object_model->getObject( $id ) ) {
              redirect( "home" ) ;       }
      

      更好的是 Object_model 总是返回一些东西,无论是否有错误。

         $object = $this->Object_model->getObject( $id ) ;
      
         if ( $object->errorFlag == true ) {
         redirect( "sorry/" . $object->errorMsg ) ; } 
      

      【讨论】:

      • 所以我应该为所有加载对象的控制器编写类似的东西吗?会很重复吗?
      • 需要查看一个用例和一些代码以做出适当的响应。