![]() ![]() ![]()
Какой рейтинг вас больше интересует?
|
Главная /
Каталог блоговCтраница блогера RMCreative.ru - Блог/Записи в блоге |
![]() |
RMCreative.ru - Блог
Голосов: 1 Адрес блога: http://rmcreative.ru/feed/ Добавлен: 2008-06-12 21:34:00 блограйдером ZaiSL |
UWDC 2014, отчёт
2014-05-31 11:48:13 (читать в оригинале)UWDC в Челябинске прошёл замечательно. Спасибо за хорошую атмосферу, общение и отзывы, которые особо важны OpenSource разработчикам для поддержания боевого духа.
Отдельно спасибо тем, кто пригласил Сергея Логинова, поделившегося своим необычным опытом работы.
- Отзывы и фото
- Слайды с моего доклада
Именование версий ПО
2014-05-22 18:23:05 (читать в оригинале)Начиная с Yii 2.0 мы решили придерживаться простого стандарта семантического версионирования или, если кратко, semver. В рабочих проектах у меня он применяется уже давно.
Стандарт невероятно прост:
Учитывая номер версии МАЖОРНАЯ.МИНОРНАЯ.ПАТЧ, следует увеличивать:
- МАЖОРНУЮ версию, когда сделаны обратно несовместимые изменения API.
- МИНОРНУЮ версию, когда вы добавляете новый функционал, не нарушая обратной совместимости.
- ПАТЧ-версию, когда вы делаете обратно совместимые исправления.
Дополнительные обозначения для предрелизных и билд-метаданных возможны как дополнения к МАЖОРНАЯ.МИНОРНАЯ.ПАТЧ формату.
Полный текст на разных языках можно найти на semver.org
С Yii 1.1 на Yii 2.0, часть 1: PHP
2014-04-22 14:47:23 (читать в оригинале)Вопрос о переходе с 1.1 на 2.0 всплывает слишком часто, чтобы не разобрать его более детально. Начать, конечно, стоит с самого основного, а именно с PHP.
В Yii 1.1 использовался PHP 5.2. В некоторых местах можно было использовать элементы из 5.3. В Yii 2.0 используется PHP 5.4. Причём не просто используется, а используется по полной программе.
Итак, для перехода на 2.0 стоит изучить:
- Пространства имён.
- Анонимные функции.
- Короткий синтаксис массивов. Тут всё просто, вместо
array()
теперь[]
. - Короткий
echo
в виде<?=
. Доступен всегда. Используется во всех view-шаблонах фреймворка. При этом<?
пользоваться, как и ранее, небезопасно. - SPL.
- Позднее статическое связывание.
- datetime.
- Трейты.
- intl. В Yii2 многое из intl завёрнуто в компонент i18n, но не всё.
Буду на DevConf 2014 в Москве
2014-04-17 22:07:34 (читать в оригинале)14 июня в субботу в Москве пройдёт DevConf, на котором я буду рассказывать про вторую версию Yii (в зале) и, возможно, про обработку ошибок в PHP (на флипчартах).
Программа всё ещё формируется, но уже довольно интересна. Занятно будет послушать про архитектуру AVITO.ru, платёжные системы, асинхронный PHP, Codeception, Tarantool и другие интересные штуки.
DevConf всегда отличается особой атмосферой и отличными посиделками после конференции.
Сайт конференции http://devconf.ru/. Зарегистрироваться можно до 12 июня 2014.
Yii 2.0 beta
2014-04-14 18:18:10 (читать в оригинале)Нам очень приятно сообщить о выходе бета-версии фреймворка Yii 2. Вы можете загрузить его с yiiframework.com.
Бета включает в себя сотни новшеств, изменений и исправлений с релиза альфы. Далее мы сделаем обзор наиболее важного, но сначала ответим на часто задаваемые вопросы.
Часто задаваемые вопросы
Что значит бета? Бета означает стабильные набор возможностей и архитектуру. Начиная с беты и до GA (General Availability, стабильного релиза), мы будем заниматься, в основном, исправлением ошибок и документацией. Мы не собираемся изменять архитектуру фреймворка или добавлять какие-либо новые возможности. Стоит отметить, что поломки обратной совместимости всё ещё могут случаться, но мы попытаемся делать их как можно меньше, а сделанные детально описывать.
Когда будет стабильный релиз? Пока что мы не можем назвать точную дату. Так как следующий этап заключается, главным образом, в исправлении ошибок и доработке документации, мы думаем, что сильно много времени это не займёт.
Могу ли я использовать бету в моих проектах? Не стоит использовать бету в проектах с сжатыми сроками или если вы ещё не знакомы с Yii 2.0. Если это не про вас и вас не пугают изменения в фреймворке, можете попробовать. Мы слышали, что довольно много проектов уже запущены и работают на ветке
master
. Также помните, что минимальная версия PHP для работы фреймворка — 5.4.Есть ли документация по 2.0? Да, есть The Definitive Guide и API documentation. Гайд постоянно дополняется. Перевод на русский будет как только оригинал будет более-менее завершён.
Как мне обновить приложения с 1.1 на 2.0? На эту тему написан отдельнй раздел Upgrading from Yii 1.1. Стоит отметить, что так как 2.0 переписан полностью, обновление не будет тривиальной задачей. Тем не менее, если вы работали с 1.1, вам будет намного проще потому как между 1.1 и 2.0 много общего.
Как обновиться с альфы 2.0? Если вы обновляете альфу через Composer, стоит удалить всё, кроме
.gitignore
из директорииvendor
и запустить composer ещё раз. Сделать это необходимо лишь один раз и вам не придётся так поступать с каждым новым релизом. Полный список изменений, в том чисте и ломающих обратную совместимость, доступен в файле CHANGELOG.Как следить за разработкой 2.0? Вся разработка и обсуждения происходят на GitHub: https://github.com/yiisoft/yii2. Вы можете подписаться на обновления или поставить звёздочку чтобы получать уведомления об обновлениях. Также можно следить за нашим twitter https://twitter.com/yiiframework.
Большие изменения с альфа-версии
Полный список изменений вы можете найти в CHANGELOG, а ниже мы опишем самое важное.
Структура
Yii 2 начал использовать PSR-4 для загрузки классов. То есть:
- Структура директорий фреймворка стала проще.
- Структура директорий расширений стала проще.
- Фреймворк больше не загружает классы, именованные в стиле PEAR. Загрузка классов от этого упростилась и стала быстрее.
Классы контроллеров теперь обязательно должны находится в пространстве имён, указанном в Module::controllerNamespace
,
если конечно вы не используете Module::controllerMap
.
Также мы вернули поддержку группировки контроллеров в субдиректории, которая была в 1.1.
Удобство использования
Удобство использования — один из наивысших приоритетов нашей команды. Именно поэтому мы уделяем много внимания именованию и тому, чтобы код нормально работал с различными IDE. Всё это позволяет сделать повседневную разработку более приятной.
Мы перешли на стили кода PSR-1 и PSR-2 и получили поддержку многих IDE, автоматизированной проверки кода и автоматического форматирования.
Производительность
Одно из самых значительных изменений состоит в том, что сессия не стартует до тех пор, пока она действительно не понадобится. Это позволяет приложениям не тратить лишние ресурсы.
Если в своих проектах вы используете Markdown, вы заметите, что скорость преобразования в HTML существенно возрасла. Это стало возможным после того, как Carsten Brandt (cebe), после рассмотрения существующих решений, написал с нуля свою библиотеку для этих целей. Кроме производительности, она лучше расширяется и поддерживает вариант markdown, используемый GitHub.
Безопасность
Теперь Yii использует маскированые CSRF-токены для предотвращения атак типа BREACH.
RBAC был переписан, вследствие чего стал проще. Бизнес-правила теперь оформляются в виде классов без всякого eval
.
RESTful API framework
Долгожданная возможность, появившаяся в бете — встроенный фреймворк для создания REST API. В данном обзоре мы не будем описывать его в деталях, а лишь перечислим основные особенности. Полное описание доступно в The Definitive Guide.
- Быстрое прототипирование частых операций через ActiveRecord;
- Response format negotiation (по умолчанию поддерживается JSON и XML);
- Настраиваемая сериализация объектов. Можно выбрать сериализуемые поля.
- Правильное форматирование коллекций данных и ошибок валидации;
- Эффективный роутинг с полной поддержкой HTTP;
- Поддержка
OPTIONS
иHEAD
; - Аутентификация;
- Авторизация;
- Поддержка HATEOAS;
- HTTP-кеширование;
- Ограничение количества запросов.
Dependency Injection и Service Locator
Многие спрашивали, почему в Yii нет контейнера Dependency Injection (DI). На самом деле Yii всегда предоставлял похожую
функциональность в виде Service Locator — экземпляра приложения Yii. Тепереь мы выделили service locator в отдельный
компонент yii\di\ServiceLocator
. Как и раньше, и приложение и модули являются service locator-ами. Вы можете получить
сервис (в 1.1 он назвался компонент приложения) используя Yii::$app->get('something')
.
Кроме Service Locator, мы также реализовали DI контейнер yii\di\Container
. Он помогает создавать менее связанный код.
По предварительным данным, наш контейнер является одним из самых быстрых контейнеров DI на PHP. Вы можете использовать
Yii::$container->set()
для задания начальных значений классов. Старый метод Yii::$objectConfig
удалён.
Тестирование
Yii был интегрирован с Codeception. Это позволяет тестировать приложение в целом путём эмуляции действий пользователя и проверки правильности генерируемых ответов. В отличие от поддержки selenium в PHPUnit, Codeception не требует браузера, его проще поставить на CI-сервер и отрабатывает он гораздо быстрее.
В Yii также добавлена поддержка фикстур, решающая проблему инициализации тестовых данных — одной из самых долгих и рутинных задач при написании тестов. Поддержка фикстур покрывает как их создание, так и применение. Также было реализовано расширение faker, которое помогает создавать близкие к реальным наборы данных.
Оба шаблона приложений, как "basic", так и "advanced", поставляются вместе с тестами: модульными, функциональными и приёмочными. Надеемся, это будет хорошим стимулом применять разработку через тестирование.
Валидация моделей
В валидации моделей произошло довольно много интересных улучшений.
Валидаторы UniqueValidator
и ExistValidator
теперь поддерживают проверку нескольких столбцов. Ниже приведены несколько
примеров для unique
:
// a1 должен быть уникальным ['a1', 'unique'] // a1 должен быть уникален, но сравнивать будем с a2 ['a1', 'unique', 'targetAttribute' => 'a2'] // a1 и a2 вместе должны быть уникальны и оба поля получат сообщения об ошибке [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']] // a1 и a2 вместе должны быть уникальны, но только a1 получит сообщение об ошибке ['a1', 'unique', 'targetAttribute' => ['a1', 'a2']] // a1 должен быть уникален при сравнении его значения как с a2, так и с a3 ['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']]
Валидацию можно производить по условиям, которые задаются через свойства when
и whenClient
. Далее показан пример
обязательности поля "state" только в том случае, если выбранная страна "USA":
['state', 'required', 'when' => function ($model) { return $model->country == Country::USA; }, 'whenClient' => "function (attribute, value) { return $('#country').value == 'USA'; }", ]
Иногда требуется проверить данные, не привязанные к модели. Это можно сделать используя новый класс yii\base\DynamicModel
:
public function actionSearch($name, $email) { $model = DynamicModel::validateData(compact('name', 'email'), [ [['name', 'email'], 'string', 'max' => 128], ['email', 'email'], ]); if ($model->hasErrors()) { // неудачная валидация } else { // всё хорошо } }
База данных и Active Record
Всё связанное с базами данных — сильная сторона Yii. Набор возможностей был уже довольно интересен в альфа-версии, а бета принесла улучшения и новые возможности. В числе реализаций Active Record есть elasticsearch, redis и Sphinx search. А в бете появилась поддержка mongodb.
Поддержка вложенных транзакций
Yii теперь поддерживает вложенные транзакции. Вы можете начать транзакцию не беспокоясь о том, начата ли внешняя по отношению к данной транзакция.
Join
Мы добавили ActiveQuery::joinWith()
для поддержки создания SQL-запросов с JOIN использую уже объявленные связи AR.
Это особенно полезно, если вы хотите отфильтровать или отсортировать данные по полям из связанных таблиц. К примеру:
// найдёт все заказы и отсортирует их по id клиента и id заказа. При этом для "customer" будет использована жадная загрузка $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all(); // найдёт все заказы, в которых есть книги. При этом для "books" будет использована жадная загрузка $orders = Order::find()->innerJoinWith('books')->all();
Это особенно полезно при работе с связанными столбцами в GridView. Теперь, используя joinWith()
, очень легко сделать
по ним сортировку или отфильтровать.
Преобразование типов данных
ActiveRecord теперь конвертирует данные, полученные из базы в соответствующие типы. К примеру, если у вас в базе
столбец type
типа integer
, после получения соответствующего экземпляра ActiveRecord, type
будет типа integer
в PHP.
Поиск
Для того, чтобы упростить задачу поиска мы добавили метод Query::filterWhere()
, который автоматически убирает пустые
значения. К примеру, если у вас есть форма поиска с фильтром по полям name
и email
, то вы можете использовать
приведённый код для построения поискового запроса. Без данного метода вам бы пришлось проверять, ввёл ли пользователь
что-либо в поле и добавлять условие поиска только в этом случае. filterWhere()
делает такую проверку за вас.
$query = User::find()->filterWhere([ 'name' => Yii::$app->request->get('name'), 'email' => Yii::$app->request->get('email'), ]);
Пакетные запросы
Мы добавили поддержку пакетных запросов для работы с крупными объёмами данных. При использовании данной возможности мы получаем данные порциями, а не сразу. Это позволяет значительно экономить память. К примеру:
use yii\db\Query; $query = (new Query()) ->from('user') ->orderBy('id'); foreach ($query->batch() as $users) { // $users — массив из 100 или менее строк из таблицы user } // или, если хотите получать по одной строке за раз foreach ($query->each() as $user) { // $user — одна строка данных из таблицы user }
Вы можете использовать пакетные запросы и с ActiveRecord:
// выбираем по 10 клиентов за раз foreach (Customer::find()->batch(10) as $customers) { // $customers — массив 10 или менее объектов Customer } // выбираем по 10 клиентов за раз, перебираем по одному foreach (Customer::find()->each(10) as $customer) { // $customer — объект Customer } // пакетный запрос с жадной загрузкой foreach (Customer::find()->with('orders')->each() as $customer) { }
Поддержка подзапросов
В постоитель запросов была добавлена поддержка вложенных запросов. Вы можете составить подзапрос как обычный объект
Query
и далее использовать его в другом Query
:
$subQuery = (new Query())->select('id')->from('user')->where('status=1'); $query->select('*')->from(['u' => $subQuery]);
Обратные связи
Связи часто могут объявляться парами. К примеру, Customer
может содержать связь orders
, в Order
может содержать
связь customer
. В примере ниже можно заметить, что customer
заказа не тот же самый объект, что и изначальный, для
которого ищутся заказы. Вызов customer->orders
приведёт к новому SQL-запросу также, как и как вызов customer
заказа:
// SELECT * FROM customer WHERE id=1 $customer = Customer::findOne(1); // echoes "not equal" // SELECT * FROM order WHERE customer_id=1 // SELECT * FROM customer WHERE id=1 if ($customer->orders[0]->customer === $customer) { echo 'equal'; } else { echo 'not equal'; }
Чтобы избежать лишнего SQL запроса можно объявить обратную связь для связей customer
и orders
. Делается это при помощи
метода inverseOf()
:
class Customer extends ActiveRecord { // ... public function getOrders() { return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer'); } }
Теперь, если мы выполним приведённый код ещё раз, мы получим следующее:
// SELECT * FROM customer WHERE id=1 $customer = Customer::findOne(1); // echoes "equal" // SELECT * FROM order WHERE customer_id=1 if ($customer->orders[0]->customer === $customer) { echo 'equal'; } else { echo 'not equal'; }
Единообразные API для Relational Query
В альфе 2.0 в ActiveRecord мы реализовали поддержку как реляционных (например, MySQL), так
и noSQL (например, redis, elasticsearch, MongoDB) хранилищ данных. В бете мы отрефакторили этот код и достигли
большего единообразия интерфейсов. А именно, был удалён ActiveRelation
, а ActiveQuery
стал единой точкой входа для
выполнения запросов по связям и описания связей. Также мы добавили методы ActiveRecord::findOne()
и findAll()
.
Эти методы позволяют делать запросы по ключам или значениям столбцов, используя короткий синтаксис. Ранее это можно
было делать параметрами метода ActiveRecord::find()
, что вызывало путаницу из за возврата методом разных типов данных.
Поддержка AJAX
Мы решили использовать отличную библиотеку Pjax и создали виджет yii\widgets\Pjax
.
Это общий виджет, позволяющий добавить AJAX ко всему, что в него обёрнуто. К примеру, в него можно обернуть GridView
для
того, чтобы получить постраничную навигацию и сортировку без перезагрузки страницы:
use yii\widgets\Pjax; use yii\grid\GridView; Pjax::begin(); echo GridView::widget([ /*...*/ ]); Pjax::end();
Request и response
Кроме множества внутренних исправлений и улучшений, компоненты request и response подверглись и множеству изменений. Самое заметное заключается в том, что работа с request теперь выглядит так:
// получаем GET параметр из request, если его там нет, умолчание равно 1 $page = Yii::$app->request->get('page', 1); // получаем POST параметр из request, если его там нет, умлчание равно null $name = Yii::$app->request->post('name');
Ещё одно фундаментальное изменение состоит в том, что response теперь отсылается в самом конце работы приложения, что позволяет модифицировать заголовки и тело ответа как вы пожелаете и где вы пожелаете.
Класс request теперь умеет разбирать тело запроса в различных форматах, например JSON.
Фильтры
Весь механизм фильтрации был переосмыслен. Теперь вы можете включить фильтрацию action-ов на как уровне контроллера, так и на уровнях приложения или модуля. Это позволяет вам организовать иерархичные фильтры. К примеру, вы можете установить фильтр для модуля и он будет применяться ко всем его action-ам. В дополнение можно установить ещё один фильтр на некоторые контроллеры модуля. Этот фильтр будет применяться только к action-ом в этих контроллерах.
Код был реорганизован и фильтры теперь находятся в пространстве имён yii\filters
. К примеру, вы можете использовать
фильтр yii\filters\HttpBasicAtuh
для того, чтобы включить аутентификацию HTTP Basic Auth. Для этого он описывается в
контроллере или модуле:
public function behaviors() { return [ 'basicAuth' => [ 'class' => \yii\filters\auth\HttpBasicAuth::className(), 'exclude'=> ['error'], // не применяем к action "error" ], ]; }
Инициализация компонент
Мы ввели в жизненный цикл приложения важный шаг инициализации ("bootstrap"). Расширения могут зарегистрировать
bootstrap-классы путём объявления их в composer.json
. Обычный компонент также может быть зарегистрирован для bootstrap
если его объявить в Application::$bootstrap
.
Компонент bootstrap будет инстранциирован до того, как приложение начнёт обработку запроса. Это даёт компоненту возможность зарегистрировать обработчики событий и принять участие в жизненном цикле приложения.
Работа с URL
Так как разработчики очень много работают с URL, мы вынесли большинство относящихся к URL методов в хелпер Url
и получили
более приятный API:
use yii\helpers\Url; // текущий активный маршрут // например: /index.php?r=management/default/users echo Url::to(''); // тот же контроллер, другой action // например: /index.php?r=management/default/page&id=contact echo Url::toRoute(['page', 'id' => 'contact']); // тот же модуль, другие контроллер и action // например: /index.php?r=management/post/index echo Url::toRoute('post/index'); // абсолютный маршрут не зависит от того, какой контроллер делает запрос // например: /index.php?r=site/index echo Url::toRoute('/site/index'); // url для регистрозависимого имени `actionHiTech` текущего контроллера // например: /index.php?r=management/default/hi-tech echo Url::toRoute('hi-tech'); // url для action в контроллере с регистрозависимым именем, `DateTimeController::actionFastForward` // например: /index.php?r=date-time/fast-forward&id=105 echo Url::toRoute(['/date-time/fast-forward', 'id' => 105]); // получаем URL из alias Yii::setAlias('@google', 'http://google.com/'); echo Url::to('@google/?q=yii'); // получаем канонический URL для текущей страницы // например: /index.php?r=management/default/users echo Url::canonical(); // получаем домашний URL // например: /index.php?r=site/index echo Url::home(); Url::remember(); // сохраняем URL Url::previous(); // получаем сохранённый URL
В правилах URL тоже имеются улучшения. Вы можете использовать новый класс y
![BlogRider сегодня BlogRider сегодня](/themes/1/i/menu/th/blogrider_today.png)
![Самый-самый блог Самый-самый блог](/themes/1/i/menu/tt/tough.png)
![Изменения рейтинга Изменения рейтинга](/themes/1/i/menu/th/rating_changes.png)
![]() | ||
+223 |
233 |
CAPTAIN |
+196 |
256 |
Yurenzo |
+185 |
193 |
Simple_Blogger |
+171 |
263 |
Annelle |
+166 |
246 |
Similis_Deo |
![]() | ||
-1 |
162 |
Литературное кафе "ИСКУССТВО" |
-1 |
154 |
Кому на Руси жить хорошо? |
-2 |
14 |
Фрамин |
-4 |
13 |
Miss Understanding |
-7 |
164 |
Lucy-sama |
![Главные темы Главные темы](/themes/1/i/menu/th/main_themes.png)
Загрузка...
![Загрузка... Загрузка...](/themes/1/i/loader/loader.gif)
взяты из открытых общедоступных источников и являются собственностью их авторов.