Мне нужно использовать функцию в нескольких контроллерах. Поэтому я, хотя об использовании пользовательского помощника, но, похоже, я не могу заставить его работать. (Он работает в представлении, но мне он нужен в контроллере)
Это дает мне следующую фатальную ошибку:
Неустранимая ошибка: вызов неопределенного метода. Разработчики :: 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 не существует, и помощник не загружается.