Во-первых: я уже рассмотрел все вопросы, которые могу найти о __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 и считаю, что к тому времени, когда я буду копать достаточно далеко, чтобы найти экземпляр контроллера, кто-то здесь, вероятно, уже получил ответ. Конечно, обновлю это, если мое собственное копание повернется.
В итоге решение оказалось довольно простым, но кредит для определения этого достается одному из наших других программистов.
Если я добавлю некоторый код в мой маршрут 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){
[...]
}
}
}
Других решений пока нет …