Codeigniter:从另一个控制器调用一个控制器的方法

Posted

技术标签:

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

我有两个控制器 ab

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

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

【问题讨论】:

虽然不是最好的方法,但它是模块化的:(***.com/a/6091913/1057527)[http://***.com/a/… EllisLab forum有一个相关的帖子 @machineaddict 的链接已损坏。也许修复降价? 编辑:啊,是的。这么老了。 :-( ***.com/questions/6091100/… 是正确的链接。 @Apostle 的链接现在是 404。 链接是***.com/a/6091913/1057527 【参考方案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';
    

【讨论】:

模型与控制器不同

以上是关于Codeigniter:从另一个控制器调用一个控制器的方法的主要内容,如果未能解决你的问题,请参考以下文章

哪个是安全的,使用一次 required 或在 codeigniter 的帮助程序中创建一个函数?

从另一个控制器调用控制器的功能/在控制器之间共享数据

从另一个控制器调用一个控制器的视图

目标-c:从另一个控制器调用 void 函数

iPhone - 从另一个视图控制器调用函数

如何从视图中调用 codeigniter 控制器功能