SlideShare a Scribd company logo
1 of 49
Download to read offline
Yii1 => Yii2 
или "Назад в будущее" 
Алексей Смолянов 
Контакты: 
Email: info@root.zt.ua 
Skype: alexei.smolyanov 
Twitter: @Dlittledev
Начнем с выбора
Кодить или не кодить ?
Наш выбор
PHP 
Относительно легок в освоении 
Большое сообщество 
Масса библиотек, фреймворков и тд 
Развивается
О фреймворках 
Не всегда нужны 
Избыточны 
Монстрообразны 
Переусложнены 
Оптимальны 
Мой - самый лучший!
Какой же выбрать ?
Мы выбрали Yii
Почему Yii? 
Легкий (в меру) 
Гибкий 
Расширяемый 
Поддерживается (не в пример kohana etc.) 
Довольно большое комьюнити 
Русскоязычный разработчик (-и) ядра 
Плагины/Расширения 
Документация
Спасибо за внимание
А теперь поехали!
Yii2 
Latest News 
OCT 12, 2014 
Yii 2.0.0 is released 
Yii 2.0 is finally coming, after more than three years of intensive 
development with almost 10,000 commits by over 300 authors! 
Thank you for your support and patience! 
DEC 3, 2008 
Yii 1.0.0 is released
Развертывание 
Git clone 
Archive 
cp /path-from /path-to 
миграции для БД 
Yii2 - composer!
Миграции 
class m101129_185401_create_news_table extends yiidbMigration 
{ 
public function up() 
{ 
$this->createTable('news', [ 
'id' => 'pk', 
'title' => Schema::TYPE_STRING . ' NOT NULL', 
'content' => Schema::TYPE_TEXT, 
] 
); 
} 
public function down() 
{ 
$this->dropTable('news'); 
} 
}
Типы приложений 
Yii1 
basic 
many ends - вручную 
Yii2 
basic 
minimal (Макаров) 
advanced
Окружения и конфиги 
backend 
common 
console 
environments 
frontend
Конфиги 
Конфиги 
common/config/main.php 
common/config/main-local.php 
frontend/config/main.php 
frontend/config/main-local.php 
Параметры 
common/config/params.php 
common/config/params-local.php 
frontend/config/params.php 
frontend/config/params-local.php
Окончательный конфиг
Жизненный цикл приложения
Request 
HTTP Headers 
// $headers is an object of yiiwebHeaderCollection 
$headers = Yii::$app->request->headers; 
// returns the Accept header value 
$accept = $headers->get('Accept'); 
if ($headers->has('User-Agent')) { 
// there is User-Agent header 
} 
Быстрый доступ к заголовкам 
userAgent 
contentType 
acceptableContentTypes 
acceptableLanguages
Response 
$headers = Yii::$app->response->headers; 
$headers->add('Pragma', 'no-cache'); 
$headers->set('Pragma', 'no-cache'); 
$values = $headers->remove('Pragma'); 
Yii::$app->response->content = 'hello world!'; 
$response = Yii::$app->response; 
$response->format = yiiwebResponse::FORMAT_JSON; 
$response->data = ['message' => 'hello world'];
MVC 
Модель 
Вид 
Контроллер
Контроллер 
Filters 
Actions
Готовые фильтры 
public function behaviors() 
{ 
return [ 
[ 
'class' => 'yiifiltersHttpCache', 
'only' => ['index', 'view'], 
'lastModified' => function ($action, $params) { 
$q = new yiidbQuery(); 
return $q->from('user')->max('updated_at'); 
}, 
], 
]; 
}
Готовые фильтры 
use yiifiltersPageCache; 
use yiicachingDbDependency; 
public function behaviors() 
{ 
return [ 
'pageCache' => [ 
'class' => PageCache::className(), 
'only' => ['index'], 
'duration' => 60, 
'dependency' => [ 
'class' => DbDependency::className(), 
'sql' => 'SELECT COUNT(*) FROM post', 
], 
'variations' => [ 
Yii::$app->language, 
] 
], 
]; 
}
Модель
Модель 
Атрибуты (свойства) 
Лейблы атрибутов 
Валидация 
Сценарии валидации 
Массовое присваивание 
Поведения 
Скоупы (scopes)
Полезные штуки: sluggable 
public function behaviors() 
{ 
return [ 
[ 
'class' => SluggableBehavior::className(), 
'attribute' => 'title', 
'slugAttribute' => 'slug', 
], 
]; 
}
Полезные штуки: blamable 
public function behaviors() 
{ 
return [ 
[ 
'class' => BlameableBehavior::className(), 
'createdByAttribute' => 'author_id', 
'updatedByAttribute' => 'updater_id', 
], 
]; 
}
Полезные штуки: rate limiter 
public function behaviors() 
{ 
return [ 
'rateLimiter' => [ 
'class' => yiifiltersRateLimiter::className(), 
], 
]; 
}
Запросы в БД (DAO) 
// INSERT 
$connection->createCommand()->insert('user', [ 
'name' => 'Sam', 
'age' => 30, 
])->execute(); 
// INSERT multiple rows at once 
$connection->createCommand()->batchInsert('user', ['name', 'age'], [ 
['Tom', 30], 
['Jane', 20], 
['Linda', 25], 
])->execute(); 
// UPDATE 
$connection->createCommand()->update('user', ['status' => 1], 'age > 30') 
->execute(); 
// DELETE 
$connection->createCommand()->delete('user', 'status = 0')->execute();
Запросы в БД (Query builder) 
$query->select(['user.name AS author', 'post.title as title']) 
->from('user') 
->leftJoin('post', 'post.user_id = user.id'); 
Multiple conditions can simultaneously be set in where using the hash format: 
$query->where([ 
'status' => 10, 
'type' => 2, 
'id' => [4, 8, 15, 16, 23, 42], 
]); 
That code will generate the following SQL: 
WHERE (` ` = 10) AND (` ` = 2) AND (` ` IN (4, 8, 15, 16, 23, 42)) 
$query = (new Query()) 
->from('user') 
->orderBy('id'); 
foreach ($query->batch() as $users) { 
// $users is an array of 100 or fewer rows from the user table 
} 
// or if you want to iterate the row one by one 
foreach ($query->each() as $user) { 
// $user represents one row of data from the user table 
} 
status type id
Отображения (views) 
$this 
$this->context 
шаблоны 
темы 
виджеты 
формы
Формы 
$form = ActiveForm::begin([ 
'id' => 'login-form', 
'options' => ['class' => 'form-horizontal'], 
]) 
$form->field($model, 'username') 
$form->field($model, 'password')->passwordInput() 
<div class="form-group"> 
<div class="col-lg-offset-1 col-lg-11"> 
Html::submitButton('Login', ['class' => 'btn btn-primary']) 
</div> 
</div> 
ActiveForm::end() 
$form->field($model, 'password')->passwordInput() 
$form->field($model, 'username')->textInput() 
->hint('Please enter your name')->label('Name')
Полезные штуки: валидация по 
условию 
[ 
['state', 'required', 'when' => function($model) { 
return $model->country == 'USA'; 
}], 
] 
[ 
['state', 'required', 'when' => function ($model) { 
return $model->country == 'USA'; 
}, 'whenClient' => "function (attribute, value) { 
return $('#country').val() == 'USA'; 
}"], 
]
Полезные штуки: валидация "налету" 
$email = 'test@example.com'; 
$validator = new yiivalidatorsEmailValidator(); 
if ($validator->validate($email, $error)) { 
echo 'Email is valid.'; 
} else { 
echo $error; 
}
Полезные штуки: форматирование 
echo Yii::$app->formatter->asDate('2014-01-01', 'long'); 
// output: January 1, 2014 
echo Yii::$app->formatter->asPercent(0.125, 2); 
// output: 12.50% 
echo Yii::$app->formatter->asEmail('cebe@example.com'); 
// output: <a href="mailto:cebe@example.com">cebe@example.com</a> 
echo Yii::$app->formatter->asBoolean(true); 
// output: Yes 
echo Yii::$app->formatter->asDate(null); 
// output: (Not set) 
echo Yii::$app->formatter->format('2014-01-01', 'date'); 
// output: January 1, 2014 
echo Yii::$app->formatter->format(0.125, ['percent', 2]); 
// output: 12.50%
Полезные штуки: хелперы 
// Remember current URL 
Url::remember(); 
// Remember URL specified. See Url::to() for argument format. 
Url::remember(['product/view', 'id' => 42]); 
// Remember URL specified with a name given 
Url::remember(['product/view', 'id' => 42], 'product'); 
In the next request we can get URL remembered in the following way: 
$url = Url::previous(); 
$productUrl = Url::previous('product');
Полезные штуки: log target 
'bootstrap' => ['log'], 
'components' => [ 
'log' => [ 
'targets' => [ 
[ 
'class' => 'yiilogDbTarget', 
'levels' => ['error', 'warning'], 
], 
[ 
'class' => 'yiilogEmailTarget', 
'levels' => ['error'], 
'categories' => ['yiidb*'], 
'message' => [ 
'from' => ['log@example.com'], 
'to' => ['admin@example.com', 'developer@example.com'], 
'subject' => 'Database errors at example.com', 
], 
], 
], 
], 
],
Полезные штуки: кодогенератор
Полезные штуки: дебаггер
И много-много еще всего ...
Вопросы?
Спасибо за внимание! 
Yii1 => Yii2 
или "Назад в будущее" 
Алексей Смолянов 
Контакты: 
Email: info@root.zt.ua 
Skype: alexei.smolyanov 
Twitter: @Dlittledev

