![]() ![]() ![]()
Какой рейтинг вас больше интересует?
|
![]()
Yii 2.0 beta2014-04-14 18:18:10 (читать в оригинале)Нам очень приятно сообщить о выходе бета-версии фреймворка Yii 2. Вы можете загрузить его с yiiframework.com. Бета включает в себя сотни новшеств, изменений и исправлений с релиза альфы. Далее мы сделаем обзор наиболее важного, но сначала ответим на часто задаваемые вопросы. Часто задаваемые вопросы
Большие изменения с альфа-версииПолный список изменений вы можете найти в CHANGELOG, а ниже мы опишем самое важное. СтруктураYii 2 начал использовать PSR-4 для загрузки классов. То есть:
Классы контроллеров теперь обязательно должны находится в пространстве имён, указанном в Также мы вернули поддержку группировки контроллеров в субдиректории, которая была в 1.1. Удобство использованияУдобство использования — один из наивысших приоритетов нашей команды. Именно поэтому мы уделяем много внимания именованию и тому, чтобы код нормально работал с различными IDE. Всё это позволяет сделать повседневную разработку более приятной. Мы перешли на стили кода PSR-1 и PSR-2 и получили поддержку многих IDE, автоматизированной проверки кода и автоматического форматирования. ПроизводительностьОдно из самых значительных изменений состоит в том, что сессия не стартует до тех пор, пока она действительно не понадобится. Это позволяет приложениям не тратить лишние ресурсы. Если в своих проектах вы используете Markdown, вы заметите, что скорость преобразования в HTML существенно возрасла. Это стало возможным после того, как Carsten Brandt (cebe), после рассмотрения существующих решений, написал с нуля свою библиотеку для этих целей. Кроме производительности, она лучше расширяется и поддерживает вариант markdown, используемый GitHub. БезопасностьТеперь Yii использует маскированые CSRF-токены для предотвращения атак типа BREACH. RBAC был переписан, вследствие чего стал проще. Бизнес-правила теперь оформляются в виде классов без всякого RESTful API frameworkДолгожданная возможность, появившаяся в бете — встроенный фреймворк для создания REST API. В данном обзоре мы не будем описывать его в деталях, а лишь перечислим основные особенности. Полное описание доступно в The Definitive Guide.
Dependency Injection и Service LocatorМногие спрашивали, почему в Yii нет контейнера Dependency Injection (DI). На самом деле Yii всегда предоставлял похожую
функциональность в виде Service Locator — экземпляра приложения Yii. Тепереь мы выделили service locator в отдельный
компонент Кроме Service Locator, мы также реализовали DI контейнер ТестированиеYii был интегрирован с Codeception. Это позволяет тестировать приложение в целом путём эмуляции действий пользователя и проверки правильности генерируемых ответов. В отличие от поддержки selenium в PHPUnit, Codeception не требует браузера, его проще поставить на CI-сервер и отрабатывает он гораздо быстрее. В Yii также добавлена поддержка фикстур, решающая проблему инициализации тестовых данных — одной из самых долгих и рутинных задач при написании тестов. Поддержка фикстур покрывает как их создание, так и применение. Также было реализовано расширение faker, которое помогает создавать близкие к реальным наборы данных. Оба шаблона приложений, как "basic", так и "advanced", поставляются вместе с тестами: модульными, функциональными и приёмочными. Надеемся, это будет хорошим стимулом применять разработку через тестирование. Валидация моделейВ валидации моделей произошло довольно много интересных улучшений. Валидаторы // 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']] Валидацию можно производить по условиям, которые задаются через свойства ['state', 'required', 'when' => function ($model) { return $model->country == Country::USA; }, 'whenClient' => "function (attribute, value) { return $('#country').value == 'USA'; }", ] Иногда требуется проверить данные, не привязанные к модели. Это можно сделать используя новый класс 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Мы добавили // найдёт все заказы и отсортирует их по id клиента и id заказа. При этом для "customer" будет использована жадная загрузка $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all(); // найдёт все заказы, в которых есть книги. При этом для "books" будет использована жадная загрузка $orders = Order::find()->innerJoinWith('books')->all(); Это особенно полезно при работе с связанными столбцами в GridView. Теперь, используя Преобразование типов данныхActiveRecord теперь конвертирует данные, полученные из базы в соответствующие типы. К примеру, если у вас в базе
столбец ПоискДля того, чтобы упростить задачу поиска мы добавили метод $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) { } Поддержка подзапросовВ постоитель запросов была добавлена поддержка вложенных запросов. Вы можете составить подзапрос как обычный объект
$subQuery = (new Query())->select('id')->from('user')->where('status=1'); $query->select('*')->from(['u' => $subQuery]); Обратные связиСвязи часто могут объявляться парами. К примеру, // 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 запроса можно объявить обратную связь для связей 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) хранилищ данных. В бете мы отрефакторили этот код и достигли
большего единообразия интерфейсов. А именно, был удалён Поддержка AJAXМы решили использовать отличную библиотеку Pjax и создали виджет 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-ом в этих контроллерах. Код был реорганизован и фильтры теперь находятся в пространстве имён public function behaviors() { return [ 'basicAuth' => [ 'class' => \yii\filters\auth\HttpBasicAuth::className(), 'exclude'=> ['error'], // не применяем к action "error" ], ]; } Инициализация компонентМы ввели в жизненный цикл приложения важный шаг инициализации ("bootstrap"). Расширения могут зарегистрировать
bootstrap-классы путём объявления их в Компонент bootstrap будет инстранциирован до того, как приложение начнёт обработку запроса. Это даёт компоненту возможность зарегистрировать обработчики событий и принять участие в жизненном цикле приложения. Работа с URLТак как разработчики очень много работают с URL, мы вынесли большинство относящихся к URL методов в хелпер 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 тоже имеются улучшения. Вы можете использовать новый класс |
![]() ![]() ![]()
Категория «Образование»
Взлеты Топ 5
Падения Топ 5
![]()
Популярные за сутки
|
Загрузка...

взяты из открытых общедоступных источников и являются собственностью их авторов.