2. Особенности. Ничем не хуже ;)
● ПРОСТ в изучении и использовании;
● Невероятно БЫСТР в при настройках по умолчанию;
● Легко поддается РАСШИРЕНИЮ;
● Из коробки Вы получаете болшинство возможностей,
доступных в других популярных фреймворках;
● Размер исходного кода не превышает 7 Мб – ничего
лишнего;
● Возможность использования сторонних библиотек через
composer;
● Встроенная поддержка JQuery, Bootstrap;
● Располагает удобными средствами логгирования и отладки;
● Распространяется под открытой копилефт-лицензией.
И много других приятных мелочей...
3. Архитектура. Велосипед внатуре)
● Ice требует версии php 5.4 и выше;
● Модульная структура приложений;
● Каждый экшен – отдельный класс;
● Универсальный класслоадер;
● Обязательный маппинг схемы данных;
● Гибкая система конфигурации;
● Кеширование большинства сущностей;
● Быстрый доступ объектов из контейнера.
Удобство и понятность первыше всего
4. Что умеет Ice? Много чего...
● Route: Роутинг через конфигурационный файл. Гибкая и понятная настройка;
● Config: Очень и очень гибкое конфигурирование. Возможность
переопределить, дополнить любой параметр конфигурации.
● Environment: Возможность настроить свое окружение (достуны 3 окружения:
production, test и development)
● Action: Иерархический вызов экшена. Удобное конфигурирование и много
удобных плюшек (переопределение дефолтных значений);
● View_Render: Рендер любым из доступных рендеров в любой момент времени
(доступны: Ice:Php, Ice:Smarty, Ice:Twig и др.);
Data_Provider: Получение и сохранение данных в поставщиках (доступно:
Ice:Apc, Ice:Redis, Ice:Mysqli, Ice:Registry, Ice:Session и много других);
● Data_Source: Операции с источником данных - CRUD (пока доступен только
Ice:Mysqli);
● Query_Builder: Построение запроса в источнику данных;
● Code_Generator: Автогенерация экшенов, моделей и шаблонов;
● Validator: Их мало, но они есть. Создать свой – ноль проблем;);
● а также Form, Logger и другое (см. IceCore*).
5. Структура модуля
Любой модуль состоит из директорий:
● Config – Конфигурационные файлы
● Resource – Ресурсы модуля (javasript, css,
images, файлы локализации
● Source – Исходный код модуля
● Web – Document root веб-приложения
● Var – Служебные файлы
Продуманная организация файлов проекта
7. Новый проект в 3 команды
● Скачиваем Composer
$ curl -s http://getcomposer.org/installer | php
● С помощью Composer-а
устанавливаем фреймфорк Ice
$ php composer.phar create-project ifacesoft/ice Ice dev-master
● Создаем новый проект (модуль Ice)
$ ./Ice/cli Ice:Module_Create
У Вас все получится.
Удачи!
8. Модульность и с чем ее едят..
Конфиг модуля Blog (Config/Ice/Core/Module.php):
return [
'alias' => 'Blog',
'module' => [
'name' => 'my blog',
'url' => '',
'authors' => '',
'vcs' => 'mercurial',
'source' => '',
],
'modules' => [
ROOT_DIR . 'DbManager' => 'default'
ICE_DIR => '0.0'
]
];
● Как мы видим, конфиг задает параметры текущего модуля и
определяет его зависимости от других модулей (DbManager и
Ice – путь до фреймворка).
● Зависимости иерархичны, таким образом текущий модуль зависит
не только от указанных модулей, но и от их зависимостей тоже.
(Список модулей Model::get() возвращает абсолютно все
модули в отсортированном виде)
9. 3 окружения вашего проекта
● Production: Боевые настройки модуля – все что нужно кеширутся, отключен
вывод ошибок и т. д.
● Test: Мягкое кеширование (в файл или другое хранилище), включен полный
дебаг.
● Development: Кеширование отключено, работает автокодогенератор и др.
Определяем окружения в главном конфигурационном файле
(Config/Ice/Core/Config.php)
'IceCoreEnvironment' => [
'environments' => [
'/blog.global$/' => 'production',
'/blog.test$/' => 'test',
'/blog.local$/' => 'development',
],
],
● Окружения идентифицируются по хосту
● Настройки каждого из окружений определяются в другом файле
конфигураций(Config/Ice/Core/Environment.php)
Необходимо отметить, что настройки окружения наследуются
и переопределяют настройки выше стоящего окружения.
11. Co.. Command (Action)
● Экшен – это отдельный класс;
● Конфигурируется через поле $config или конфигурационный
файл;
● Реализуется всего один метод run.
<?php
namespace BlogAction;
use IceCoreAction;
use IceCoreAction_Context;
class Index extends Action
{
public static $config = [
'viewRenderClassName' => 'Ice:Smarty',
];
protected function run(array $input, Action_Context $actionContext)
{
return ['errors' => 'Need implement run() method of action class Index.'];
}
}
12. Model. Логично и интуитивно!
● Создание модели: $message = Message::create(['text'=>'message']);
● Сохранение модели: $message = $message->insert();
● Изменение модели: $message->update(['text' => 'text', 'author' => 'me']);
● Получение всех полей модели: $fields = $message->get();
● Получение первичного ключа: $pk = $message->getPk();
● Получение модели: $message = Message::getModel($pk, ['text']);
● Получение модели по полю: $message = Message::getBy('author', 'me', ['text']);
● Удаление модели: $message->delete();
● Получение коллекции моделей: $collection = Message::getCollection();
● Получение маппинга полей: $mapping = Message::getMapping();
● Получение схемы модели: $scheme = Message::getScheme();
● Получить форму модели; $form = Message::getForm();
● и много другого...
Возможности поистине колоссальны. (см. Ice/Core/Model.php)
13. View и View_Render
Из коробки 3 самых популятных шаблонизатора:
● Php;
● Smarty;
● Twig.
Особенности:
● Независимый рендер различных
представлений в одном запросе(сессии);
● Кеширование результата рендера;
● И другое..
14. Query и Query_Builder – он крутой!
● Получение билдера: $qb = Message::getQueryBuilder();
● Построение запроса select: $q = $qb->select(['/pk', 'text', 'author')->eq('author', 'me')->limit(1)->getQuery();
● Получение данных или модели из запроса: $data = $q->getData() или $model = $q->getModel();
SELECT `message_pk`, `text`, `author` from blog_message Message WHERE `author`=”me” LIMIT 0,1
● Запрос на вставку данных: $qb->insert(['text'=>'text2', 'author'=>'me'])->getQuery()->getData();
INSERT INTO blog_message (`text`, `author`) VALUES (“text2”, “me”)
● Запрос на изменение данных: $qb->update(['text'=>'text3'])->eq('author', 'me')->getQuery()->getData();
UPDATE blog_message SET `text`=”text3” WHERE `author`=”me”
● Запрос на удаление данных: $qb->delete([3, 5])->ne('author', 'me')->getQuery()->getData();
DELETE blog_message WHERE `message_pk` in (3,5) AND `author` <> “me”
● Запрос с join: $qb->select('text', 't')->left('Blog:Post', ['/name', 'owner'])->eq('author', 'me')->getQuery()->getData();
SELECT Message.`text` as `t`, Post.`post_name`, Post.`owner`
FROM blog_message Message
LEFT JOIN blog_post Post ON (Post.`post_pk`=Message.`post__fk`)
WHERE Message.`author`=”me”
Это лишь малая часть доступных возможностей
15. Data – Результат запроса
● Преобразование данных в модель: $model = $data->getModel();
● Преобразование данных в коллекцию: $collection = $data->getColledtion();
● Получение массива записей: $rows = $data->getRows();
● Получение одной записи: $row = $data->getRow();
● Получение колонки значений: $values = $data->getColumn();
● Получение единственного значения: $value = $data->getValue();
● Получение всех первичных ключей: $keys => $data->getKeys();
Вообще Data заслуживает более пристального внимания, но
для начала этой информации хватит
16. Containers. Они есть
● Быстрое получение объекта из
контенера: Class::getInstance($key);
● Хранение объектов в любом дата
провайдере;
● Встроенное кеширование;
● Автокодогенерация;
● Простота реализации.
На самом деле очень удобно
17. Data_Provider
● Все данные мы получаем именно из источника
данных, будь то ключ-значение хранилище,
база данных или обычный http-запрос.
● Настройка через конфиг окружений: для каждого
окружения могут быть определены свои
настройки
● В любой момент мы можем получить доступ к
необходимому источнику и передать, либо
получить данные из него.
Предсказуемое поведение
18. Data_Source
● Простое конфигурирование
● Переключение между схемами
● Реализация SELECT, INSERT, UPDATE,
DELETE
● Методы получения дата схемы (таблицы,
колонки, поля и их типы)
Ты их не видешь, а они есть)
19. Form
Типы полей формы:
● Hidden
● Text
● Date
● Checkbox
● Number
● Textarea
Создание формы
$form = Form::getInstance($formType)
->text('name', 'Имя', 'введите свое имя', ['Ice:Not_Empty', 'Ice:Length_Min' => 3)])
->text('email', 'Email', 'Enter your email', 'Ice:Email');
Сабмит формы
$form->submit();
Поля формы провалидируются автоматически
21. Code_Generator
На данный момент доступно:
● Генерация экшенов;
● Генерация моделей;
● Генерация валидаторов;
● Генерацмя шаблонов для 3-х шаблонизаторов (Php,
Smarty и Twig)
Этот список со временем будет только расширяться
22. Консольные команды
● Консольный интерфейс работает в
интерактивном режиме
● Экшены, вызванные из консоли обладают
всеми теми же возможностями что и
экшены, выполняемые после http-
запроса.
Примеры вызовов:
Создание модуля: $ ./Ice/cli Ice:Module_Create
Деполой модуля: $ ./MyProject/cli Ice:Module_Deploy
Обновление вендоров: $ ./MyProject/cli Ice:Composer_Update
23. Не далекое будущее Ice
● Миграции;
● Автокеширование экшенов;
● Уменьшение времени бустраппинга;
● Продолжение докуменирования кода (на 100%);
● Наполение хендбука, кукбука и осталього;
● Инсталятор готовых модулей;
● Добавление модулей в текущий модуль;
● Реализация Menu;
● Реализация Auth_Provider;
● Реализация Message_Provider;
● Безопасность. Роли. ACL;
● Демонстрационные модули (GuestBook, Blog, DbManager)
Вот не полный перечень задуманного на это год! ;-)
24. Если Вы это видете,
большое человеческое Спасибо!