codeigniter – использование помощника в контроллере не работает

Мне нужно использовать функцию в нескольких контроллерах. Поэтому я, хотя об использовании пользовательского помощника, но, похоже, я не могу заставить его работать. (Он работает в представлении, но мне он нужен в контроллере)

Это дает мне следующую фатальную ошибку:

Неустранимая ошибка: вызов неопределенного метода. Разработчики :: checkIfLoggedIn () в /application/controllers/developers.php в строке 12

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

Заранее спасибо,
отметка

РЕДАКТИРОВАТЬ:
Файл контроллера:

if (!defined('BASEPATH')) exit('No direct script access allowed'); class Developers extends CI_Controller { public function __construct() { parent::__construct() $this->load->helper('form'); $this->load->helper('url'); $this->load->helper('login'); //helper function checkIfLoggedIn($this->session->userdata('loggedIn')); } } 

Файл помощника:

 if (!defined('BASEPATH')) exit('No direct script access allowed'); if (!function_exists('checkIfLoggedIn')) { function checkIfLoggedIn($session_loggedIn) { $loggedIn = $session_loggedIn; if($loggedIn == false) { redirect('login/'); } } } 

}

В вашем контроллере вы используете его неправильно, это не метод контроллера, поэтому вы не можете использовать $this для его вызова.

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

Чтобы загрузить помощника, вы можете использовать

 $this->load->helper('name'); // name is the name of the file without extention 

В отличие от большинства других систем в CodeIgniter, помощники не записываются в объектно-ориентированном формате. Это простые, процедурные функции. Каждая вспомогательная функция выполняет одну конкретную задачу, не зависящую от других функций.

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

 $this->function_name(); 

вместо этого используйте

 function_name(); 

Например, если у вас есть вспомогательная функция в вспомогательном файле с именем myCustomHelper.php следующим образом

 function myHelper() { // code } 

то вы можете загрузить его в контроллер и вызвать его следующим образом

 $this->load->helper('myCustomHelper'); myHelper(); // call the function 

но лучше добавить помощников в конструктор, чтобы он был доступен через весь скрипт.

Обновление. Если имя вашего вспомогательного файла – login_helper.php вы можете использовать его в своем контроллере следующим образом

 $this->load->helper('login_helper'); checkIfLoggedIn($this->session->userdata('loggedIn')); 

Подробнее читайте здесь .

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

Поэтому, если вы не получите предупреждение: «Не удалось загрузить запрошенный файл», но вместо этого получите предупреждение: «Неустранимая ошибка: вызов неопределенной функции [имя_функции], вы, вероятно, используете имя файла, которое уже существует изначально.

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

По соответствующему вопросу: предостережение при установке $ this-> load в __constructor: в PHP вы должны затем явно вызвать parent :: __ construct (); в противном случае родительский конструктор больше не будет вызываться, оставив $ this-> load undefined. Вышеупомянутое решение делает это правильно, но его легко упускать из виду.

 class My extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper('url'); } 

Если вы этого не сделаете, вы получите сообщение об ошибке, что My :: $ load не существует, и помощник не загружается.