Цель выпуска этой версии — получение обратной связи от сообщества и обнаружение максимума ошибок.
Краткий анонс важных нововведений этой версии:
- Многоуровневое кеширование
- Улучшения в шаблонизаторе Volt
- Горизонтальный и вертикальный шардинг
- Запись состояния (Record Snapshots)
- Динамическое обновление
- Валидация
1. Многоуровневое кеширование
Новая возможность компонента кеширования позволяет разработчику осуществлять кеш в несколько уровней. Возможность будет полезна при сохранении кеша в нескольких местах (системах кеширования) с разным временем жизни, и последующим поочерёдным чтением из них начиная с самого быстрого (в порядке регистрации) и заканчивая самым медленным, пока срок жизни во всех них не истечет.
<?php $ultraFastFrontend = new Phalcon\Cache\Frontend\Data(array( "lifetime" => 3600 )); $fastFrontend = new Phalcon\Cache\Frontend\Data(array( "lifetime" => 86400 )); $slowFrontend = new Phalcon\Cache\Frontend\Data(array( "lifetime" => 604800 )); //Backends are registered from the fastest to the slower $cache = new \Phalcon\Cache\Multiple(array( new Phalcon\Cache\Backend\Apc($frontCache, array( "prefix" => 'cache', )), new Phalcon\Cache\Backend\Memcache($fastFrontCache, array( "prefix" => 'cache', "host" => "localhost", "port" => "11211" )), new Phalcon\Cache\Backend\File($slowestFrontCache, array( "prefix" => 'cache', "cacheDir" => "../app/cache/" )); )); // Сохранение, сохраняется сразу во все системы кеширования $cache->save('my-key', $data); // Получение, читается сразу со всех систем где кеш еще живой $data = $cache->get('my-key');
2. Улучшения в шаблонизаторе Volt
Volt (написанный так же на Си) получил в этой версии несколько новых возможностей:
{# Тернарный оператор #} {{ total > 0 ? total|format('%0.2f') : '0.0' }} {# Поддержка For-Else #} {% for robot in robots %} {{ robot.name }} {% else %} There are no robots {% endfor %} {# Циклы внутри контекста #} <table> {% for robot in robots %} {% if loop.first %} <thead> <tr> <th>Position</th> <th>Id</th> <th>Name</th> </tr> </thead>ae <tbody> {% endif %} <tr> <th>{{ loop.index }}</th> <th>{{ robot.id }}</th> <th>{{ robot.name }}</th> </tr> {% if loop.last %} <tbody> {% endif %} {% endfor %} </table> {# Контролирование пробелов в разделении (Space control delimiters) #} <ul> {%- for robot in robots -%} <li> {{- robot.name -}}</li> {%- endfor %} </ul>
3. Горизонтальный и вертикальный шардинг
Теперь для записи и чтения из базы данных можно использовать разные соединения. Полезность проявляется при работе с master/slave конфигурацией СУБД:
class Robots extends Phalcon\Mvc\Model { public function initialize() { $this->setReadConnectionService('dbSlave'); $this->setWriteConnectionService('dbMaster'); } }
Также возможен горизонтальный шардинг, когда соединение выбирается в зависимости от запрашиваемых данных:
class Robots extends Phalcon\Mvc\Model { public function selectReadConnection($intermediate, $bindParams, $bindTypes) { // Проверяем, есть ли в запросе условие 'where' if (isset($intermediate['where'])) { $conditions = $intermediate['where']; // Выбираем соединение в зависимости по требуемому условия if ($conditions['left']['name'] == 'id') { $id = $conditions['right']['value']; if ($id > 0 && $id < 10000) { return $this->getDI()->get('dbShard1'); } if ($id > 10000) { return $this->getDI()->get('dbShard2'); } } } // В остальных случаях используем соединение по умолчанию return $this->getDI()->get('dbShard0'); } }
4. Запись состояния (Record Snapshots)
Теперь в моделях может быть установлено свойство для хранения значений полей в момент запроса. Вы можете использовать эту функцию для аудита или проверки изменения значений полей в процессе работы:
class Robots extends Phalcon\Mvc\Model { public function initalize() { $this->keepSnapshots(true); } }
Так можно проверить значения каких полей были изменены:
$robot = new Robots(); $robot->name = 'Other name'; var_dump($robot->getChangedFields()); // ['name'] var_dump($robot->hasChanged('name')); // true var_dump($robot->hasChanged('type')); // false
5. Динамическое обновление
Позволяет ORM при формирования SQL запроса UPDATE использовать в нём только те поля, значения которых были изменены, а не собирать все поля и все их значения. Это уменьшает трафик между серверами приложения и базы данных, что в свою очередь может благоприятно сказаться на производительности:
class Robots extends Phalcon\Mvc\Model { public function initalize() { $this->useDynamicUpdate(true); } }
6. Валидация
Новый компонент Phalcon\Validation позволяет осуществлять независимую проверку данных. Компонент основан на проверках уже реализованных в ORM и ODM. С его помощью можно проверять данные не связанные с какой-либо моделью или коллекцией:
$validation = new Phalcon\Validation(); $validation ->add('name', new PresenceOf(array( 'message' => 'Поле name обязательно для заполнения' ))) ->add('name', new StringLength(array( 'min' => 5, 'minimumMessage' => 'Значение поля name слишком короткое' ))) ->add('email', new PresenceOf(array( 'message' => 'Поле email обязательно для заполнения ' ))) ->add('email', new Email(array( 'message' => 'Email не соответствует формату' ))) ->add('login', new PresenceOf(array( 'message' => 'Поле login обязательно для заполнения' ))); $messages = $validation->validate($_POST); if (count($messages)) { foreach ($messages as $message) { echo $message; } }
Этот выпуск так же содержит другие улучшения и исправления, вы можете узнать их все прочитав полный список изменений или его же на русском в русской группе поддержки Phalcon вконтакте.
Помочь с тестированием
Получить эту версию можно с GitHub из ветки 1.0.0:
git clone http://github.com/phalcon/cphalcon cd build git checkout 1.0.0 sudo ./install
Пользователи Windows могут скачать готовую библиотеку DLL на странице загрузки.
С радостью примем ваши замечания и предложения на Phosphorum, Stack Overflow или Google Group. Если вы обнаружили ошибку и можете сформировать тест для её повторения или решения — отправте нам pull request или создайте issue на GitHub.
P.S. Перевод вольный с дополнениями, оригинал здесь.
Для поддержки фреймворка создана група вконтакте, русский сайт и начата локализации документации, присоединяйтесь!
Есть так же другой перевод документации и примеров Phalcon PHP FrameWork
Права на оригинальное фото принадлежат Simon Roy: 500px.com/photo/7924712
ссылка на оригинал статьи http://habrahabr.ru/post/171915/
Добавить комментарий