__destruct вызывается дважды в CodeIgniter

Во-первых: я уже рассмотрел все вопросы, которые могу найти о __destruct () и CodeIgniter, и, похоже, ни один из них не решает ту же проблему, что и я.

Правильно. Это в сторону. Сначала я покажу код, так как после прочтения проблема станет более понятной. (НБ .: какой-то код отредактирован, но ничего важного для вопроса. Billing::index функция, однако, содержит только один пробел в производстве, а также здесь)


приложение / ядро ​​/ MY_Controller.php

class MY_Controller extends CI_Controller{
public $view = '';
public $data = array();
public $template = '';

function __destruct(){
if(!is_null($this->template) && ($this->template == '')){
$this->template = 'public';
}

if($this->view == ''){
$this->view = $this->uri->segment(1,'index').'/'.$this->uri->segment(2,'index');
}

if(!is_null($this->template)){
echo $this->load->view('templates/'.$this->template.'/top',$this->data,true);
}
echo $this->load->view('views/'.$this->view,$this->data,true);
if(!is_null($this->template)){
echo $this->load->view('templates/'.$this->template.'/bottom',$this->data,true);
}
}
}

class MY_ProtectedController extends MY_Controller{
function __destruct(){
parent::__destruct();
}
}

приложение / контроллеры / billing.php

class Billing extends MY_ProtectedController{
public function index(){ }
}

Это отлично загружается. Основная страница «биллинга» — это просто HTML, поэтому деструктор запускает правильный шаблон и вид.

Тем не менее, я хотел бы удалить лишнюю public function index(){ }, поскольку это действительно ничего не делает.

Так что, если я удалю это из application/controllers/billing.php так что это просто

class Billing extends MY_ProtectedController{ }

и посетить /billingЯ получаю вывод, который хочу, однако я получаю дважды.

Если я сделаю тестовое эхо, MY_ProtectedController::__destruct() называется один раз, но MY_Controller::__destruct называется дважды.

Мой вопрос: почему это так и можно ли это остановить?

Я не очень знаком с ядром CI и считаю, что к тому времени, когда я буду копать достаточно далеко, чтобы найти экземпляр контроллера, кто-то здесь, вероятно, уже получил ответ. Конечно, обновлю это, если мое собственное копание повернется.

0

Решение

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

Если я добавлю некоторый код в мой маршрут 404, чтобы предотвратить запуск авто-деструктора, я получу только один набор выходных данных.

class Index extends MY_PublicController {
public function not_found(){
$this->cancel_destruct = TRUE;
}
}

 

class MY_Controller extends CI_Controller{
$this->cancel_destruct = FALSE;
function __destruct(){
if(!$this->cancel_destruct){
[...]
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]