Подтвердить что ты не робот

Codeigniter: вызов метода одного контроллера из другого

У меня есть два контроллера a и b.

Я хотел бы вызвать метод контроллера a из метода контроллера b.

Может ли кто-нибудь помочь объяснить, как я могу этого добиться?

4b9b3361

Ответ 1

Это не поддерживается поведение системы MVC. Если вы хотите выполнить действие другого контроллера, вы просто перенаправляете пользователя на нужную вам страницу (т.е. Функцию контроллера, которая потребляет URL-адрес).

Если вам нужна общая функциональность, вы должны создать библиотеку, которая будет использоваться в двух разных контроллерах.

Я могу только предположить, что вы хотите создать свой сайт немного модульным. (I.e. повторно использовать вывод одного метода контроллера в других методах контроллера.) Там есть некоторые плагины/расширения для 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();
 }
}

Ответ 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

Вы должны создать вспомогательную или библиотеку, которая может быть загружена, чтобы контроллер мог совместно использовать функции.

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

Ответ 5

Я согласен, что способ сделать это - перенаправить на новый контроллер в обычных случаях.

Я столкнулся с прецедентом, когда мне нужно было отобразить одну и ту же страницу для двух разных пользователей (бэкэнд-пользователь просматривал страницу внешнего пользователя), поэтому, на мой взгляд, мне было нужно по-настоящему вызвать контроллер frontend из backend controller.

Я решил проблему, сделав метод frontend статическим и обернув его другим методом. Надеюсь, это поможет!

//==========
// 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);
}

Ответ 6

Вы можете сделать как

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

Замените [ADDRESS TO CONTROLLER FUNCTION] тем, как мы используем в site_url();

Вам нужно echo output в функции контроллера вместо return.

Ответ 7

Вы можете использовать функцию redirect(). Как этот

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

Ответ 8

Недавно я опубликовал несколько схожий вопрос, но в отношении модели на CI.

Возврат двух отдельных результатов запроса в функции модели

Хотя ваш вопрос не совсем то же самое, я считаю, что решение следует тому же принципу: если вы предлагаете делать то, о чем вы говорите в своем вопросе, может быть что-то не так в том, как вы кодируете и какой-то рефакторинг может быть в порядке.

Принять домашнее сообщение - это то, что вы просите, это не способ работать с MVC.

Лучшей практикой является либо использование модели для размещения функций многократного использования, либо вызов их в контроллере, который выводит данные через представление - или еще лучше - с помощью помощников или библиотек (для функций, которые могут необходимо многократно).

Ответ 9

Если вы разрабатываете свой собственный сайт, нажмите здесь