【问题标题】:Codeigniter : calling a method of one controller from otherCodeigniter:从另一个控制器调用一个控制器的方法
【发布时间】:2011-09-23 21:48:40
【问题描述】:

我有两个控制器 ab

我想从控制器 b 的方法中调用控制器 a 的方法。

谁能帮助解释我如何实现这一目标?

【问题讨论】:

标签: codeigniter


【解决方案1】:

这是 MVC 系统不支持的行为。如果您想执行另一个控制器的操作,您只需将用户重定向到您想要的页面(即使用 url 的控制器功能)。

如果您想要通用功能,您应该构建一个库以在两个不同的控制器中使用。

我只能假设您想构建您的网站有点模块化。 (即,在其他控制器方法中重用一个控制器方法的输出。)有一些 CI 插件/扩展可以帮助您像这样构建。然而,最简单的方法是使用库来构建通用的“控件”(即加载模型,将视图呈现为字符串)。然后您可以返回该字符串并将其传递给其他控制器的视图。

您可以通过在视图调用末尾添加true 来加载到字符串中:

$string_view = $this->load->view('someview', array('data'=>'stuff'), true);

【讨论】:

    【解决方案2】:

    test.php 控制器文件:

    Class Test {
     function demo() {
      echo "Hello";
     }
    }
    

    test1.php 控制器文件:

    Class Test1 {
     function demo2() {
      require('test.php');
      $test = new Test();
      $test->demo();
     }
    }
    

    【讨论】:

    • 在代码点火器中使用这样的 require 不是一个好主意。
    • 这违背了CI的OOP的目的
    【解决方案3】:
    Very simple way in codeigniter to call a method of one controller to other controller
    
    1. Controller A 
       class A extends CI_Controller {
    
        public function __construct()
        {
            parent::__construct();
        }
        function custom_a()
        {
        }
    }
    
    2. Controller B 
    
       class B extends CI_Controller {
    
        public function __construct()
        {
            parent::__construct();
        }
        function custom_b()
        {
                require_once(APPPATH.'controllers/a.php'); //include controller
                $aObj = new a();  //create object 
                $aObj->custom_a(); //call function
        }
    }
    

    【讨论】:

      【解决方案4】:

      我同意这样做的方法是在通常情况下重定向到新控制器。

      我遇到了一个用例,我需要向 2 个不同类型的用户显示相同的页面(后端用户预览前端用户的页面),所以我认为我真正需要的是从后端控制器。

      我通过将前端方法设为静态并将其包装在另一个方法中解决了这个问题。 希望对您有所帮助!

      //==========
      // Frontend
      //==========
      function profile()
      {
         //Access check
      
         //Get profile id
         $id = get_user_id();
      
         return self::_profile($id);
      }
      
      static function _profile($id)
      {
         $CI = &get_instance();
         //Prepare page
         //Load view
      }
      
      //==========
      // Backend
      //==========
      function preview_profile($id)
      {
         $this->load->file('controllers/frontend.php', false);
      
         Frontend::_profile($id);
      }
      

      【讨论】:

        【解决方案5】:

        不久前我发布了一个类似的问题,但关于 CI 上的 模型

        Returning two separate query results within a model function

        虽然您的问题并不完全相同,但我相信解决方案遵循相同的原则:如果您提议做您在问题中提到的事情,那么您的编码方式和一些重构可能有问题可能是为了。

        带回家的信息是,在使用 MVC 时,您所要求的不是要走的路。

        最佳实践是使用模型放置可重用函数并在控制器中调用它们,该控制器通过视图输出数据 - 或者更好使用帮助程序或库(对于可能需要反复使用)。

        【讨论】:

          【解决方案6】:

          你可以这样做

          $result= file_get_contents(site_url('[ADDRESS TO CONTROLLER FUNCTION]'));
          

          按照我们在site_url();中使用的方式替换[ADDRESS TO CONTROLLER FUNCTION]

          您需要在控制器功能中使用echo output 而不是return

          【讨论】:

          • 但是如果你已经对构造函数执行了身份验证,那么我将推广一个登录页面,以便如何绕过它。
          • 为什么要发出 HTTP 请求来调用另一个类的方法?
          【解决方案7】:

          您可以使用redirect() 函数。 像这样

          class ControllerA extends CI_Controller{
              public function MethodA(){
                 redirect("ControllerB/MethodB");
              }
          }
          

          【讨论】:

          • 如果在 POST 请求上调用 methodA(),这将删除所有参数,包括其中的 POST 数据。更好的是建议接受的答案。
          【解决方案8】:

          要扩展的控制器

          require_once(PHYSICAL_BASE_URL . 'system/application/controllers/abc.php');
          
                  $report= new onlineAssessmentReport();
                  echo ($report->detailView());
          

          【讨论】:

            【解决方案9】:

            您可以使用重定向 URL 到控制器:

            Class Ctrlr1 extends CI_Controller{
            public void my_fct1(){
            redirect('Ctrlr2 /my_fct2', 'refresh');
            }
            }
            
            
            Class Ctrlr2 extends CI_Controller{
            public void my_fct2(){
            $this->load->view('view1');
            }
            }
            

            【讨论】:

            • 这看起来不太好 - OP 询问如何使用另一个控制器的单一方法
            【解决方案10】:

            非常简单 在第一个控制器调用中

             $this->load->model('MyController');
             $this->MyController->test();
            

            将文件 MyController.php 放到 /model 补丁中

            MyController.php 应该包含

            class MyController extends CI_Model {
            
                function __construct() {
                    parent::__construct();
                }
                function test()
                {
                    echo 'OK';
                }
            }
            

            【讨论】:

            • 模型与控制器不同
            猜你喜欢
            • 2020-07-18
            • 2015-09-07
            • 1970-01-01
            • 1970-01-01
            • 2016-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多