У меня есть два контроллера a
и b
.
Я хотел бы вызвать метод контроллера a
из метода контроллера b
.
Может ли кто-нибудь помочь объяснить, как я могу этого добиться?
У меня есть два контроллера a
и b
.
Я хотел бы вызвать метод контроллера a
из метода контроллера b
.
Может ли кто-нибудь помочь объяснить, как я могу этого добиться?
Это не поддерживается поведение системы MVC. Если вы хотите выполнить действие другого контроллера, вы просто перенаправляете пользователя на нужную вам страницу (т.е. Функцию контроллера, которая потребляет URL-адрес).
Если вам нужна общая функциональность, вы должны создать библиотеку, которая будет использоваться в двух разных контроллерах.
Я могу только предположить, что вы хотите создать свой сайт немного модульным. (I.e. повторно использовать вывод одного метода контроллера в других методах контроллера.) Там есть некоторые плагины/расширения для CI, которые помогают вам строить подобным образом. Однако самый простой способ - использовать библиотеку для создания общих "элементов управления" (т.е. Загрузить модель, визуализировать представление в строку). Затем вы можете вернуть эту строку и передать ее на другой вид контроллера.
Вы можете загрузить в строку, добавив true
в конце вызова вида:
$string_view = $this->load->view('someview', array('data'=>'stuff'), true);
test.php
Файл контроллера:
Class Test {
function demo() {
echo "Hello";
}
}
test1.php
Файл контроллера:
Class Test1 {
function demo2() {
require('test.php');
$test = new Test();
$test->demo();
}
}
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
}
}
Вы должны создать вспомогательную или библиотеку, которая может быть загружена, чтобы контроллер мог совместно использовать функции.
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
Я согласен, что способ сделать это - перенаправить на новый контроллер в обычных случаях.
Я столкнулся с прецедентом, когда мне нужно было отобразить одну и ту же страницу для двух разных пользователей (бэкэнд-пользователь просматривал страницу внешнего пользователя), поэтому, на мой взгляд, мне было нужно по-настоящему вызвать контроллер 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);
}
Вы можете сделать как
$result= file_get_contents(site_url('[ADDRESS TO CONTROLLER FUNCTION]'));
Замените [ADDRESS TO CONTROLLER FUNCTION]
тем, как мы используем в site_url();
Вам нужно echo output
в функции контроллера вместо return
.
Вы можете использовать функцию redirect(). Как этот
class ControllerA extends CI_Controller{
public function MethodA(){
redirect("ControllerB/MethodB");
}
}
Недавно я опубликовал несколько схожий вопрос, но в отношении модели на CI.
Возврат двух отдельных результатов запроса в функции модели
Хотя ваш вопрос не совсем то же самое, я считаю, что решение следует тому же принципу: если вы предлагаете делать то, о чем вы говорите в своем вопросе, может быть что-то не так в том, как вы кодируете и какой-то рефакторинг может быть в порядке.
Принять домашнее сообщение - это то, что вы просите, это не способ работать с MVC.
Лучшей практикой является либо использование модели для размещения функций многократного использования, либо вызов их в контроллере, который выводит данные через представление - или еще лучше - с помощью помощников или библиотек (для функций, которые могут необходимо многократно).
Если вы разрабатываете свой собственный сайт, нажмите здесь