49
Yii1 => Yii2 или " Назад в будущее " Алексей Смолянов Контакты: Email: [email protected] Skype: alexei.smolyanov Twitter: @Dlittledev

Crazy owl yii1=> yii2

Embed Size (px)

Citation preview

Page 1: Crazy owl yii1=> yii2

Yii1 => Yii2или "Назад в будущее"

Алексей Смолянов

Контакты:

Email: [email protected]

Skype: alexei.smolyanov

Twitter: @Dlittledev

Page 2: Crazy owl yii1=> yii2

Начнем с выбора

Page 3: Crazy owl yii1=> yii2

Кодить или не кодить ?

Page 4: Crazy owl yii1=> yii2

Наш выбор

Page 5: Crazy owl yii1=> yii2

PHPОтносительно легок в освоенииБольшое сообществоМасса библиотек, фреймворков и тдРазвивается

Page 6: Crazy owl yii1=> yii2

О фреймворкахНе всегда нужныИзбыточныМонстрообразныПереусложненыОптимальныМой - самый лучший!

Page 7: Crazy owl yii1=> yii2

Какой же выбрать ?

Page 8: Crazy owl yii1=> yii2

Мы выбрали Yii

Page 9: Crazy owl yii1=> yii2

Почему Yii?Легкий (в меру)ГибкийРасширяемыйПоддерживается (не в пример kohana etc.)Довольно большое комьюнитиРусскоязычный разработчик (-и) ядраПлагины/РасширенияДокументация

Page 10: Crazy owl yii1=> yii2

Спасибо за внимание

Page 11: Crazy owl yii1=> yii2
Page 12: Crazy owl yii1=> yii2

А теперь поехали!

Page 13: Crazy owl yii1=> yii2

Yii 2.0 is finally coming, after more than three years of intensivedevelopment with almost 10,000 commits by over 300 authors!

Thank you for your support and patience!

Yii2Latest News

OCT 12, 2014

Yii 2.0.0 is released

DEC 3, 2008

Yii 1.0.0 is released

Page 14: Crazy owl yii1=> yii2

РазвертываниеGit cloneArchivecp /path-from /path-toмиграции для БД

Yii2 - composer!

Page 15: Crazy owl yii1=> yii2

Миграцииclass m101129_185401_create_news_table extends \yii\db\Migration{ public function up() { $this->createTable('news', [ 'id' => 'pk', 'title' => Schema::TYPE_STRING . ' NOT NULL', 'content' => Schema::TYPE_TEXT, ] ); }

public function down() { $this->dropTable('news'); }}

Page 16: Crazy owl yii1=> yii2

Типы приложенийYii1basicmany ends - вручную

Yii2basicminimal (Макаров)advanced

Page 17: Crazy owl yii1=> yii2

Окружения и конфиги

backendcommonconsoleenvironmentsfrontend

Page 18: Crazy owl yii1=> yii2

Конфиги

Конфигиcommon/config/main.phpcommon/config/main-local.phpfrontend/config/main.phpfrontend/config/main-local.php

Параметрыcommon/config/params.phpcommon/config/params-local.phpfrontend/config/params.phpfrontend/config/params-local.php

Page 19: Crazy owl yii1=> yii2

Окончательный конфиг

Page 20: Crazy owl yii1=> yii2

Жизненный цикл приложения

Page 21: Crazy owl yii1=> yii2

HTTP Headers

Request// $headers is an object of yii\web\HeaderCollection$headers = Yii::$app->request->headers;

// returns the Accept header value$accept = $headers->get('Accept');

if ($headers->has('User-Agent')) { // there is User-Agent header}

Быстрый доступ к заголовкамuserAgentcontentTypeacceptableContentTypesacceptableLanguages

Page 22: Crazy owl yii1=> yii2

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 = \yii\web\Response::FORMAT_JSON;

$response->data = ['message' => 'hello world'];

Page 23: Crazy owl yii1=> yii2
Page 24: Crazy owl yii1=> yii2

MVCМодельВидКонтроллер

Page 25: Crazy owl yii1=> yii2

КонтроллерFiltersActions

Page 26: Crazy owl yii1=> yii2

Готовые фильтрыpublic function behaviors(){ return [ [ 'class' => 'yii\filters\HttpCache', 'only' => ['index', 'view'], 'lastModified' => function ($action, $params) { $q = new \yii\db\Query(); return $q->from('user')->max('updated_at'); }, ], ];}

Page 27: Crazy owl yii1=> yii2

Готовые фильтрыuse yii\filters\PageCache;use yii\caching\DbDependency;

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, ] ], ];}