More Related Content

What's hot

Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаprivate_face
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Yandex
 
Yii2
Yii2Yii2
Yii2Noveo
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perlmayperl
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
 
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий ВахрушевАрхитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушевit-people
 
JDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажетсяJDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажетсяSQALab
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updatesAnton Ivanov
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Pavel Novitsky
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON
 
jQuery для ASP.NET разработчиков
jQuery для ASP.NET разработчиковjQuery для ASP.NET разработчиков
jQuery для ASP.NET разработчиковakrakovetsky
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 

What's hot (19)

Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кода
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 
Yii2
Yii2Yii2
Yii2
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perl
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
 
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий ВахрушевАрхитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
 
course js day 4
course js day 4course js day 4
course js day 4
 
JDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажетсяJDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажется
 
Yii development
Yii developmentYii development
Yii development
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updates
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation Future
 
jQuery для ASP.NET разработчиков
jQuery для ASP.NET разработчиковjQuery для ASP.NET разработчиков
jQuery для ASP.NET разработчиков
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 

Similar to Crazy owl yii1=> yii2

Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляцииPaul Klimov
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJSYura Bogdanov
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2Alexander Makarov
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Form api в drupal 7
Form api в drupal 7Form api в drupal 7
Form api в drupal 7dimateus
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debuggingaheadWorks
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практикеVitebsk Miniq
 

