Материал

24.02.15

Особенности обновления до CodeIgniter 3

Небольшое вступление для тех, кто не знаком с Фреймворком CodeIgniter

CodeIgniter – это PHP framevork (Фреймворк), основной целью которого является помощь в разработке Интернет сайтов, систем и приложений. Весь смысл Фреймворка заключается в возможности использовать наборы функций и библиотек, вместо того, чтобы писать код с нуля и «изобретать велосипед». Это может значительно ускорить разработку любого сайта или приложения.

Причем Фреймворк Codeigniter содержит и наборы функций и библиотек, дающих возможность обеспечения защиты ваших приложений. Нужно только не забывать вовремя его обновить. Более подробно о Фреймворке CodeIgniter читайте в нашем обзоре.

Cначала рассмотрим стандартные шаги обновления до версии CodeIgniter 3

Обращаю ваше внимание на то, что в статье описано обновление с версии 2.1.1.

Шаг 1. На первом шаге, как и при обновлении любого Фреймворка нужно сделать резервную копию вашего приложения. Не забудьте о базе данных.

Шаг 2. Здесь пока все стандартно. Необходимо заменить все файлы в папке system и файл, находящийся в корне сайта на Codeigniter – index.php.

Перед полной заменой папки system сохраните все измененные вами файлы ранее, если такие конечно были.

Шаг 3. Все ваши файлы классов, моделей и библиотек нужно переименовать так, чтобы первая буква была заглавной. Это не касается файлов настроек.

Например, если ваш файл назывался application/controllers/welcome.php, то его нужно переименовать в application/controllers/Welcome.php

Шаг 4. Нужно заменить файл с информацией о расширениях файлов – mimes.php. Он находится в папке application/config/mimes.php

Шаг 5. Удалить строку $autoload['core'] из файла config/autoload.php

Шаг 6. На этом шаге нужно переместить все свои лог файлы (Log) в папку application/core/

Пример:

application/libraries/Log.php -> application/core/Log.php
application/libraries/MY_Log.php -> application/core/MY_Log.php

Шаг 7. Здесь нудно провести изменения в файле config/database.php, а именно удалить переменную $active_record, заменивеена $query_builder

$active_group = 'default';
// $active_record = TRUE;
$query_builder = TRUE;

Шаг 8. Шаблон ошибок заменен и теперь используется как представление. Поэтому нужно переместить ваши файлы из application/errors в папку application/views/errors/html. Также нужно скопировать папку application/views/errors/cli из архива codeiniter 3

Шаг 9. Одновить файл config/routes.php, обработав строки, содержащие (:any), заменив их на (.+)

Шаг 10. Десятый шаг требует особого внимания. В Codeigniter 3 переписан класс сессий. Авторы новой версии Фреймворка посчитали, что безопаснее будет не использовать Cookie.

Поэтому на этом шаге необходимо провести немалые изменения, если вы использовали этот класс на своем сайте или приложении.

1. Установить значение для $config['sess_driver']. Значениями могут быть файлы или базы данных.

Еслиу казаны файлы - $config['sess_save_path']. В этой строке нужно указать путь к сохранению файлов.

Если указана база данных, во первых нужно указать название таблицы, во вторых – обновить саму таблицу. По умолчанию это - ci_sessions

$config['sess_driver']='database';$config['sess_save_path']='ci_sessions';

Вот пример кода с сайта поддержки:

Для MySQL:

CREATE TABLE IF NOT EXISTS `ci_sessions`(`id`varchar(40) NOT NULL, `ip_address` varchar(45) NOT NULL,`timestamp` int (10) unsigned DEFAULT 0 NOT NULL,`data` blob DEFAULT '' NOT NULL, PRIMARY KEY(id),KEY`ci_sessions_timestamp`(`timestamp`));

Для PostgreSQL:

CREATE TABLE "ci_sessions" ("id" varchar(40) NOT NULL,"ip_address" varchar(45) NOT NULL, "timestamp" bigint DEFAULT 0 NOT NULL,"data" text DEFAULT '' NOT NULL, PRIMARY KEY("id")); CREATE INDEX "ci_sessions_timestamp" ON "ci_sessions"("timestamp");

2. Удалить строку $config['sess_match_useragent']

3. Удалить строку $config['sess_encrypt_cookie']

4. Удалить строку $config['sess_expire_on_close']

5. “flashdata” и “userdata” теперь одно и тоже, поэтому необходимо в своем коде провести необходимые изменения и не называть эти данные одним именем, иначе возникнет ошибка, так как один из них перестанет учитываться.

6. Если вы используете метаданные ‘session_id’, ‘ip_address’, ‘user_agent’ and ‘last_activity’, нужно это исправить.

  • session_id: session_id()
  • ip_address: $_SERVER['REMOTE_ADDR']
  • user_agent: $this->input->user_agent() (unused by sessions)
  • last_activity: Depends on the storage, no straightforward way. Sorry!

7. Изменить unset_userdata()

До : $this->session->unset_userdata(array('item'=>'','item2'=>'')); 

После: $this->session->unset_userdata(array('item','item2'));

8. Если у вас написаны к классу сессии какие-то дополнения, то они должны быть перемещены в папку application/libraries/Session/

Какие изменения и особенности необходимо учитывать при обновлении до CodeIgniter 3

 Многие функции возвратят NULL вместо FALSE. На это нужно обратить внимание.

