Подтвердить что ты не робот

PHP/codeigniter - использование exit()

У меня есть несколько страниц, требующих входа в систему, поэтому все контроллеры, которые ссылаются на эти страницы, начинаются с

$this->checkSession();
//...rest of the code

CheckSession должен проверить, что сеанс все еще жив, иначе отобразится сообщение и остановит выполнение остальной части кода в контроллере:

function checkSession()
{
    if (!$this->session->userdata('is_logged_in'))
    {
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        exit();
    }
}

. Я ожидал, что эти инструкции будут выполняться последовательно, но я получаю только пустую страницу. Как я могу убедиться, что exit() запускается только после загрузки всех просмотров?

4b9b3361

Ответ 1

В этом случае вы не должны использовать exit, что делать, если сеанс недействителен, перенаправляет ваше приложение с помощью примера:

redirect('/init/login/','refresh');

Ответ 2

В этом случае Педро прав. Если они не вошли в систему, просто переадресуйте их, это даже лучше, если вы можете использовать Public/Admin с именем базовые контроллеры, чтобы остановить выполнение этого в каждый отдельный защищенный файл.

В общем случае, если вы используете exit(), он остановит работу библиотеки Output. Если вы просто хотите остановить текущий контроллер от выполнения, но разрешить вывод контроллера, вы можете использовать возврат точно так же.

function checkSession()
{
    return (bool) $this->session->userdata('is_logged_in');
}

Тогда просто:

if(!$this->checkSession())
{
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        return;
}

exit() должен использоваться только когда вы действительно хотите мгновенную смерть выполнения вашего приложения для отладки, сообщения об ошибках и т.д.

Ответ 3

У меня была аналогичная проблема. Где я хотел остановить пользователя из-за отсутствия входа в систему. Но я хотел предложить список ссылок для них, а не просто перенаправить их на страницу входа. Я использую CI версии 1.7.2, а функции $this → _ output() $this- > display → _ output() и $this- > output → _ display() не работают для меня. Однако мне нужно было получить результаты с помощью функции $this- > output- > get_output().

        $this->load->vars($data);
        $this->load->view('template');
        die($this->output->get_output());

Ответ 4

$this->output->_display();
exit(); 

Правильный ответ! Спасибо Сэму Сённтеру... Он скрыт в комментариях, поэтому я подумал, что я перейду.

Ответ 5

Я недостаточно знаю о рабочем процессе codeigniter, но мне кажется, что вы хотите перенаправить на страницу входа, а не пытаться ее отобразить. Очевидно, ни один из приведенных вами кодов не отправляет шаблон в браузер к моменту появления exit().

Ответ 6

exit() отключает ваш скрипт, и фактическая функция _output() контроллера никогда не вызывается. Что вам нужно сделать, так это добавить действие в один из ваших контроллеров, например, экран входа пользователя и перенаправить туда. Вы можете использовать функцию flashdata из сеанса - http://codeigniter.com/user_guide/libraries/sessions.html, чтобы передать свое сообщение, а затем поймать его в своем представлении и отобразить его.

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

function checkSession()
{
    if (!$this->session->userdata('is_logged_in'))
    {
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        $this->_output();
        exit();
    }
}

Ответ 7

Фактически в новейшей функции CI для вызова класса вывода вручную

$this->display->_output();

и не волнуйтесь - он обрабатывает кеширование, содержимое также будет правильно загружено, если вы установите так в config

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

Ответ 8

Поместите код в переменную и запишите его.

$html = $this->load->view('template',null,true);
echo $html;
exit();