Similar to Crazy owl yii1=> yii2 (20)

Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляции
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Yserver
YserverYserver
Yserver
 
Ci
CiCi
Ci
 
My batis
My batisMy batis
My batis
 
Form api в drupal 7
Form api в drupal 7Form api в drupal 7
Form api в drupal 7
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
DOM & jQuery
DOM & jQueryDOM & jQuery
DOM & jQuery
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практике
 

Crazy owl yii1=> yii2

  • 1. Yii1 => Yii2 или "Назад в будущее" Алексей Смолянов Контакты: Email: info@root.zt.ua Skype: alexei.smolyanov Twitter: @Dlittledev
  • 3. Кодить или не кодить ?
  • 5. PHP Относительно легок в освоении Большое сообщество Масса библиотек, фреймворков и тд Развивается
  • 6. О фреймворках Не всегда нужны Избыточны Монстрообразны Переусложнены Оптимальны Мой - самый лучший!
  • 9. Почему Yii? Легкий (в меру) Гибкий Расширяемый Поддерживается (не в пример kohana etc.) Довольно большое комьюнити Русскоязычный разработчик (-и) ядра Плагины/Расширения Документация
  • 11.
  • 13. Yii2 Latest News OCT 12, 2014 Yii 2.0.0 is released Yii 2.0 is finally coming, after more than three years of intensive development with almost 10,000 commits by over 300 authors! Thank you for your support and patience! DEC 3, 2008 Yii 1.0.0 is released
  • 14. Развертывание Git clone Archive cp /path-from /path-to миграции для БД Yii2 - composer!
  • 15. Миграции class m101129_185401_create_news_table extends yiidbMigration { public function up() { $this->createTable('news', [ 'id' => 'pk', 'title' => Schema::TYPE_STRING . ' NOT NULL', 'content' => Schema::TYPE_TEXT, ] ); } public function down() { $this->dropTable('news'); } }
  • 16. Типы приложений Yii1 basic many ends - вручную Yii2 basic minimal (Макаров) advanced
  • 17. Окружения и конфиги backend common console environments frontend
  • 18. Конфиги Конфиги common/config/main.php common/config/main-local.php frontend/config/main.php frontend/config/main-local.php Параметры common/config/params.php common/config/params-local.php frontend/config/params.php frontend/config/params-local.php
  • 21. Request HTTP Headers // $headers is an object of yiiwebHeaderCollection $headers = Yii::$app->request->headers; // returns the Accept header value $accept = $headers->get('Accept'); if ($headers->has('User-Agent')) { // there is User-Agent header } Быстрый доступ к заголовкам userAgent contentType acceptableContentTypes acceptableLanguages
  • 22. Response $headers = Yii::$app->response->headers; $headers->add('Pragma', 'no-cache'); $headers->set('Pragma', 'no-cache'); $values = $headers->remove('Pragma'); Yii::$app->response->content = 'hello world!'; $response = Yii::$app->response; $response->format = yiiwebResponse::FORMAT_JSON; $response->data = ['message' => 'hello world'];
  • 23.
  • 24. MVC Модель Вид Контроллер
  • 26. Готовые фильтры public function behaviors() { return [ [ 'class' => 'yiifiltersHttpCache', 'only' => ['index', 'view'], 'lastModified' => function ($action, $params) { $q = new yiidbQuery(); return $q->from('user')->max('updated_at'); }, ], ]; }
  • 27. Готовые фильтры use yiifiltersPageCache; use yiicachingDbDependency; public function behaviors() { return [ 'pageCache' => [ 'class' => PageCache::className(), 'only' => ['index'], 'duration' => 60, 'dependency' => [ 'class' => DbDependency::className(), 'sql' => 'SELECT COUNT(*) FROM post', ], 'variations' => [ Yii::$app->language, ] ], ]; }
  • 29. Модель Атрибуты (свойства) Лейблы атрибутов Валидация Сценарии валидации Массовое присваивание Поведения Скоупы (scopes)
  • 30. Полезные штуки: sluggable public function behaviors() { return [ [ 'class' => SluggableBehavior::className(), 'attribute' => 'title', 'slugAttribute' => 'slug', ], ]; }
  • 31. Полезные штуки: blamable public function behaviors() { return [ [ 'class' => BlameableBehavior::className(), 'createdByAttribute' => 'author_id', 'updatedByAttribute' => 'updater_id', ], ]; }
  • 32. Полезные штуки: rate limiter public function behaviors() { return [ 'rateLimiter' => [ 'class' => yiifiltersRateLimiter::className(), ], ]; }
  • 33. Запросы в БД (DAO) // INSERT $connection->createCommand()->insert('user', [ 'name' => 'Sam', 'age' => 30, ])->execute(); // INSERT multiple rows at once $connection->createCommand()->batchInsert('user', ['name', 'age'], [ ['Tom', 30], ['Jane', 20], ['Linda', 25], ])->execute(); // UPDATE $connection->createCommand()->update('user', ['status' => 1], 'age > 30') ->execute(); // DELETE $connection->createCommand()->delete('user', 'status = 0')->execute();
  • 34. Запросы в БД (Query builder) $query->select(['user.name AS author', 'post.title as title']) ->from('user') ->leftJoin('post', 'post.user_id = user.id'); Multiple conditions can simultaneously be set in where using the hash format: $query->where([ 'status' => 10, 'type' => 2, 'id' => [4, 8, 15, 16, 23, 42], ]); That code will generate the following SQL: WHERE (` ` = 10) AND (` ` = 2) AND (` ` IN (4, 8, 15, 16, 23, 42)) $query = (new Query()) ->from('user') ->orderBy('id'); foreach ($query->batch() as $users) { // $users is an array of 100 or fewer rows from the user table } // or if you want to iterate the row one by one foreach ($query->each() as $user) { // $user represents one row of data from the user table } status type id
  • 35.
  • 36. Отображения (views) $this $this->context шаблоны темы виджеты формы
  • 37. Формы $form = ActiveForm::begin([ 'id' => 'login-form', 'options' => ['class' => 'form-horizontal'], ]) $form->field($model, 'username') $form->field($model, 'password')->passwordInput() <div class="form-group"> <div class="col-lg-offset-1 col-lg-11"> Html::submitButton('Login', ['class' => 'btn btn-primary']) </div> </div> ActiveForm::end() $form->field($model, 'password')->passwordInput() $form->field($model, 'username')->textInput() ->hint('Please enter your name')->label('Name')
  • 38. Полезные штуки: валидация по условию [ ['state', 'required', 'when' => function($model) { return $model->country == 'USA'; }], ] [ ['state', 'required', 'when' => function ($model) { return $model->country == 'USA'; }, 'whenClient' => "function (attribute, value) { return $('#country').val() == 'USA'; }"], ]
  • 39. Полезные штуки: валидация "налету" $email = 'test@example.com'; $validator = new yiivalidatorsEmailValidator(); if ($validator->validate($email, $error)) { echo 'Email is valid.'; } else { echo $error; }
  • 40. Полезные штуки: форматирование echo Yii::$app->formatter->asDate('2014-01-01', 'long'); // output: January 1, 2014 echo Yii::$app->formatter->asPercent(0.125, 2); // output: 12.50% echo Yii::$app->formatter->asEmail('cebe@example.com'); // output: <a href="mailto:cebe@example.com">cebe@example.com</a> echo Yii::$app->formatter->asBoolean(true); // output: Yes echo Yii::$app->formatter->asDate(null); // output: (Not set) echo Yii::$app->formatter->format('2014-01-01', 'date'); // output: January 1, 2014 echo Yii::$app->formatter->format(0.125, ['percent', 2]); // output: 12.50%
  • 41. Полезные штуки: хелперы // Remember current URL Url::remember(); // Remember URL specified. See Url::to() for argument format. Url::remember(['product/view', 'id' => 42]); // Remember URL specified with a name given Url::remember(['product/view', 'id' => 42], 'product'); In the next request we can get URL remembered in the following way: $url = Url::previous(); $productUrl = Url::previous('product');
  • 42.
  • 43. Полезные штуки: log target 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yiilogDbTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yiilogEmailTarget', 'levels' => ['error'], 'categories' => ['yiidb*'], 'message' => [ 'from' => ['log@example.com'], 'to' => ['admin@example.com', 'developer@example.com'], 'subject' => 'Database errors at example.com', ], ], ], ], ],
  • 47.
  • 49. Спасибо за внимание! Yii1 => Yii2 или "Назад в будущее" Алексей Смолянов Контакты: Email: info@root.zt.ua Skype: alexei.smolyanov Twitter: @Dlittledev