© 2010 - 2011 /home/sinkler/
Мигрируем с CakePHP 1.2 на 1.3
17/09/2010

Замена файлов каталога App
- webroot/index.php: Должен быть заменен в связи с изменением загрузочного процесса.
- config/core.php: Были введены в действие дополнительные настройки, которые требуются для PHP 5.3.
Удаленные константы
Следующие константы были удалены из CakePHP. Если ваше приложение зависит от них, вы должны определить их в app/config/bootstrap.php
- CIPHER_SEED - Эта константа была заменена на настройку Security.cipherSeed которую теперь можно изменить в app/config/core.php
- PEAR
- INFLECTIONS
- VALID_NOT_EMPTY
- VALID_EMAIL
- VALID_NUMBER
- VALID_YEAR
Настройка и загрузка приложения
Дополнительные пути
В вашем файле app/config/bootstrap.php вы могли использовать переменные $pluginPaths или $controllerPaths. Теперь существует новый способ добавления путей к вашим контроллерам, моделям и т.п. Начиная с версии 1.3 RC1 переменные $pluginPaths не работают. Вы должны использовать App::build() для изменения путей.
App::build(array(
'plugins' => array('/full/path/to/plugins/', '/next/full/path/to/plugins/'),
'models' => array('/full/path/to/models/', '/next/full/path/to/models/'),
'views' => array('/full/path/to/views/', '/next/full/path/to/views/'),
'controllers' => array('/full/path/to/controllers/', '/next/full/path/to/controllers/'),
'datasources' => array('/full/path/to/datasources/', '/next/full/path/to/datasources/'),
'behaviors' => array('/full/path/to/behaviors/', '/next/full/path/to/behaviors/'),
'components' => array('/full/path/to/components/', '/next/full/path/to/components/'),
'helpers' => array('/full/path/to/helpers/', '/next/full/path/to/helpers/'),
'vendors' => array('/full/path/to/vendors/', '/next/full/path/to/vendors/'),
'shells' => array('/full/path/to/shells/', '/next/full/path/to/shells/'),
'locales' => array('/full/path/to/locale/', '/next/full/path/to/locale/')
));
Кроме того, изменился порядок загрузки файлов. В прошлом, app/config/core.php загружался после app/config/bootstrap.php. Это приводило к отсутствию кэширования всего, что загружается через App::import().
Загрузка пользовательских инфлекторов
Файл inflections.php был удален, соответствующие методы реорганизованы и улучшены. Теперь вы можете использовать Inflector::rules() для создания собственных правил.
Inflector::rules('singular', array(
'rules' => array('/^(bil)er$/i' => '\1', '/^(inflec|contribu)tors$/i' => '\1ta'),
'uninflected' => array('singulars'),
'irregular' => array('spins' => 'spinor')
));
Переименованные файлы и внутренние изменения
Изменение имен библиотек
Библиотеки ядра libs/session.php, libs/socket.php, libs/model/schema.php и libs/model/behavior.php были переименованы для соответствия имен файлов классам, содержащимся в них:
-
session.php ⇒ cake_session.php
- App::import('Core', 'Session') ⇒ App::import('Core', 'CakeSession')
-
socket.php ⇒ cake_socket.php
- App::import('Core', 'Socket') ⇒ App::import('Core', 'CakeSocket')
-
schema.php ⇒ cake_schema.php
- App::import('Model', 'Schema') ⇒ App::import('Model', 'CakeSchema')
-
behavior.php ⇒ model_behavior.php
- App::import('Core', 'Behavior') ⇒ App::import('Core', 'ModelBehavior')
В большинстве случаев, эти изменения не повлияют на пользовательский код.
Наследование от Object
Следующие классы теперь не унаследованы от Object:
- Router
- Set
- Inflector
- Cache
- CacheEngine
Библиотеки классов
CakeSession
- del устарел, используйте delete
Folder
- mkdir устарел, используйте create
- mv устарел, используйте move
- ls устарел, используйте read
- cp устарел, используйте copy
- rm устарел, используйте delete
Set
- isEqual устарел, используйте == or ===.
String
- getInstance устарел, вызывайте метод statically библиотеки String.
Router
Routing.admin устарел. Вместо него используйте Routing.prefixes. Дополнительные префиксы роутов в 1.3 не требуют ручного объявления. Все роуты создадутся автоматически, просто добавьте новый префикс в ваш core.php.
//from:
Configure::write('Routing.admin', 'admin');
//to:
Configure::write('Routing.prefixes', array('admin'));
Смотрите новое руководство для получения дополнительной информации об использовании префиксов роутов.
Небольшое изменение было также сделано для параметров роутов. Параметры роутов теперь могут состоять только из алфавитно-цифровых символов, - и _ или / [A-Z0-9-_ +] + /.
Router::connect('/:$%@#param/:action/*', array(...)); //Плохо
Router::connect('/:can/:anybody/:see/:m-3/*', array(...)); //Приемлемо
В версии 1.3 внутреннее устройство роутов было сильно переработано, для увеличения производительности и снижения беспорядка в коде. Так же было удалено два вида роутов, так как они работали довольно проблематично. Первый удаленный вид роутов - с использованием регулярных выражений. Вы больше не можете создавать роуты типа:
Router::connect('/([0-9]+)-p-(.*)/', array('controller' => 'products', 'action' => 'show'));
Второй удаленный вид роутов - с использованием шаблона-звезды в середине роута.
Router::connect(
'/pages/*/:event',
array('controller' => 'pages', 'action' => 'display'),
array('event' => '[a-z0-9_-]+')
);
Помимо этих двух случаев, роуты в CakePHP 1.3 ведут себя в точности как это было в версии 1.2.
Debugger
- Debugger::checkSessionKey() переименован в Debugger::checkSecurityKeys()
- Debugger::output("text") больше не работает. Используйте Debugger::output("txt").
Object
- Object::$_log удален. CakeLog::write теперь статический метод. Смотри новые возможности управления логами.
Sanitize
- Sanitize::html() теперь всегда возвращает экранированную строку. В прошлом использование параметра $remove позволяло пропускать преобразование в html-сущности, возвращая потенциально опасные данные.
- Sanitize::clean() теперь всегда работает с опцией remove_html.
Configure и App
- Configure::listObjects() заменен на App::objects()
- Configure::corePaths() заменен на App::core()
- Configure::buildPaths() заменен на App::build()
- Configure теперь не управляет путями.
- Configure::write('modelPaths', array...) заменен на App::build(array('models' => array...))
- Configure::read('modelPaths') заменен на App::path('models')
- Режим отладки debug = 3 теперь не поддерживается. Переменная $cakeDebug так же удалена из View::renderLayout, вы должны удалить её из шаблонов для избежания ошибок.
- Configure::load() теперь может загружать конфигурационные файлы с плагинов. Для этого используйте Configure::load('plugin.file'). Все конфигурационные файлы вашего приложения, которые используют . (точку) в названии должны быть переименованы с использованием _
Cache
Cache претерпел значительный рефракторинг в CakePHP1.3, сосредоточенный вокруг уменьшения числа и частоты вызовов методов. Конечным результатом стало значительное улучшение производительности и лишь незначительные изменения в API.
Теперь вы можете использовать не один тип кэширования, а несколько, создавая разные конфигурации кэша с помощью Cache::config(). Следовательно, необходимость в методе Cache::engine() отпала и он был удален. В дополнение, Cache::isInitialized()сейчас проверяет конфигурационное имя кэша, а не его тип. Так же смотри в руководстве о новых возможностях про новые методы класса Cache.
Следует отметить, что использование приложения / библиотеки или плагина кэша для конфигурации кэша по умолчанию может вызвать проблемы с производительностью, так как при импорте эти классы всегда будет некэшированными. Для избегания этого рекомендуется либо использовать один из основных двигателей кэша по умолчанию, или вручную подключать кэширование, прежде чем создавать его конфигурацию. Кроме того, любые неосновные конфигурации кэша должны быть сделаны в app/config/bootstrap.php по причинам, указанным выше.
Виды и помощники
View
- View::renderElement удален. Используйте View::element().
- Поддержка расширения .thtml для view-файлов удалена. Используйте $this->ext = 'thtml'; в ваших контроллерах, или измените расширение ваших файлов на .ctp
- View::set('title', $var) больше не определяет значение переменной $title_for_layout когда обрабатывает шаблон. Чтобы определить переменную $title_for_layout используйте $this->set('title_for_layout', $var).
- View::$pageTitle удалена. Используйте $this->set('title_for_layout', $var); .
- Переменная $cakeDebug удалена вместе с опцией debug = 3. Удалите её из ваших шаблонов для избегания ошибок.
Все основные помощники теперь не используют метод Helper::output(). Этот метод был использован некорректно и вызвал проблемы с выводом многих методов FormHelper.
TextHelper
- TextHelper::trim() устарел, используйте truncate().
-
В методе TextHelper::highlight() больше нет:
- Параметра $highlighter. Используйте $options['format'].
- Параметра $considerHtml. Используйте $options['html'].
-
В методе TextHelper::truncate() больше нет:
- Параметра $ending. Используйте $options['ending'].
- Параметра $exact. Используйте $options['exact'].
- Параметра $considerHtml. Используйте $options['html'].
PaginatorHelper
PaginatorHelper претерпел изменения, связанные с отображением методов prev(), next(), first() и last().
В неактивном состояние эти методы теперь отображаются в тэге <span> вместо <div>.
sort(), prev(), next() теперь добавляют имена классов при генерации html. prev() добавляет класс prev. next() добавляет класс next. sort() теперь добавляет направление сортировки, asc или desc.
FormHelper
- У метода FormHelper::dateTime() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- У метода FormHelper::year() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- У метода FormHelper::month() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- У метода FormHelper::day() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- У метода FormHelper::minute() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- У метода FormHelper::meridian() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- У метода FormHelper::select() теперь нет параметра $showEmpty. Используйте $attributes['empty'].
- Ссылки по умолчанию теперь генерируются без атрибута 'id'.
- FormHelper::submit() теперь может создавать не только type=submit.
- FormHelper::button() теперь создает элемент <button> взамен кнопки сброса формы. Если вы хотите сделать кнопку очистки используйте FormHelper::submit() с опцией 'type' => 'reset'.
- FormHelper::secure() и FormHelper::create() не создают скрытых полей. Вместо этого они создают скрытый элемент div.
Смотрите новые возможности использования форм.
HtmlHelper
- У метода HtmlHelper::meta() теперь нет параметра $inline. Он был слит с массивом $options.
- У метода HtmlHelper::link() теперь нет параметра $escapeTitle. Используйте $options['escape'].
- У метода HtmlHelper::para() теперь нет параметра $escape. Используйте $options['escape'].
- У метода HtmlHelper::div() теперь нет параметра $escape. Используйте $options['escape'].
- У метода HtmlHelper::tag() теперь нет параметра $escape. Используйте $options['escape'].
- У метода HtmlHelper::css() теперь нет параметра $inline. Используйте $options['inline'].
SessionHelper
- flash() теперь не выводится в шаблон автоматически. Поменяйте ваши вызовы $session->flash(); на echo $session->flash();.
CacheHelper
CacheHelper's вместе с Controller::$cacheAction изменились незначительно. В прошлом, если вы использовали $cacheAction для конкретных ключей базы, то после редактирования / удаления этих ключей, кэширование не работало. Вы так же могли устанавливать различные временные промежутки кэша для разных аргументов, но не для различных строк запроса. Оба эти ограничения / несоответствия были удалены. Если вам нужно кэшировать определенные аргументы, то вам придется обнаруживать и обновлять cacheAction в контроллере вручную.
На данный момент, в cookbookе об этом почему-то ничего не сказано, всё абсолютно так же, как было в версии 1.2 ...
TimeHelper
TimeHelper был переработан, чтобы сделать его более дружественным i18n. Внутри класса все вызовы date() заменены на strftime(). Остальные изменения в API для TimeHelper:
- TimeHelper::format() теперь принимает первым параметром временную строку и строку формата вторым параметром. Формат времени должен быть в стиле strftime(). Метод будет автоматически конвертировать временную строку в формат даты, предпочтительную для текущей локали.
- Добавлен метод TimeHelper::i18nFormat().
Устаревшие помощники
JavascriptHelper и AjaxHelper устарели, теперь следует использовать JsHelper + HtmlHelper вместо них.
Вы должны заменить
- $javascript->link() на $html->script()
- $javascript->codeBlock() на $html->scriptBlock() или $html->scriptStart() и $html->scriptEnd().
Котроллер и компоненты
Controller
- Controller::set() больше не изменяет $var_name в $varName.
- Controller::set('title', $var) больше не устанавливает значение для переменной $title_for_layout. Используйте $this->set('title_for_layout', $var).
- Controller::$pageTitle удален. Используйте $this->set('title_for_layout', $var);.
- Controller получил два новых метода startupProcess и shutdownProcess. Эти методы отвечают за обработку при запуске контроллера и при остановке процессов .
Component
- Component::triggerCallback добавлен. Его использование предпочтительнее, чем вызов методов Component::startup(), Component::shutdown() и Component::beforeRender().
CookieComponent
- del устарел, используйте delete
RequestHandlerComponent
- getReferrer устарел, используйте getReferer
SessionComponent & SessionHelper
- del устарел, используйте delete
SessionComponent::setFlash() в версии 1.2 вторым параметром принимал название шаблона, который использовался для обертки. В версии 1.3 шаблон заменен на элемент.
SessionComponent и SessioHelper теперь не загружаются автоматически, они должны подключаться так же, как и обычные помощники / компоненты.
var $components = array('Session', 'Auth', ...);
var $helpers = array('Session', 'Html', 'Form' ...);
Модель и база данных.
Model
- Model::del() и Model::remove() удалены, используйте Model::delete().
- Model::findAll, findCount, findNeighbours удалены.
- Функция setTablePrefix() удалена вместе с возможностью изменить префикс таблицы в ходе работы программы. Префикс должен быть задан в свойстве $tablePrefixy, специфические названия таблиц должны быть определены через метод Model::__construct().
-
У метода Model::saveAll() изменена опция 'validate':
- true - проверяет каждую запись перед сохранением.
- false - отключает валидацию данных перед сохранением.
- 'first' - проверяет все записи перед сохранением.
- 'only' - проверяет все записи, но не сохраняет их.
Datasources
- DataSource::exists() была переработана для использования с моделями, которые не имеют базы данных. Раньше, если вы устанавливали var $useTable = false; var $useDbConfig = 'custom';, Model::exists() возвращала только false. Это заставляло разработчиков создавать уродские хаки, для того, чтобы была возможность корректно использовать create() или update().
Databases
Конфигурации баз данных не будут поддерживать ключ 'connect' (он считается устаревшим). Вместо этого, установите параметр 'persistent' => true или false для определения, будет ли соединение с базой данных постоянным или нет.
Логи SQL
В версии CakePHP 1.3 логи SQL хранятся не внутри DboSource, а вынесены в отдельный элемент, называемый sql_dump.
<?php echo $this->element('sql_dump'); ?>
Элемент sql_dump будет делать вывод логов, когда настройка Configure::read('debug') будет установлена в значение 2. Вы можете изменить внешний вид вывода логов, через файл app/views/elements/sql_dump.ctp
Vendors, Test Suite и schema
vendors/css, vendors/js, and vendors/img
Поддержка эти трех директорий, так же как и app/vendors и plugin/vendors была удалена.
Test Suite и Unit Tests
Групповые тесты должны проводиться с помощью класса TestSuite вместо устаревшего GroupTest.
Vendor, plugin and theme assets
Вендоры были удалены в пользу плагинов и тем.
Каталог app/config/sql заменен на app/config/schema, хотя config/sql еще работает в версии 1.3. В будущих версиях поддержка этого названия будет прекращена.