Первая бета Phalcon 1.0.0

от автора

Сегодня граппа разработчиков Phalcon выпустило первую бета-версию фреймворка Phalcon 1.0.0. Для тех, кто не в курсе: Phalcon — это PHP-фреймворк, написанный на Си и работающий как расширение для PHP, прочитать про него на Хабре можно в статьях Phalcon — скомпилированный PHP MVC Framework и Phalcon: Давайте учиться на примере.
Цель выпуска этой версии — получение обратной связи от сообщества и обнаружение максимума ошибок.

Краткий анонс важных нововведений этой версии:

  1. Многоуровневое кеширование
  2. Улучшения в шаблонизаторе Volt
  3. Горизонтальный и вертикальный шардинг
  4. Запись состояния (Record Snapshots)
  5. Динамическое обновление
  6. Валидация


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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *