Обновление с 2.2.x до 3.0.0
Шаг 1: Обновите файлы вашего CodeIgniter
Шаг 2: Обновите имена файлов классов
Начиная с CodeIgniter 3.0, все имена файлов классов (библиотеки, драйвера, контроллеры и модели) должны быть названы в Ucfirst-подобным образом или другими словами - они должны начинаться с заглавной буквы.
Например, если имеется следующий файл библиотеки:
application/libraries/mylibrary.php
... то вам следует переименовать его в:
application/libraries/Mylibrary.php
Также следует поступить с драйверами библиотек и расширений и/или переопределений собственных библиотек и классов ядра CodeIgniter’а.
application/libraries/MY_email.php application/core/MY_log.php
Вышеуказанные файлы должны быть переименованы следующим образом:
application/libraries/MY_Email.php application/core/MY_Log.php
Контроллеры:
application/controllers/welcome.php -> application/controllers/Welcome.php
Модели:
application/models/misc_model.php -> application/models/Misc_model.php
Обратите внимание, что это не влияет на каталоги, файлы конфигурации, Вид (views), хелперы (помощники), хуки (hooks) и все остальное - это применимо только к классам.
Вы должны следовать одному простому правилу - имена классов в Ucfirst-подобным образом, а все остальное в нижнем регистре.
Шаг 3: Замените config/mimes.php
Этот конфигурационный файл был обновлен, и содержит больше пользовательских MIME-типов, пожалуйста, скопируйте его _application/config/mimes.php*.
Шаг 4: Удалите $autoload[‘core’] из config/autoload.php
Использование $autoload['core'] конфиг массива устарел с CodeIgniter 1.4.1 и теперь удален. Переместите любые элементы, которые вы, возможно, включили вместо $autoload['libraries'].
Шаг 5: Переместите ваш класс Журнала (Log) в переопределения или расширения
Класс Журнала (Log) рассматривается как “ядро” класса и теперь находится вsystem/core/ каталоге. Следовательно, чтобы Класс Журнала (Log) переопределений или расширений работал, Вам необходимо переместить их в application/core/:
application/libraries/Log.php->application/core/Log.php
application/libraries/MY_Log.php->application/core/MY_Log.php
Шаг 6: Обновите использование вашей библиотеки сессий
Библиотека Сессий была полностью переписана в CodeIgniter 3 и теперь поставляется с кучей новых функций, но это также означает, что и Вам нужно будет сделать некоторые изменения...
Самое главное, библиотека теперь использует отдельное хранение драйверов, вместо того чтобы постоянно полагаться на (зашифрованные) куки. На самом деле, куки-файлы, как хранилища были удалены, и вы должны всегда использовать какой-то серверный механизм хранения, установленный по умолчанию в файловой системе.
Класс Сессий теперь использует собственный механизм PHP для создания пользовательских обработчиков сессии, это также означает что теперь данные сессии доступны по суперглобальной $_SESSION (мы сохранили возможность использовать “userdata”, как вы это делали до этого).
Некоторые параметры конфигурации были удалены, а некоторые добавлены. Вам следует полностью прочитать Session library руководство для деталей, но вот краткий список изменений, которые вам необходимо внести:
Установите $config['sess_driver'] значениеПо умолчанию это ‘files’, если вы ранее его не использовали $config['sess_use_database'], в противном случае он будет иметь значение ‘database’.
Установите $config['sess_save_path'] значениеДля драйвера ‘database’, резервный вариант $config['sess_table_name'] на месте, но в остальном от вас требуется прочтение руководства для специального драйвера на Ваш выбор.
Обновите Вашу ci_sessions таблицу (только ‘database’)Структура таблица немного изменилась, и более конкретно:
- session_id поле переименовано в id
- user_agent поле удалено
- user_data поле переименовано в data и в MySQL теперь это тип BLOB
- last_activity поле переименовано в timestamp
Это сопровождается незначительными изменениями индексов в таблице тоже, поэтому, пожалуйста, прочитайте руководство Session Database Driver для более подробной информации.
ВажноТолько MySQL и PostgreSQL поддерживаются официально. Остальные базы данных также остаются рабочими, но из-за отсутствия консультаций они являются небезопасными для параллельных запросов и следует использовать другие БД. Удалите $config['sess_match_useragent']Адресная строка браузера предоставляющая ввод данных пользователю, или другими словами: ввод данных на стороне клиента. Как таковая, она является неэффективной характеристикой и следовательно, была удалена.
Удалите $config['sess_encrypt_cookie']Как уже отмечалось, библиотека больше не использует куки (cookies) как механизм хранения, что делает эту опцию бесполезной.
Удалите $config['sess_expire_on_close']Эту опцию еще можно использовать, но только в целях обратной совместимости иначе ее следует удалить. Тот же эффект достигается путем установки $config['sess_expiration'] равной 0.
Проверьте “flashdata” для столкновений с “userdata”Flashdata теперь “userdata”, только помеченные для удаления при следующем запросе. Другими словами: Вы не можете иметь обе “userdata” и “flashdata” с одинаковыми именами, т.к. это одно и тоже.
Проверьте использование метаданных сессииРаньше, Вы могли получить доступ к ‘session_id’, ‘ip_address’, ‘user_agent’ и ‘last_activity’ метаданным как userdata. Теперь это невозможно, и Вам следует прочесть Session Metadata если Ваше приложение использует эти данные.
Проверьте использование unset_userdata()Раньше, этот метод использовался для доступа к парам ассоциативного массива 'key' => 'пустое значение' для удаления нескольких ключей. Что впрочем не имеет значения и Вам следует пройтись только по ключам, как по элементам массива.
// Раньше $this->session->unset_userdata(array('item' => '', 'item2' => '')); // Теперь $this->session->unset_userdata(array('item', 'item2'));
Наконец, если Вы написали расширение для сессий, Вы должны переместить его в application/libraries/Session/ каталог, хотя есть вероятность, что его тоже следует пересмотреть.
Шаг 7: Обновите Ваш config/database.php
В версии 3.0.0 из-за переименования Активной Записи (Active Record) в Квейри Билдер (Query Builder), внутри Вашего config/database.php, Вы будете вынуждены переименовать $active_record переменную в $query_builder:
$active_group = 'default';
// $active_record = TRUE;
$query_builder = TRUE;
Шаг 8: Замените шаблон ошибок
В CodeIgniter 3.0, шаблон ошибок теперь рассматривается как Виды (views) и был перемещен в _application/views/errors* каталог.
Кроме того, мы добавили поддержку для CLI шаблонов ошибок в обычном текстовом формате что в отличии от HTML, подходит для командной строки. Это конечно, требует другого уровня разделения.
Перемещение старых шаблонов из _application/errors* в _application/views/errors/html* является безопасным, но Вам лучше сделать копии из новой _application/views/errors/cli* папки архива CodeIgniter.
Шаг 9: Обновите Ваш config/routes.php файл
Маршруты содержащие :any
Традиционно, CodeIgniter всегда предоставлял :any подстановку в маршрутизации, с намереньем предоставить соответствие любому символу внутри URI сегмента.
Однако, :any подстановка актуальна для алиасов регулярных выражений и используется как выполнение .+. Это рассматривается как баг, т.к это также соответствует символу / (обратный слэш), который является разделителем URI сегмента что не входило в намерения.
В CodeIgniter 3, :any подстановка не будет соответствовать [^/]+, следовательно не будет соответствовать обратному слэшу.
Есть конечно много разработчиков которые используют этот баг как специальное свойство. Если Вы не один из них и желаете совпадения обратного слэша, пожалуйста используйте .+ регулярное выражение:
(.+) // не соответствует НИЧЕМУ
(:any) // соответствует любому символу кроме, '/'
Каталоги и ‘default_controller’, ‘404_override’
Как Вам известно, $route['default_controller'] и $route['404_override'] настройки принимают не только имена контроллеров, но и также controller/method пары. Однако, баг в логике маршрутизации позволил некоторым пользователям использовать его в качестве directory/controller.
Как было сказано, это поведение случайноность и никогда не было ни преднозначено ни документировано. Если Вы расчитывали на это, Ваше приложение сломается на CodeIgniter 3.0.
Другое значительное изменение в версии 3, то что ‘default_controller’ и ‘404_override’ теперь применимо в каталоге. Чтобы объяснить что это значит, давайте рассмотрим следующий пример:
$route['default_controller'] = 'main';
Теперь предположим что Ваш сайт размещен на example.com, Вы также знаете что если пользователь посетит http://example.com/, то изходя из настроек будет загружен Ваш ‘Main’ контроллер.
Однако, что произойдет если у Вас есть application/controllers/admin/ каталог и пользователь посетит http://example.com/admin/? В CodeIgniter 3, маршрутизатор будет искать ‘Main’ контроллер из admin/ каталога. Если таков не найден, он будет возвращен к родительской (application/controllers/) папке, как и в версии 2.x.
Такие же правила применимы и для ‘404_override’ параметра.
Шаг 10: Много функций теперь возвращают NULL вместо FALSE на недостающие элементы
Много методов и функций теперь возвращают NULL вместо FALSE когда необходимый элемент не существует:
- Common functions
- config_item()
- Config Class
- config->item()
- config->slash_item()
- Input Class
- input->get()
- input->post()
- input->get_post()
- input->cookie()
- input->server()
- input->input_stream()
- input->get_request_header()
- Session Class
- session->userdata()
- session->flashdata()
- URI Class
- uri->segment()
- uri->rsegment()
- Array Helper
- element()
- elements()
Шаг 11: Использование XSS фильтрации
Много функций в CodeIgniter позволяют Вам использовать XSS фильтрацию востребованную булевым параметром. Значение по умолчанию этого параметра является булево FALSE, но сейчас оно изменено на NULL и оно будет динамически определяться Вашим $config['global_xss_filtering'] значением.
Если Вы собираетесь в ручную установить булево значение $xss_filter параметра или Вы хотите навсегда установить $config['global_xss_filtering'] равное FALSE, тогда это изменение не должно Вас волновать.
Иначе, пожалуйста пересмотрите Ваше использование следующих функций:
- Input Library
- input->get()
- input->post()
- input->get_post()
- input->cookie()
- input->server()
- input->input_stream()
- Cookie Helper get_cookie()
Шаг 12: Проверка потенциальных XSS вопросов с URI
URI Library использует автоматическую конвертацию определенных наборов “программных символов” в HTML сущности когда они встречаются в URI сегменте.
Это было направленно на обеспечение некой автоматической XSS защиты, в дополнени к $config['permitted_uri_chars'] параметру, но оказалось проблематичным и в CodeIgniter 3.0. было удалено
Если Ваше приложение пологается на это функцию, Вам следует обновить фильтр URI сегментов через $this->security->xss_clean() всякий раз когды Вы выводите их.
Шаг 13: Проверка использования ‘xss_clean’ правила валидации Форм (Form validation)
Во многом неизвестное правило XSS заключается в том, что применяется только к выходным данным, в отличии от входных данных.
Мы допустили эту ошибку сами с автоматической и глобальной XSS характеристиками чистки (смотрите предыдущий шаг XSS), и теперь для искоренения этой практики, мы также удаляем ‘xss_clean’ из официально поддерживаемого списка form validation правил.
Так как Form Validation library обычно проверяет входные данные, то ‘xss_clean’ правилу просто нет места.
Если Вам действительно, действительно необходимо применить это правило, то Вам также следует подключить Security Helper, который содержит xss_clean() как обычную функцию и поэтому тоже может быть использован в качестве правила проверки.
Шаг 14: Обновите использование в Input Class - get_post() метода
Ранее, в Input Class метод get_post() искал сначала в POST данных, и лишь затем в GET данных. Этот метод был усовершенствован и теперь сначала поиск происходив в GET данных затем в POST, как и предпологается по названию.
Был добавлен метод, post_get(), который сперва ищет в POST затем в GET данных, как это раньше было в get_post().
Шаг 15:Обновите использование в Directory Helper - directory_map() функции
В результирующем массиве, каталоги теперь заканчиваются разделителем каталогов (обычно это слэш "/").
Шаг 16: Обновите использование в Database Forge - drop_table() метода
До сих пор, drop_table() включала IF EXISTS как пункт по умолчанию или же вообще не работала с некоторыми драйверами. В CodeIgniter 3.0, IF EXISTS условие больше не является условием по умолчанию и имеет необязательный второй параметр который позволяет установить его равным FALSE по умолчанию.
If your application relies on IF EXISTS, you’ll have to change its usage.
// Сейчас производит только DROP TABLE `table_name`
$this->dbforge->drop_table('table_name');
// Производит DROP TABLE IF EXISTS `table_name`
$this->dbforge->drop_table('table_name', TRUE);
Шаг 17: Поменяйте использование Email library с несколькими письмами
Email Library автоматически очистит заданные параметры после успешной отправки письма. Чтобы переопределить это поведение, установите FALSE в качестве первого параметра send() метода:
if ($this->email->send(FALSE))
{
// Параметры не будут очищенны
}
Шаг 18: Обновите Ваши Form_validation языковые строки
Два усовершенствования были внесены в Form Validation Library языковый файл и формат ошибки сообщения:
Language Library ключи строки должны быть с префиксом form_validation_ для того чтобы избежать столкновения:// Старое $lang['rule'] = ... // Новое $lang['form_validation_rule'] = ... Формат ошибки сообщения был изменен чтобы использовать именные параметры, для большей гибкости sprintf() предоставлений:// Старое 'The %s field does not match the %s field.' // Новое 'The {field} field does not match the {param} field.'
Шаг 19: Удалите использование (ранее) устаревших функций
В дополнение к $autoload['core'] настройкам конфигураций, есть ряд других функций которые были удалены в CodeIgniter 3.0.0:
SHA1 библиотека
Ранее устаревшая SHA1 библиотека была удалена, измените свой код на чистую PHP sha1() функцию чтобы сгенерировать SHA1 хэш.
Кроме того, sha1() метод в Encrypt Library был удален.
EXT константа (постоянная)
Использование EXT постоянной считается устаревшей начиная с отмены поддержки PHP 4. Теперь нет необходимости поддерживать различные расширения файлов в новой версии CodeIgniter, и EXT постоянная была удалена. Достаточно использовать ‘.php’.
Smiley хелпер
Smiley хелпер это устаревшая функция от EllisLab’s ExpressionEngine. Впрочем, она очень специфическая исключетельно для такого фреймворка как CodeIgniter и поэтому она считается устаревшей.
Также, ранее устаревшая js_insert_smiley() (начиная с версии 1.7.2) функция удалена.
Библиотека шифрования
Изходя из многочисленных уязвимостей, Encrypt Library устарела и новая, Encryption Library добавлена чтобы занять ее место.
Новая библиотека требует также MCrypt расширения (и наличие /dev/urandom) или PHP 5.3.3 и OpenSSL расширения. Это может быть неудобно, но эта необходимость позволяет правильно осуществлять функции шифрования.
Cart библиотека
Cart библиотека, аналогично Smiley хелперу очень специфична для CodeIgniter. Она считается устаревшей и будет удалена начиная с версии CodeIgniter 3.1+.
Драйвера Database ‘mysql’, ‘sqlite’, ‘mssql’, ‘pdo/dblib’
Mysql драйвер использует старое ‘mysql’ PHP расширение, в котором известно о устаревшем коде и множественных низкоуровневых проблемах. Расширение устарело до PHP 5.5 и CodeIgniter в версии 3.0, использует MySQL драйвер mysqli.
Пожалуйста используйте ‘mysqli’ или ‘pdo/mysql’ драйвера для MySQL. Старый ‘mysql’ драйвер будет удален в будующих версиях.
Sqlite, mssql и pdo/dblib (также известно как pdo/mssql или pdo/sybase) драйвера зависят от PHP расширений, которые по разным причинам больше не существуют с версии PHP 5.3.
Следовательно мы считаем эти драйвера устаревшими и собираемся их удалить из последующих версий CodeIgniter. Вам следует использовать более совершенные, sqlite3, sqlsrv или pdo/sqlsrv драйвера.
Security хелпер do_hash()
Функция Security хелпера do_hash() является псевдонимом родной PHP hash() функции. Она устарела и будет удалена в CodeIgniter 3.1+.
Установки $config[‘global_xss_filtering’]
Как уже объяснялось выше, XSS фильтрация не осуществляется для входных данных. Поэтому, $config['global_xss_filtering'], которая автоматически фильтрует входные данные, является плохой практикой и считается устаревшей.
Вместо этого, Вы можете сами обрабатывать любые данные пользователя используя xss_clean() функцию когда Вам необходимо вывести их, или использовать библиотеку HTML Purifier которая сделает это.
File хелпер read_file()
Функция File хелпера read_file() является псевдонимом родной PHP file_get_contents() функции. Она устарела и будет удалена в CodeIgniter 3.1+.
String хелпер repeater()
Функция String хелпера repeater() является псевдонимом родной PHP str_repeat() функции. Она устарела и будет удалена в CodeIgniter 3.1+.
String хелпер trim_slashes()
Функция String хелпера trim_slashes() является псевдонимом родной PHP trim() функции (с передоваемым слэшем как второй аргумент). Она устарела и будет удалена в CodeIgniter 3.1+.
Form хелпер form_prep()
Функция Form хелпера form_prep() является псевдонимом common function html_escape(). Она устарела и будет удалена в будующем.
Пожалуйста используйте вместо нее html_escape().
Функции Email хелпера
Email хелпер имеет только две функции
Обе являются псевдонимами родных PHP filter_var() и mail() функций, соответственно. Поэтому Email хелпер считается устаревшим и будет удален в CodeIgniter 3.1+.
Date хелпер standard_date()
Функция Date хелпера standard_date() устарела с появлением родных PHP констант, которые с использованием date() обеспечивали такую же функциональность. Более того, они имеют точно такие же названия, как те же что и предоставлялись в standard_date(). Вот тпримеры как заменить их использование:
// Старый способ
standard_date(); // defaults to standard_date('DATE_RFC822', now());
// Замена
date(DATE_RFC822, now());
// Старый способ
standard_date('DATE_ATOM', $time);
// Замена
date(DATE_ATOM, $time);
HTML хелперы nbs(), br()
Функции HTML хелпера nbs() и br() являются псевдонимами родных str_repeat() функций используемых с и
> соответсвенно.
Так как нет смысла использовать псевдонимы родных PHP функций, они считаются устаревшими и запланировано их удаление в CodeIgniter 3.1+.
Настройка ‘anchor_class’ библиотеки Pagination
Pagination библиотека теперь поддерживает добавление более удобных HTML атрибутов к якорям используя настройки конфигурации ‘attributes’. Эти настройки передают атрибут ‘class’ и использование настройки ‘anchor_class’ больше не имеет смысла. Исходя из этого, настройка ‘anchor_class’ считается устаревшей и запланировано ее удаление в CodeIgniter 3.1+.
Типы ‘unique’ и ‘encrypt’ хелпера String функции random_string()
При использовании String хелпера функции random_string(), больше не требуется передавать unique и encrypt типы. Они лишь псевдонимы md5 и sha1 соответсвенно, и являются устаревшими с последующим их удалением в CodeIgniter 3.1+.
Разделители ‘dash’ и ‘underscore’ URL хелпера функции url_title()
При использовании URL Helper функции url_title(), больше не требуется передавать dash или underscore как разделитель слова. Эта функция не будет принимать ни один параметр и чтобы передать символ непосредственно, нужно писать ‘-‘ вместо ‘dash’ и ‘_’ вместо ‘underscore’.
dash и underscore являются устаревшими и будут удалены в CodeIgniter 3.1+.
Метод all_userdata() библиотеки Session
Как видно в журнале изменений, метод Session библиотеки userdata() теперь позволяет делать выборку всей информации просто опуская параметр:
$this->session->userdata();
Это позволяет методу all_userdata() redudant и теперь это псевдоним userdata() с показаным выше использованием, и теперь считается устаревшей и будет удалена в CodeIgniter 3.1+.
Database Forge метод add_column() с AFTER оговоркой
Если Вы используете третий параметр для Database Forge метода add_column() чтобы добавить поле с AFTER оговоркой, то Вам необходимо заменить ее использование.
Третий параметр устарел и будет удален в CodeIgniter 3.1+.
Теперь необходимо указывать оговорку AFTER для имен полей в поле определения массива:
// Старое использование:
$field = array(
'new_field' => array('type' => 'TEXT')
);
$this->dbforge->add_column('table_name', $field, 'another_field');
// Новое использование:
$field = array(
'new_field' => array('type' => 'TEXT', 'after' => 'another_field')
);
$this->dbforge->add_column('table_name', $field);
URI Routing методы fetch_directory(), fetch_class(), fetch_method()
Со свойствами CI_Router::$directory, CI_Router::$class и CI_Router::$method были также публичными и их соответствия fetch_*() больше не делает ничего, чтобы вернуть свойства - поэтому не имеет смысла хранить его.
Это все внутрение, недокументированные методы, но мы относим их к устаревшим в порядке поддержки обратной совместимости. Если Вы используете какие-то из них, для доступа к ним используйте:
$this->router->directory;
$this->router->class;
$this->router->method;
Метод is_cli_request() Input библиотеки
Вызывать CI_Input::is_cli_request() метод являлось необходимостью во многих местах внутри CodeIgniter и обычно перед загрузкой Input библиотеки. Исходя из этого, он был заменен на общую функцию is_cli() и теперь этот метод просто псевдоним.
Доступны обе функции, использование новой функции короче.
// Старое
$this->input->is_cli_request();
// Новое
is_cli();
CI_Input::is_cli_request() является устаревшей и будет удален в CodeIgniter 3.1+.
Метод system_url() Config библиотеки
Использование CI_Config::system_url() соответствует небезопасному стилю кодирования. А именно, в CodeIgniter system/ папка не должна быть доступна из публичного доступа с точки зрения безопасности.
Поэтому, этот метод устарел и будет удален в CodeIgniter 3.1+.
Javascript библиотека
Javascript библиотека всегда имела ‘эксперементальный’ статус и являлась больше беcполезной чем полезной.
Она устарела и будет удалена в CodeIgniter 3.1+.
Шаг 20: Проверьте highlight_phrase() использование Text хелпера
HTML тэг используемый по умолчанию Text хелпера функции highlight_phrase() был изменен с <strong> на новый HTML5 тэг <mark>.
Пока Вы используете собственные тэги подсветки, с ними могут возникать проблемы у пользователей старых версий браузеров, таких как Internet Explorer 8. Поэтому мы советуеи, чтобы Вы добавили в CSS файл следующие строки для обеспечения совместимости со старыми браузерами:
mark {
background: #ff0;
color: #000;
};