- PVSM.RU - https://www.pvsm.ru -

Мы рады объявить [1] о релизе новой версии Phalcon [2].
Прошло чуть больше двух месяцев с момента выпуска предыдущей версии, и команда разработчиков представляет один из самых больших и серьёзных релизов быстрейшего фреймворка [3] для PHP написанного как Си-расширение.
Новая версия содержит множество новых функций, исправлений ошибок и оптимизаций. Мы также обновили сайт и готовимся к большим обновлениям документации и описания API.
Нововведения Phalcon 1.2.0:
Скачать [18]
Новый девиз [19]
Благодарности [20]
Опция «compiledPath» в параметрах шаблонизатора Volt теперь принимает анонимную функцию, позволяющую выполнить необходимые действия перед записью файла кеша шаблона.
// Добавляем расширение .php к файлам шаблонов
$volt->setOptions([
'compiledPath' => function($templatePath) {
return $templatePath . '.php';
}
]);
// Создаём необходимые подкаталоги для файлов
$volt->setOptions([
'compiledPath' => function($templatePath) {
$dirName = dirname($templatePath);
if (!is_dir(CACHE_DIR . $dirName)) {
mkdir(CACHE_DIR . $dirName,0755,true);
}
return CACHE_DIR . $dirName . '/'. $templatePath . '.php';
}
]);
Для нашего шаблонизатора теперь можно добавлять любые требуемые расширения, менять поведение, операторы и добавлять функции и фильтры. Класс ниже, например, позволяет использовать в шаблонах любые php-функции:
class PhpFunctionExtension
{
public function compileFunction($name, $arguments)
{
if (function_exists($name)) {
return $name . '('. $arguments . ')';
}
}
}
Добавляем это расширение:
$volt->getCompiler()->addExtension(new PHPFunctionExtension());
Теперь можно указывать разные пути для ссылок, ведущих на статичные файлы: на картинки или, например, js файлы и для ссылок на страницы. Данная возможность особенно будет актуальна при использовании CDN.
$di['url'] = function() {
$url = new PhalconMvcUrl();
// Динамичный URI без mod-rewrite
$url->setBaseUri('/index.php?_url=');
// Статичный URI для CSS/Javascript/Images
$url->setStaticUri('/static/');
return $url;
};
Компонент представляет собой более лёгкую альтернативу PhalconMvcView, без поддержки иерархии шаблонов. Он будет актуален для использования в микро-приложениях и получения представлений в виде строки.
// View service
$di['view'] = function() {
$view = new PhalconMvcViewSimple();
$view->setViewsDir(APP_PATH . '/views/');
return $view;
};
Использование в микро-приложениях:
$app->map('/login', function() use ($app) {
echo $app->view->render('security/login', array(
'form' => new LoginForm(),
));
});
Компонент поддерживает разные шаблонизаторы и кеширование шаблонов.
Получать и отправлять данные в JSON-формате стало намного проще. Передав данные в PhalconHttpResponse, они будут автоматически отправлены в JSON-формате:
$app->post('/api/robots', function() use ($app) {
$data = $app->request->getJsonRawBody();
$robot = new Robots();
$robot->name = $data->name;
$robot->type = $data->type;
$response = new PhalconHttpResponse();
// проверка правильности сохранения
if ($robot->success() == true) {
$response->setJsonContent([
'status' => 'OK',
'id' => $robot->id
]);
} else {
// установка кода HTTP статуса
$response->setStatusCode(500, "Internal Error");
$response->setJsonContent([
'status' => 'ERROR',
'messages' => $status->getMessages()
]);
}
return $response;
});
Наша ORM стала поддерживать отношение многие-ко-многим. Это позволяет установить прямые отношения между двумя моделями с использованием третей модели, промежуточной:
class Artists extends PhalconMvcModel
{
public $id;
public $name;
public function initialize()
{
$this->hasManyToMany(
'id',
'ArtistsSongs',
'artists_id', 'songs_id',
'Songs',
'id'
);
}
}
Песни исполнителей можно получить через псевдоним отношения:
$artist = Artists::findFirst();
// получим все песни исполнителя
foreach ($artist->songs as $song) {
echo $song->name;
}
С отношениями многие-ко-многим можно работать в PHQL ( это надстройка над SQL, упрощающая использование моделей и построение sql запросов ):
$phql = 'SELECT Artists.name, Songs.name FROM Artists JOIN Songs WHERE Artists.genre = "Trip-Hop"';
$result = $this->modelsManager->query($phql);
Связанные данные могут быть добавлены сразу при создании модели, все необходимые промежуточные связующие записи будут созданы также автоматически:
$songs = array()
$song = new Song();
$song->name = 'Get Lucky';
$songs[] = $song;
$song = new Song();
$song->name = 'Instant Crush';
$songs[] = $song;
$artist = new Artists();
$artist->name = 'Daft Punk';
$artist->songs = $songs; // назначаем связанные элементы
$artist->save();
При указании Virtual foreign keys все связанные с основной записью зависимые элементы будут так же удалены:
use PhalconMvcModel
PhalconMvcModelRelation;
class Artists extends Model
{
public $id;
public $name;
public function initialize()
{
$this->hasMany('id', 'Songs', 'artists_id', [
'foreignKey' => [
'action' => Relation::ACTION_CASCADE
]
]);
}
}
При удалении исполнителя удалятся также и все его песни:
$artist = Artists::findFirst();
$artist->delete(); // удалится со всеми песнями
Мы научили компонент PhalconAssets не только гибко управлять статичными ресурсами, группировать и фильтровать их, но еще и сжимать JS/CSS (минифицировать). Для такой ответственной работы были использованы готовые решения Jsmin от Douglas Crockford и CSSMin от Ryan Day.
$manager = new PhalconAssetsManager(array(
'sourceBasePath' => './js/',
'targetBasePath' => './js/production/'
));
$manager
// собираем Javascripts в нижнюю часть страницы
->collection('jsFooter')
// название файла с результатом
->setTargetPath('final.js')
// адрес готового файла
->setTargetUri('production/final.js')
// можно использовать внешние файлы, даже без фильтрации
->addJs('code.jquery.com/jquery-1.10.0.min.js', true, false)
// локальные файлы надо пропустить через фильтр
->addJs('common-functions.js')
->addJs('page-functions.js')
// все файлы необходимо собрать в один ( final.js )
->join(true)
// использовать встроенный фильтр Jsmin
->addFilter(new PhalconAssetsFiltersJsmin())
// еще один фильтр, самописный для приложения
->addFilter(new MyAppAssetsFiltersLicenseStamper());
$manager->outputJs();
Внутри PHQL теперь нельзя использовать параметры напрямую, следующий код выдаст исключения:
$artist = Artists::findFirst("name = '$name'");
Разработчик теперь может передавать в partials массив параметров:
<?php $this->partial('footer', ['links' => $myLinks]);
Volt так же поддерживает эту возможность:
{{ partial('footer', ['links': myLinks]) }}
{% include 'footer' with ['links': myLinks] %}
Мы старательно уходим от использования любых статичных методов, они всё еще работаю, но использовать их не желательно. Компонент PhalconTag теперь доступен как сервис в DIFactoryDefault. Вместо:
PhalconTag is now a service in DIFactoryDefault. So instead of doing this:
Стоит использовать:
$this->tag->setDefault('name', $robot->name);
Работа с макросами только начата, дальше будет больше:
{%- macro input_text(name, attributes=null) -%}
{{- '<input type="' ~ name ~ '" ' -}}
{%- for key, value in attributes -%}
{{- key ~ '="' ~ value|e '"' -}}
{%- endfor -%}
{{- '/>' -}}
{%- endmacro -%}
{{ input_text("telephone", ['placeholder': 'Type telephone']) }}
До версии 1.1.0 при передаче в методы неверного числа параметров возникало предупреждение. Начиная с версии 1.2.0, в таких ситуациях будет создано исключение BadMethodCallException с возможностью проследить, где именно возникла ошибка:
<?php
$e = new PhalconEscaper();
$e->escapeCss('a {}', 1, 2, 3);
Отобразится:
Fatal error: Uncaught exception 'BadMethodCallException' with message 'Wrong number of parameters' in test.php:4
Stack trace:
#0 test.php(4): PhalconEscaper->escapeCss('a {}', 1, 2, 3)
#1 {main}
Компонент PhalconDebug формирует отладочный стэк, позволяя разработчику проследить в каком месте что-то пошло не так. Данные оформлены в структурированном виде. Для работы компонента необходимо удалить try/catch блоки в стартовом файле и указать в его начале:
(new PhalconDebug)->listen();
Мы подготовили небольшой скринкаст с демонстрацией работы компонента:
Есть еще несколько важных нововведений:
Полный список изменений доступен в CHANGELOG [22].
Собрать новую версию можно на GitHub [23], либо скачать готовые DLL библиотеки [24] для Windows. Доступны так же готовые сборки для некоторых linux-систем [25].Документация [26] так же обновлена.
Долгое время мы работали под девизом «The fastest PHP Framework», полностью ему соответствуя и поддерживая скорость работы Phalcon на максимуме. Мы оптимизировали всё, что можно и искали любые возможности по экономии расхода памяти и уменьшению накладных расходов. Но скорость — не единственный наш приоритет. От версии к версии мы старались делать Phalcon ещё более удобным и включать в него самые полезные возможности. Это позволило вырасти проекту в один из самых быстрых и функциональных продуктов в мире открытого ПО.
Двигаясь вперёд, мы решили изменить наш девиз для более точного позиционирования Phalcon. С версии 1.2.0 мы работаем под лозунгом «The best balance of speed and functionality». Наша первоочередная цель — сохранение оптимального баланса между скоростью работы фреймворка и функционалом, который он предоставляет. Мы реально хотим быть не только самым быстрым фреймворком для PHP, но и самым оптимальным по соотношению скорости и функционала.
Мы хотим поблагодарить всех участников сообщества, разработчиков, голосующих за новые функции и помогающих с их реализацией и проверкой. Всех, кто помогает с тестированием и улучшением документации.
Спасибо всем, кто помогает развивать Phalcon и участвует в жизни сообщества.
Спасибо вам!
Автор: boston
Источник [27]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/38372
Ссылки в тексте:
[1] объявить: http://blog.phalconphp.com/post/55004790452/phalcon-1-2-0-released
[2] Phalcon: http://phalconphp.com/
[3] быстрейшего фреймворка: http://docs.phalconphp.com/en/latest/reference/benchmark.html
[4] Динамические пути для скомпилированных шаблонов Volt: http://habrahabr.ru/post/186150/#1
[5] Расширение возможностей Volt: http://habrahabr.ru/post/186150/#2
[6] Ссылки для статичных и динамических путей в PhalconMvcUrl: http://habrahabr.ru/post/186150/#3
[7] PhalconMvcViewSimple: http://habrahabr.ru/post/186150/#4
[8] Улучшена работа с JSON: http://habrahabr.ru/post/186150/#5
[9] Поддержка Many-To-Many в ORM: http://habrahabr.ru/post/186150/#6
[10] Работа с виртуальными внешними ключами: http://habrahabr.ru/post/186150/#7
[11] Минификация Javascript и CSS: http://habrahabr.ru/post/186150/#8
[12] Запрет переменных (литералов) в PHQL: http://habrahabr.ru/post/186150/#9
[13] Расширены возможности Partials: http://habrahabr.ru/post/186150/#10
[14] Использование PhalconTag как сервиса: http://habrahabr.ru/post/186150/#11
[15] Макросы в Volt: http://habrahabr.ru/post/186150/#12
[16] BadMethodCallException вместо предупреждений: http://habrahabr.ru/post/186150/#13
[17] Компонент отладки: http://habrahabr.ru/post/186150/#14
[18] Скачать: http://habrahabr.ru/post/186150/#download
[19] Новый девиз: http://habrahabr.ru/post/186150/#motto
[20] Благодарности: http://habrahabr.ru/post/186150/#thanks
[21] Profiled Guided Optimizations: http://ru.wikipedia.org/wiki/Profile-guided_optimization
[22] CHANGELOG: https://github.com/phalcon/cphalcon/blob/1.2.0/CHANGELOG
[23] GitHub: https://github.com/phalcon/cphalcon
[24] DLL библиотеки: http://phalconphp.com/download/windows
[25] linux-систем: http://phalconphp.com/download
[26] Документация: http://docs.phalconphp.com/en/latest/index.html
[27] Источник: http://habrahabr.ru/post/186150/
Нажмите здесь для печати.