我有两个控制器'a'和'b'
我想从控制器'b'
的方法中调用控制器'a'的方法任何人都可以指导我如何实现这个目标
所有努力都表示赞赏
答案 0 :(得分:25)
这是MVC系统不支持的行为。如果要执行另一个控制器的操作,只需将用户重定向到所需的页面(即使用该URL的控制器功能)。
如果您需要常用功能,则应构建一个可在两个不同控制器中使用的库。
我只能假设你想要建立一个模块化的网站。 (即,在其他控制器方法中重用一个控制器方法的输出。)有一些CI的插件/扩展可以帮助您构建这样的。但是,最简单的方法是使用库来构建通用的“控件”(即加载模型,将视图渲染为字符串)。然后你可以返回该字符串并将其传递给另一个控制器的视图。
您可以通过在视图调用结束时添加true
来加载到字符串中:
$string_view = $this->load->view('someview', array('data'=>'stuff'), true);
答案 1 :(得分:15)
test.php
控制器文件:
Class Test {
function demo() {
echo "Hello";
}
}
test1.php
控制器文件:
Class Test1 {
function demo2() {
require('test.php');
$test = new Test();
$test->demo();
}
}
答案 2 :(得分:7)
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
}
}
答案 3 :(得分:5)
您应该创建一个可以加载的帮助器或库,以便控制器可以共享功能。
V3:https://www.codeigniter.com/user_guide/general/creating_libraries.html?highlight=library
V2:https://www.codeigniter.com/userguide2/general/creating_libraries.html
V3:https://www.codeigniter.com/user_guide/general/helpers.html?highlight=helpers
V2:https://www.codeigniter.com/userguide2/general/helpers.html
答案 4 :(得分:5)
我同意在通常情况下重定向到新控制器。
我遇到了一个用例,我需要向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 :(得分:5)
你可以这样做
$result= file_get_contents(site_url('[ADDRESS TO CONTROLLER FUNCTION]'));
按照我们在[ADDRESS TO CONTROLLER FUNCTION]
site_url();
您需要echo output
控制器功能而不是return
。
答案 6 :(得分:5)
您可以使用redirect()函数。 喜欢这个
class ControllerA extends CI_Controller{
public function MethodA(){
redirect("ControllerB/MethodB");
}
}
答案 7 :(得分:4)
前一段时间我发布了一个类似的问题,但关于CI的 模型 。
Returning two separate query results within a model function
虽然你的问题并不完全相同,但我认为解决方案遵循相同的原则:如果你提议做你在问题中提到的事情,你的编码方式和一些重构可能有些不对劲可能是有条不紊的。
带回家的消息是,当你使用MVC时,你所要求的不是你想要的。
最佳做法是使用模型来放置可重用的函数并在通过视图输出数据的控制器中调用它们 - 或者甚至更好使用帮助器或库(对于可能的函数)需要反复)。
答案 8 :(得分:0)
要扩展的控制器
require_once(PHYSICAL_BASE_URL . 'system/application/controllers/abc.php');
$report= new onlineAssessmentReport();
echo ($report->detailView());
答案 9 :(得分:-1)
您可以使用重定向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');
}
}
答案 10 :(得分:-4)
非常简单 在第一个controllr调用中
13 units
14 unit
15 unit
16 unit
17 unit
将文件MyController.php放置到/ model补丁
MyController.php应该包含
$this->load->model('MyController');
$this->MyController->test();