Вордпресс - это всегда плохой пример, с какой стороны не глянь. Серьезно. Начиная как раз с архитектуры, заканчивая механикой. Никогда не равняйся на вордпресс и старайся не приводить "а в вордпрессе" в качестве аргумента.
@Dimon2x, WordPress и Yii2 - это разные вещи. Yii2 - это только каркас сайта, на нём нельзя двумя движениями мышки поднять сайт, как в случае WordPress. Но по архитектуре да, можешь смотреть в сторону Yii2, она там не плохая.
Задача: Создайте класс Session - оболочку над сессиями. Он должен иметь следующие методы: создать переменную сессии, получить переменную, удалить переменную сессии, проверить наличие переменной сессии. Сессия должна стартовать (session_start) в методе __construct. Реализуйте класс Flash, который будет использовать внутри себя класс Session из предыдущей задачи (именно использовать, а не наследовать). Этот класс будет использоваться для сохранения сообщений в сессию и вывода их из сессии. Зачем это нужно: такой класс часто используется для форм. Например на одной странице пользователь отправляет форму, мы сохраняем в сессию сообщение об успешной отправке, редиректим пользователя на другую страницу и там показываем сообщение из сессии. Класс должен иметь да метода - setMessage, который сохраняет сообщение в сессию и getMessage, который получает сообщение из сессии. --------------------------------------------------------------------------------------- Я это сделал, всё работает, нормально ли получилось? PHP: <?php error_reporting(E_ALL); class Session { protected $name; protected $val; public function __construct() { session_start(); } public function setSession($name, $val) { $this->name = $name; $this->val = $val; return $_SESSION[$this->name] = $this->val; } public function getSessionName($name) { return $_SESSION[$name]; } public function checkSession($name) { if(isset($_SESSION[$name])) { return true; } return false; } public function delSession($name) { unset($_SESSION[$name]); } } class Flash { protected $saveSession; public function __construct() { $this->saveSession = new Session(); } public function setMessage($id, $mess) { $this->saveSession->setSession($id, $mess); } public function getMessage($name) { if($this->saveSession->checkSession($name)) { return $this->saveSession->getSessionName($name); } } } $message = new Flash; $message->setMessage('message1', 'Привет'); echo $message->getMessage('message1'); ?>
Почитай про различие private и protected. --- Добавлено --- Если ты класс session наследовать не планируешь и хочешь закрыть свойства! Используй private! И вообще привыкай закрвать св-ва private а для их получения используй публичные методы.
Ну классу, который оболочка над стандартным массивом $_SESSION, не нужно дополнительно хранить какие-то имена и значения - они уже хранятся в $_SESSION, так что можно сделать его без полей. Этот метод можно было в одну строчку сделать PHP: public funtion checkSession($name) { return isset($_SESSION[$name]); } isset и так возвращает true или false. flash-сообщения, вообще, конечно, ещё удаляться из сессии после получения должны, но в твоё задании это почему-то не прописано
А нахрена писать такую обработку для сессий когда достаточно просто написать : PHP: if (!isset($_SESSION['name'])) { return false; }
а PHP: session_start(); Пишешь в самом начале скрипта. --- Добавлено --- @mkramer а с другой стороны товарищ осваивает ООП ))) Я думаю каждый вначале писал глупые классы которые просто навсего нафиг не нужны
Так? PHP: public function getMessage($name) { if($this->saveSession->checkSession($name)) { return [ $this->saveSession->getSessionName($name), $this->saveSession->delSession($name) ]; } } } $message = new Flash; $message->setMessage('message1', 'Привет'); echo $message->getMessage('message1')[0];
Ну тем не менее во всех основных фреймворках есть оболочка над сессиями. Если есть класс сессий, то его можно декорировать, его можно наследовать. Если вынести интерфейс и сделать DI-контейнер, можно какую-нибудь альтернативную работу с сессиями придумать. @Dimon2x, ну зачем массив возвращать? PHP: public function getMessage($name) { if($this->saveSession->checkSession($name)) { $val = $this->saveSession->getSessionName($name); $this->saveSession->delSession($name); return val; } } }
Спорно. Программирую на обоих фреймворках, лара в dev-режиме тормозная до ужаса (правда, на production нормально). Необходимо тонну роутов руками писать. В Yii2 есть генератор кода, на котором примитивную админку можно сделать за 2 секунды. На Shared-хостингах сайты на yii легче поднимаются.
Нахрена, Сессии нужны чисто для хранения коротких данных, если и вправду нужно хранить в кеше большой объём данных то лучше использовать redis!
Ну на мой взгляд это наиболее оптимальный вариант. Либо же я хранил бы лишь id в сессии, а данные связанные с id хранил бы в базе или в файлике!
@Dimon2x, сделай, для удобства, чтоб можно было так сделать PHP: $session->getSessionName("hren", false); // если хрена в сессии нет, чтоб возвращало по дефолту false или что-то ещё
Всё зависит от задачи. Я вот например сейчас делаю в своём движке модуль магазина связанного с моими каталогами, я планирую данные от покупателей держать в файлах json а имя файла держать в сессии и куке --- Добавлено --- А вот библу для полученя данных из json по id сессии я планирую писать а когда я в первые помню писал магазин, я хранил все данные корзины в $_SESSION --- Добавлено --- Просто если будет простенький хост, то хранить данные в сессии, от каждого посетителя, это может кончится плачевно
@askanim, в той же ларе видишь сколько написано над стандартными сессиями: https://laravel.com/docs/master/session
Жесть PHP: $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); @mkramer обёртка ради обёртки... Какое - то не целесообразное растрачивание ресурсов! Поэтому я юзаю лишь micro frameworks ) PHP: function GetIP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; } наткнулся на певрый попавшийся скрипт, а вот и user agent PHP: echo $_SERVER["HTTP_USER_AGENT"]; Нахрена это держать в супер глобальном массиве сессий, когда они и так существуют в супер глобальном массиве $_SERVER --- Добавлено --- Просто зачем, просто нафига? Нафига лишний код ? Это чиста выделится мне кажится мб для разрабов которые не знают пых это надо и сели кодить начиная с лары. --- Добавлено --- Это как в битриксе... У них наверное лозунг компании: "Мы не юзаем уже готовые и общеизвестные стандарты, мы создаём свои!"; Мы создадим своё понятие пространства имён! Нахрена нам юзать стандарт psr-4 У нас есть свой bitrix-4. Госпади... Это как нафига нам сервера на ubuntu, debian, freeBSD мы создадим свой линукс BITRIX VM! Вот тут тоже самое. Вопрос а на...я ?
Не ради обёртки. Я могу задекорировать и поставить дополнительную обработку данных (не знаю зачем, но могу), флеш-данные автоматически удаляются при получении и прочее и прочее. Привязка к юзер-агенту - это встроенная в Laravel защита от угона сессии.
Я походу чё то не знаю. Я как бы знаю что такое flash, но в каком плане используется этот термин? --- Добавлено --- Прикольно защита по угону сессии хранится в самой сессии? --- Добавлено --- Как можно угнать сессию? Забраться в браузер и стырить его куки? --- Добавлено --- Вроде как современные браузеры поддерживают защиту куков. Вроде слышал об этом. --- Добавлено --- геолокация ещё можно так привязать. Но это всё такое эти данные хранить в сессии ? Не я буду хранить их лучше в бд, и буду сверять эти данные дёргая по id сессии из бд с самим браузером клиента! А user agent может быть одинаковый? --- Добавлено --- или там к наименованию браузера дописываются ещё какие тот определённые цифорки(символы) ?