Как не создавать новый файл cookie при каждой загрузке страницы в CodeIgniter?

У меня были проблемы с сессиями / файлами cookie в CodeIgniter. После исследования с помощью Inspect Element я понял, что мой код создает новый файл cookie каждый раз, когда я загружаю страницу на своем веб-сайте. Я не могу, хоть убей, понять, как этого избежать / назначить пользователю только один согласованный файл cookie на сеанс.

Мои настройки сеанса таковы:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_save_path'] = BASEPATH . 'Writable/sessions/';
$config['sess_match_ip'] = True;
$config['sess_time_to_update'] = 120; 
$config['sess_regenerate_destroy'] = False;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '.myapp.com';
$config['cookie_path'] = '/';
$config['cookie_secure'] = False;
$config['cookie_httponly'] = False;

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

Тогда мой вопрос: как сделать так, чтобы файл cookie сохранялся в соответствии с индивидуальным пользователем при первом входе в систему вместо создания нового файла cookie с отсутствующими данными каждый раз, когда я загружаю страницу? Мой класс контроллера (где я инициализирую куоки) выглядит так:

BaseController.php

class BaseController extends \CodeIgniter\Controller {
// Class vars set to null
    public function __construct($request, $response, $logger = null) {
        parent::__construct($request, $response, $logger);
        error_reporting(E_ALL);
        ini_set('display_errors', 1);

        $this->db = \Config\Services::db();

        $this->RefTypes = new RefTypesModel($this);

        $this->url = new \CodeIgniter\HTTP\URI();

        // This is the problematic code
        if ($this->session == null) {
             $this->session = \Config\Services::session();
             $this->session->start();   
    }
        $this->init();
    }
}

Затем в других моих контроллерах у меня есть код, который использует сеанс следующим образом:

MyController.php

class MyController extends BaseController {
    public function login() {
        // Set data in cookie and then redirect to new page
        $this->session->set('userId', $userId);
        return redirect()->to('/dashboard');
}
    public function dashboard() {
        // This is where I run into a problem...
        $test = $this->session->get('userId');  //Returns null
        echo "<script type=\"text/javascript\">alert('$test');</script>";

}
}

По сути, поскольку PHP - это язык сценариев, каждый раз, когда я загружаю новую страницу, запускается код в BaseController.php, который затем запускает код для повторной инициализации сеанса. Я также пробовал использовать драйвер базы данных, но это не помогло. Кто-нибудь знает какие-либо обходные пути для этого или какой-либо способ иметь "общий" экземпляр моей переменной сеанса, чтобы он не зависел от моих контроллеров? Спасибо!! Любая помощь очень ценится :)

Обновлено: мой /application/config/config.php, похоже, не действует. Я думаю, это потому, что я использую CI4 вместо CI3. Я прямо сейчас явно настраивал параметры сеанса. Код для этого выглядит так:

/system/Session/Session.php:

public function __construct(\SessionHandlerInterface $driver, $config) {
        $this->driver = $driver;

        $config->sessionSavePath = BASEPATH . 'Writable/sessions/';
        $config->sessionMatchIP = True;
        $config->cookieDomain = '.autoloapp.com';

        $this->sessionDriverName = $config->sessionDriver;
        $this->sessionCookieName = $config->sessionCookieName;
        $this->sessionExpiration = $config->sessionExpiration;
        $this->sessionSavePath = $config->sessionSavePath;
        $this->sessionMatchIP = $config->sessionMatchIP;
        $this->sessionTimeToUpdate = $config->sessionTimeToUpdate;
        $this->sessionRegenerateDestroy = $config->sessionRegenerateDestroy;

        $this->cookieDomain = $config->cookieDomain;
        $this->cookiePath = $config->cookiePath;
        $this->cookieSecure = $config->cookieSecure;
}

Кажется, вы смешиваете CI3 при запуске CI 4. Вы видели CI4 Docs? Он должен автоматически запуститься после вызова службы. bcit-ci.github.io/CodeIgniter4/libraries/…

Friderich Weber 26.05.2018 07:11

Я использую CI4, и у меня есть экземпляр / загрузка, как описано выше. Я думал, что, поскольку он был создан автоматически, я смогу полностью избежать этой проблемы, но либо я загружаю его неправильно, либо альфа-версия CI4 плохо работает с сессиями. Любые идеи?

Pecans 26.05.2018 09:52

Вы устанавливаете значения конфигурации сеанса и cookie в /application/Config.App.php? Если нет, то как и когда вы предоставляете их конструктору Session?

DFriend 26.05.2018 16:39

Кроме того, тест if ($this->session == null) { ожидает, что свойство класса $session существует, в противном случае будет выдано исключение. Как и где вы создаете эту недвижимость?

DFriend 26.05.2018 17:13
BASEPATH - это путь к системному каталогу. Ваше значение $sessionSavePath должно быть ROOTPATH . 'writable/sessions/';
DFriend 26.05.2018 19:17

@DFriend У меня нет файла /application/Config.App.php. Я обновил вопрос, чтобы показать код, который я использую для временного принудительного применения определенных параметров сеанса, хотя это явно не идеально для производственной среды. Я определяю $ this-> session = null; как переменная открытого класса над конструктором. Имеет ли значение расположение / Writable / sessions /? Я думал, что до тех пор, пока разрешения / владение верны, и я прошел абсолютный путь, он будет работать независимо.

Pecans 27.05.2018 00:47

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

Pecans 27.05.2018 00:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось это исправить (наконец), но заменив все файлы / application и все файлы / shared / config на файлы из стандартного фреймворка CI4. Я использовал файлы CI3 (привет разработчикам до меня), и обновление этих файлов конфигурации с правильными значениями устранило проблему. Я также удалил код в BaseController.php, который создавал сеанс. Спасибо @DFriend за помощь в решении проблемы!

Другие вопросы по теме