Common functions

config_item()

Config Class

config->item(), config->slash_item()

Input Class

input->cookie(), input->server(), input->get(), input->post(), input->get_post(), input->input_stream(), input->get_request_header()

Session Class

session->userdata(), session->flashdata()

URI Class

uri->segment(), uri->rsegment()

Array Helper

element(), elements()

Параметр по умолчанию для XSS фильтрации теперь NULL вместо FALSE

Обновлено использование метода get_post(). Этот метод модифицирован и ищет сначала в GET, затем в POST. В связи с этим добавили еще один метод post_get(), который ищет аналогично наоборот.

Функция Helper directory_map() изменена и теперь использует в конце каждого каталога в передаваемом массиве разделитель (слэш).

При использовании метода drop_table() добавился второй параметр. Если вы используете этот метод, то вам необходимо его изменить:

$this->dbforge->drop_table('table_name', TRUE); 

Изменения коснулись e-mail библиотеки при отправке нескольких писем. Дело в том, что после успешной отправки каждого письма все указанные параметры очищаются. Для того, чтобы этого избежать, нужно использовать FALSE значение в методе send(): 

if ($this->email->send(FALSE)){…}

Изменения коснулись языковых параметров в библиотеке FormValidation.

В итоге меняем $lang['rule'] = ... 

На $lang['form_validation_rule'] = ... 

Также произошли изменения в сообщении об ошибке  

// До

'The %s field does not match the %s field.' 

// После

'The {field} field does not match the {param} field.' 

В методе add_column() DatabaseForge удален третий параметр.

// До

$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); 

При использовании Texthelper - highlight_phrase() возможны проблемы при работе в тарых браузерах, не поддерживающих тег <mark>

Поэтому в CSS нужно добавить следующее: 

mark { background: #ff0; color: #000; };

В таблице представлены методы, функции, библиотеки, которые будут удалены, а также возможные их альтернативы как в новой версии Codeigniter, так и в PHP или HTML.

Методы и функции, библиотеки, которые будут удалены

Альтернатива в Codeigniter 3.0

Альтернатива в PHP или HTML

Примечание

Метод sha1()

 

sha1()

 

EXT константы

 

.php

 

Smiley Helper

 

 

 

Encrypt Library

Encryption Library

 

Необходимо наличие MCrypt расширения или PHP 5.3.3 и расширения OpenSSL

Cart Library

 

 

 

Security helper - do_hash()

 

hash()

 

read_file()

 

file_get_contents()

 

String Helper - repeater()

 

str_repeat()

 

String Helper - trim_slashes()

 

trim()

 

form_prep()

 

html_escape()

 

Email Helper - valid_email()

 

filter_var()

 

Email Helper - send_email()

 

mail()

 

‘mysql’ драйвер

 

 

необходимо переходить на использвание ‘mysqli’ или ‘pdo/mysql’

standard_date()

standard_date('DATE_ATOM', $time);

 

date(DATE_RFC822, now());

date(DATE_ATOM, $time);

 

HTMLHelper - nbs()

 

str_repeat()

 

HTMLHelper - br()

 

<br>

 

Настройка ‘anchor_class’ вбиблиотеке Pagination Library

 

 

Pagination Library теперь позволяет вставлять любые HTML аттрибуты

String Helper - random_string()

 

md5 и sha1

 

Form validation - xss_clean

Security Helper - xss_clean()

 

 

автоматическая проверка сегментов URI на XSS

Security Helper - xss_clean()

 

 

URL helper - url_title(). Разделители ‘dash’ and ‘underscore’

 

‘-’, ‘_’

 

Метод Session Library - all_userdata()

userdata()

 

 

Input library - is_cli_request()

is_cli()

 

 

Config library - system_url()

 

 

 

Javascript library

 

JavaScript

 

URI Routingметоды - fetch_directory(), fetch_class(), fetch_method().

$this->router->directory;

$this->router->class;

$this->router->method;

 

 

 

Многие из указанных методов и функций по-прежнему будут работать с целью обратной совместимости в Codeigniter 3.0, но нужно как можно быстрее отказаться от их использования так как они будут удалены в новых версиях Codeigniter 3.1+.

Материал написан на основе официальной документации по Codeigniter 3.0

Какие шаги пришлось применить кроме указанных в официальной документации?

Во первых, пришлось заменть файл /application/config/database.php так как призапуске обновленного проекта посыпались ошибки БД. Все, что нужно было подправить - это прописать свои параметры подключения к базе данных.

Во вторых, с официального сайта нужно загрузить набор русского языка и поместить его в папку /system/language/. (После перехода по ссылке нужно нажать на Download System Message Translations).

Файлы библиотек остались в папке libraries.

Зачем обновлять Codeigniter до версии 3.х?

В третей версии фреймворка добавлены ряд новых классов, библиотек, а соответственно возможностей. Также с появлением новых версий возможности будут только расширяться.

Также третяя версия основана на MIT лицензии.

Поддержка безопасности Codeigniter 2.x прекратиться 31 октября 2015 года, что может значительно отразиться не только на безопасности приложений, но и на их функционале.

Проект Codeigniter 3.x размещен на HackerOne. Со временем это должно повысить взломоустойчивость фреймворка.