Page 28: Crazy owl yii1=> yii2

Модель

Page 29: Crazy owl yii1=> yii2

МодельАтрибуты (свойства)Лейблы атрибутовВалидацияСценарии валидацииМассовое присваиваниеПоведенияСкоупы (scopes)

Page 30: Crazy owl yii1=> yii2

Полезные штуки: sluggablepublic function behaviors(){ return [ [ 'class' => SluggableBehavior::className(), 'attribute' => 'title', 'slugAttribute' => 'slug', ], ];}

Page 31: Crazy owl yii1=> yii2

Полезные штуки: blamablepublic function behaviors(){ return [ [ 'class' => BlameableBehavior::className(), 'createdByAttribute' => 'author_id', 'updatedByAttribute' => 'updater_id', ], ];}

Page 32: Crazy owl yii1=> yii2

Полезные штуки: rate limiterpublic function behaviors(){ return [ 'rateLimiter' => [ 'class' => \yii\filters\RateLimiter::className(), ], ];}

Page 33: Crazy owl yii1=> yii2

Запросы в БД (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();

Page 34: Crazy owl yii1=> yii2

Запросы в БД (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 oneforeach ($query->each() as $user) { // $user represents one row of data from the user table}

status type id

Page 35: Crazy owl yii1=> yii2
Page 36: Crazy owl yii1=> yii2

Отображения (views)$this$this->contextшаблонытемывиджетыформы

Page 37: Crazy owl yii1=> yii2

Формы$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')

Page 38: Crazy owl yii1=> yii2

Полезные штуки: валидация поусловию

[ ['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'; }"],]

Page 39: Crazy owl yii1=> yii2

Полезные штуки: валидация "налету"$email = '[email protected]';$validator = new yii\validators\EmailValidator();

if ($validator->validate($email, $error)) { echo 'Email is valid.';} else { echo $error;}

Page 40: Crazy owl yii1=> yii2

Полезные штуки: форматированиеecho Yii::$app->formatter->asDate('2014-01-01', 'long'); // output: January 1, 2014echo Yii::$app->formatter->asPercent(0.125, 2); // output: 12.50%echo Yii::$app->formatter->asEmail('[email protected]'); // output: <a href="mailto:[email protected]">[email protected]</a>echo Yii::$app->formatter->asBoolean(true); // output: Yesecho Yii::$app->formatter->asDate(null); // output: (Not set)echo Yii::$app->formatter->format('2014-01-01', 'date'); // output: January 1, 2014echo Yii::$app->formatter->format(0.125, ['percent', 2]); // output: 12.50%

Page 41: Crazy owl yii1=> yii2

Полезные штуки: хелперы// Remember current URLUrl::remember();

// Remember URL specified. See Url::to() for argument format.Url::remember(['product/view', 'id' => 42]);

// Remember URL specified with a name givenUrl::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');

Page 42: Crazy owl yii1=> yii2
Page 43: Crazy owl yii1=> yii2

Полезные штуки: log target'bootstrap' => ['log'],

'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\DbTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yii\log\EmailTarget', 'levels' => ['error'], 'categories' => ['yii\db\*'], 'message' => [ 'from' => ['[email protected]'], 'to' => ['[email protected]', '[email protected]'], 'subject' => 'Database errors at example.com', ], ], ], ],],

Page 44: Crazy owl yii1=> yii2

Полезные штуки: кодогенератор

Page 45: Crazy owl yii1=> yii2

Полезные штуки: дебаггер

Page 46: Crazy owl yii1=> yii2

И много-много еще всего ...

Page 47: Crazy owl yii1=> yii2
Page 48: Crazy owl yii1=> yii2

Вопросы?

Page 49: Crazy owl yii1=> yii2

Спасибо за внимание!

Yii1 => Yii2или "Назад в будущее"Алексей Смолянов

Контакты:

Email: [email protected]

Skype: alexei.smolyanov

Twitter: @Dlittledev