Pull to refresh

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

Reading time 5 min
Views 20K
Сегодня группа разработчиков 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
Tags:
Hubs:
+96
Comments 49
Comments Comments 49

Articles