Codeigniter: вызов метода одного контроллера из другого - PullRequest
38 голосов
/ 28 июня 2011

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

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

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

Ответы [ 8 ]

25 голосов
/ 28 июня 2011

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

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

Я могу только предположить, что вы хотите сделать свой сайт немного модульным.(Т.е. повторно использовать выходные данные одного метода контроллера в других методах контроллера.) Есть несколько плагинов / расширений для CI, которые помогут вам построить таким образом.Однако самый простой способ - использовать библиотеку для создания общих «элементов управления» (т. Е. Загрузить модель, отобразить представление в строку).Затем вы можете вернуть эту строку и передать ее в представление другого контроллера.

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

$string_view = $this->load->view('someview', array('data'=>'stuff'), true);
15 голосов
/ 12 сентября 2012

test.php Файл контроллера:

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

test1.php Файл контроллера:

Class Test1 {
 function demo2() {
  require('test.php');
  $test = new Test();
  $test->demo();
 }
}
7 голосов
/ 29 июля 2014
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
    }
}
5 голосов
/ 02 февраля 2014

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

class ControllerA extends CI_Controller{
    public function MethodA(){
       redirect("ControllerB/MethodB");
    }
}
5 голосов
/ 27 мая 2013

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

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

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

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

5 голосов
/ 07 декабря 2012

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

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

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

//==========
// 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 голосов
/ 03 октября 2012

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

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 голосов
/ 28 июня 2011

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

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

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

Суть в том, что вы просите не работать в MVC.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...