PHP / codeigniter - использование exit () - PullRequest
19 голосов
/ 12 апреля 2010

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

$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 () выполняется только после загрузки всех представлений?

Ответы [ 8 ]

15 голосов
/ 12 апреля 2010

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

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

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 () следует использовать только в том случае, если вы действительно хотите немедленной смерти от выполнения приложения для отладки, отчетов об ошибках и т. Д.

14 голосов
/ 12 апреля 2010

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

redirect('/init/login/','refresh');
12 голосов
/ 02 февраля 2013

У меня была похожая проблема. Где я хотел остановить пользователя из-за отсутствия входа в систему. Но я хотел предложить список ссылок для них, а не просто перенаправить их на страницу входа. Я использую 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());
9 голосов
/ 10 октября 2013
$this->output->_display();
exit(); 

Это правильный ответ! Спасибо Сэму Сехнерту ... Он скрыт в комментариях, поэтому я решил опубликовать его снова.

2 голосов
/ 27 февраля 2012

На самом деле в новейшей функции CI для ручного вызова выходного класса

$this->display->_output();

и не беспокойтесь - он обрабатывает кеширование, контент также будет правильно сжат, если вы установите это в конфигурации

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

2 голосов
/ 12 апреля 2010

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();
    }
}
2 голосов
/ 12 апреля 2010

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

1 голос
/ 04 августа 2014

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

$html = $this->load->view('template',null,true);
echo $html;
exit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...