SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Yii2
Web
Карнаухов Даниил
Почему Yii2
- Free, OpenSource
- Постоянно развивающийся
- Общирное сообщество
- Оптимизированная производительность
- Гибкий. Хорошо настраиваемый
- Подходит для решения любых задач
- Включает множество необходимых инструментов
- Большое количество модулей
Паттерн MVC
Как реализован MVC в фреймворке
Жизненный цикл запроса
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
$config = require(__DIR__ . '/../config/web.php');
(new yiiwebApplication($config))->run();
Composer. Установка шаблона.
Composer - это пакетный менеджер уровня приложений для языка
программирования PHP, который предоставляет средства по управлению
зависимостями в PHP-приложении.
https://getcomposer.org
composer global require "fxp/composer-asset-plugin:~1.1.1"
composer create-project yiisoft/yii2-app-advanced advanced 2.0.8
Автозагрузка классов
Каждый класс должен принадлежать пространству имен (т.е. basemodels).
Каждый класс должен находиться в отдельном файле, путь к которому
определяется правилом:
$classFile = Yii::getAlias('@' . str_replace('', '/', $className) . '.php');
Конфигурация приложения
Файлы конфигурации находяться в /config/*.php (для basic приложения).
Основные элементы конфигурации :
user - класс аутентификации в системе;
mailer - отправка почты;
db - подключение к базе данных;
urlManager - роутинг;
cache - класс кеша;
errorHandler - стандартный обработчик ошибок;
session - компонент сессий.
Контроллеры
use yiiwebController;
class SiteController extends Controller
{
public function actionTest()
{
return 'Hello world!';
}
}
yiiwebController
yiiconsoleController
yiirestController
public function actionIndex()
{
return $this->render('index');
}
public function actionCreate()
{
$model = new Category();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
Основы роутинга
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
'contacts' => 'site/contacts',
[
'pattern' => 'my-super-category',
'route' => 'category/view',
'defaults' => ['id' => 1],
],
Модели
use yiibaseModel;
class LoginForm extends Model { … }
Аттрибуты, метки аттрибутов, валидация встроенными правилами, сценарии, массовое
присвоение.
public function rules()
{
return [
[['username', 'password'], 'required'],
['rememberMe', 'boolean'],
['password', 'validatePassword'],
];
}
Представления
view/
layouts/
main.php
site/
index.php
return $this->render('contact', [
'model' => $model,
]);
<?= $this->render('_form', [
'model' => $model,
]) ?>
Формы
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn
btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
Валидация
public function rules()
{
return [
[['name'], 'required'],
[['description'], 'string'],
[['name'], 'string', 'max' => 255],
];
}
['username', 'required', 'message' => 'Please choose a username.'],
['country', 'validateCountry'],
…
public function validateCountry($attribute, $params) {
...
}
DAO. Транзакции
$result = Yii::$app->db->createCommand('SELECT * FROM category')->queryAll();
Yii::$app->db->createCommand('UPDATE category SET name = :name WHERE description IS NOT NULL')
->bindValues([':name' => 'fakeCategory'])
->execute();
Yii::$app->db->transaction(function($db) {
...
});
$transaction = Yii::$app->db->beginTransaction();
try {
...
$transaction->commit();
} catch(Exception $e) {
$transaction->rollBack();
}
$query = (new yiidbQuery())
->select(['id', 'name'])
->from('category')
->where('description IS NOT NULL')
->limit(2);
print_r($query->all());
ActiveRecord
class Category extends yiidbActiveRecord
{
public static function tableName()
{
return 'category';
}
public function rules()
{
return [
[['name'], 'required'],
[['description'], 'string'],
[['name'], 'string', 'max' => 255],
];
}
...
$category = new Category;
$category->name = 'Test category';
$category->description = 'Hello world';
$category->save();
$category->name = 'test category1';
$category->save();
$category = Category::find(['name' => 'test category1'])->one();
echo $category->description;
public function beforeSave($insert)
{
$this->name .= ' test category';
return parent::beforeSave($insert);
}
Введение в поведения
Поведения - “реализация множественного наследования в Yii2”.
use yiibehaviorsTimestampBehavior;
class Category extends yiidbActiveRecord
{
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
...
}
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'create_time',
'updatedAtAttribute' => 'update_time',
'value' => new yiidbExpression('NOW()'),
]
];
return [
[
'class' => 'appbehaviorsActiveRecordFileUpload',
'fileAttribute' => 'image',
'fileDir' => 'imgcategoryuploads',
]
];
Gii
Быстрая генерация шаблонов: ActiveRecord, CRUD операций для ActiveRecord,
контроллеров, модулей, расширений, форм.
$config['modules']['gii'] = [
'class' => 'yiigiiModule',
'allowedIPs' => ['127.0.0.1', '::1'],
];
ActiveRecord relation
Валидация:
[['category_id'], 'exist', 'skipOnError' => true, 'targetClass' => Category::className(),
'targetAttribute' => ['category_id' => 'id']],
Связывание моделей:
// Category.php
public function getProducts()
{
return $this->hasMany(Product::className(), ['id' => 'category_id']);
}
// Product.php
public function getCategory()
{
return $this->hasOne(Category::className(), ['id' => 'category_id']);
}
Аутентификация
'user' => [
'identityClass' => 'appmodelsUser',
'enableAutoLogin' => true,
],
class User extends yiibaseObject implements yiiwebIdentityInterface
{
...
}
$user = new User;
Yii::$app->user->login($user);
ACL
use yiifiltersAccessControl;
class CategoryController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
'allow' => true,
'actions' => ['index', 'create', 'update', 'delete'],
'roles' => ['@']
],
],
];
RBAC
'authManager' => [
'class' => 'yiirbacPhpManager',
]
if (Yii::$app->user->can('createCategory')) {
...
}
if (Yii::$app->user->can('updateCategory', ['category' => $category])) {
...
}
RBAC - role base access control.
class RoleRule extends Rule
{
public $name = 'Role';
public function execute($user, $item, $params)
{
$user = User::findOne($user);
if($user) {
$role = $user->role;
if($item->name === 'admin') {
return $role == Role::ROLE_ADMIN;
} else if($item->name === 'user') {
return $role == Role::ROLE_ADMIN || $role == Role::ROLE_USER;
}
}
return false;
}
}
События
События - это механизм, внедряющий элементы собственного кода в
существующий код в определенные моменты его исполнения.
class Product extends Component
{
const EVENT_EXPORT_TO_XML = 'export_to_xml';
public function export()
{
$this->trigger(self::EVENT_EXPORT_TO_XML);
}
}
$product = new Product();
$product->on(Product::EVENT_EXPORT_TO_XML, 'printProduct', 'XML');
function printProduct($event) {
echo $event->data;
}
$product->off(Product::EVENT_EXPORT_TO_XML, 'printProduct');
Модули
Модули - это законченные программные блоки, состоящие из моделей,
представлений, контроллеров и других вспомогательных компонентов.
namespace appmodulesforum;
class Forum extends yiibaseModule
{
public $controllerNamespace = 'appmodulesforumcontrollers';
public function init()
{
parent::init();
}
}
...
'modules' => [
'forum' => [
'class' => 'appmodulesforumForum',
],
],
...
app/
modules/
forum/
controllers/
DefaultController.php
view/
default/
index.php
Forum.php
Спасибо за внимание.

Weitere ähnliche Inhalte

Was ist angesagt?

Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 
Все дороги ведут в Checkout
Все дороги ведут в CheckoutВсе дороги ведут в Checkout
Все дороги ведут в Checkout
Magecom Ukraine
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
MoscowDjango
 
DevHub 3 - Pricing
DevHub 3 - PricingDevHub 3 - Pricing
DevHub 3 - Pricing
Magento Dev
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
 
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий ВахрушевАрхитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
it-people
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
 

Was ist angesagt? (19)

Crazy owl yii1=> yii2
Crazy owl yii1=> yii2Crazy owl yii1=> yii2
Crazy owl yii1=> yii2
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perl
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
course js day 4
course js day 4course js day 4
course js day 4
 
Render API.
Render API.Render API.
Render API.
 
Все дороги ведут в Checkout
Все дороги ведут в CheckoutВсе дороги ведут в Checkout
Все дороги ведут в Checkout
 
Сущности в Drupal 7
Сущности в Drupal 7Сущности в Drupal 7
Сущности в Drupal 7
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
DevHub 3 - Pricing
DevHub 3 - PricingDevHub 3 - Pricing
DevHub 3 - Pricing
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий ВахрушевАрхитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 

Andere mochten auch

rassegna stampa
rassegna stamparassegna stampa
rassegna stampa
wattajug
 
LinkedIn and Twitter Presentation for Westchester Career Counselors' Network
LinkedIn and Twitter Presentation for Westchester Career Counselors' NetworkLinkedIn and Twitter Presentation for Westchester Career Counselors' Network
LinkedIn and Twitter Presentation for Westchester Career Counselors' Network
stmstephen
 

Andere mochten auch (13)

Introducción a Yii2
Introducción a Yii2Introducción a Yii2
Introducción a Yii2
 
Palestra yii2
Palestra yii2Palestra yii2
Palestra yii2
 
UK Enterprise Social Network Software Solutions Analysis
UK Enterprise Social Network Software Solutions AnalysisUK Enterprise Social Network Software Solutions Analysis
UK Enterprise Social Network Software Solutions Analysis
 
rassegna stampa
rassegna stamparassegna stampa
rassegna stampa
 
Yii2
Yii2Yii2
Yii2
 
LinkedIn and Twitter Presentation for Westchester Career Counselors' Network
LinkedIn and Twitter Presentation for Westchester Career Counselors' NetworkLinkedIn and Twitter Presentation for Westchester Career Counselors' Network
LinkedIn and Twitter Presentation for Westchester Career Counselors' Network
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Arquitetura ARM - Raspberry Pi
Arquitetura ARM - Raspberry PiArquitetura ARM - Raspberry Pi
Arquitetura ARM - Raspberry Pi
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 
Yii workshop
Yii workshopYii workshop
Yii workshop
 
Creating applications with Grails, Angular JS and Spring Security
Creating applications with Grails, Angular JS and Spring SecurityCreating applications with Grails, Angular JS and Spring Security
Creating applications with Grails, Angular JS and Spring Security
 
Soziale Medien in der Wissenschaftskommunikation
Soziale Medien in der WissenschaftskommunikationSoziale Medien in der Wissenschaftskommunikation
Soziale Medien in der Wissenschaftskommunikation
 

Ähnlich wie Yii2

Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
Magento Dev
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
Technopark
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 

Ähnlich wie Yii2 (20)

Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляции
 
Looking into WordPress Core, WordCamp Russia 2015
Looking into WordPress Core, WordCamp Russia 2015Looking into WordPress Core, WordCamp Russia 2015
Looking into WordPress Core, WordCamp Russia 2015
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
MODX 3: Что нового?
MODX 3: Что нового?MODX 3: Что нового?
MODX 3: Что нового?
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPAОпыт разработки эффективного SPA
Опыт разработки эффективного SPA
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in Magento
 
Web весна 2012 лекция 7
Web весна 2012 лекция 7Web весна 2012 лекция 7
Web весна 2012 лекция 7
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Что нового в Django 1.4
Что нового в Django 1.4Что нового в Django 1.4
Что нового в Django 1.4
 
Первые шаги после установки WordPress
Первые шаги после установки WordPressПервые шаги после установки WordPress
Первые шаги после установки WordPress
 

Mehr von Noveo

Mehr von Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)
 

Yii2

  • 2. Почему Yii2 - Free, OpenSource - Постоянно развивающийся - Общирное сообщество - Оптимизированная производительность - Гибкий. Хорошо настраиваемый - Подходит для решения любых задач - Включает множество необходимых инструментов - Большое количество модулей
  • 4. Как реализован MVC в фреймворке
  • 5. Жизненный цикл запроса defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/../config/web.php'); (new yiiwebApplication($config))->run();
  • 6. Composer. Установка шаблона. Composer - это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении. https://getcomposer.org composer global require "fxp/composer-asset-plugin:~1.1.1" composer create-project yiisoft/yii2-app-advanced advanced 2.0.8
  • 7. Автозагрузка классов Каждый класс должен принадлежать пространству имен (т.е. basemodels). Каждый класс должен находиться в отдельном файле, путь к которому определяется правилом: $classFile = Yii::getAlias('@' . str_replace('', '/', $className) . '.php');
  • 8. Конфигурация приложения Файлы конфигурации находяться в /config/*.php (для basic приложения). Основные элементы конфигурации : user - класс аутентификации в системе; mailer - отправка почты; db - подключение к базе данных; urlManager - роутинг; cache - класс кеша; errorHandler - стандартный обработчик ошибок; session - компонент сессий.
  • 9. Контроллеры use yiiwebController; class SiteController extends Controller { public function actionTest() { return 'Hello world!'; } } yiiwebController yiiconsoleController yiirestController
  • 10. public function actionIndex() { return $this->render('index'); } public function actionCreate() { $model = new Category(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } else { return $this->render('create', [ 'model' => $model, ]); } }
  • 11. Основы роутинга 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], 'contacts' => 'site/contacts', [ 'pattern' => 'my-super-category', 'route' => 'category/view', 'defaults' => ['id' => 1], ],
  • 12. Модели use yiibaseModel; class LoginForm extends Model { … } Аттрибуты, метки аттрибутов, валидация встроенными правилами, сценарии, массовое присвоение. public function rules() { return [ [['username', 'password'], 'required'], ['rememberMe', 'boolean'], ['password', 'validatePassword'], ]; }
  • 13. Представления view/ layouts/ main.php site/ index.php return $this->render('contact', [ 'model' => $model, ]); <?= $this->render('_form', [ 'model' => $model, ]) ?>
  • 14. Формы <?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> <?= $form->field($model, 'description')->textarea(['rows' => 6]) ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?>
  • 15. Валидация public function rules() { return [ [['name'], 'required'], [['description'], 'string'], [['name'], 'string', 'max' => 255], ]; } ['username', 'required', 'message' => 'Please choose a username.'], ['country', 'validateCountry'], … public function validateCountry($attribute, $params) { ... }
  • 16. DAO. Транзакции $result = Yii::$app->db->createCommand('SELECT * FROM category')->queryAll(); Yii::$app->db->createCommand('UPDATE category SET name = :name WHERE description IS NOT NULL') ->bindValues([':name' => 'fakeCategory']) ->execute(); Yii::$app->db->transaction(function($db) { ... }); $transaction = Yii::$app->db->beginTransaction(); try { ... $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); }
  • 17. $query = (new yiidbQuery()) ->select(['id', 'name']) ->from('category') ->where('description IS NOT NULL') ->limit(2); print_r($query->all());
  • 18. ActiveRecord class Category extends yiidbActiveRecord { public static function tableName() { return 'category'; } public function rules() { return [ [['name'], 'required'], [['description'], 'string'], [['name'], 'string', 'max' => 255], ]; } ...
  • 19. $category = new Category; $category->name = 'Test category'; $category->description = 'Hello world'; $category->save(); $category->name = 'test category1'; $category->save(); $category = Category::find(['name' => 'test category1'])->one(); echo $category->description; public function beforeSave($insert) { $this->name .= ' test category'; return parent::beforeSave($insert); }
  • 20. Введение в поведения Поведения - “реализация множественного наследования в Yii2”. use yiibehaviorsTimestampBehavior; class Category extends yiidbActiveRecord { public function behaviors() { return [ TimestampBehavior::className(), ]; } ... }
  • 21. return [ [ 'class' => TimestampBehavior::className(), 'createdAtAttribute' => 'create_time', 'updatedAtAttribute' => 'update_time', 'value' => new yiidbExpression('NOW()'), ] ]; return [ [ 'class' => 'appbehaviorsActiveRecordFileUpload', 'fileAttribute' => 'image', 'fileDir' => 'imgcategoryuploads', ] ];
  • 22. Gii Быстрая генерация шаблонов: ActiveRecord, CRUD операций для ActiveRecord, контроллеров, модулей, расширений, форм. $config['modules']['gii'] = [ 'class' => 'yiigiiModule', 'allowedIPs' => ['127.0.0.1', '::1'], ];
  • 23. ActiveRecord relation Валидация: [['category_id'], 'exist', 'skipOnError' => true, 'targetClass' => Category::className(), 'targetAttribute' => ['category_id' => 'id']], Связывание моделей: // Category.php public function getProducts() { return $this->hasMany(Product::className(), ['id' => 'category_id']); } // Product.php public function getCategory() { return $this->hasOne(Category::className(), ['id' => 'category_id']); }
  • 24. Аутентификация 'user' => [ 'identityClass' => 'appmodelsUser', 'enableAutoLogin' => true, ], class User extends yiibaseObject implements yiiwebIdentityInterface { ... } $user = new User; Yii::$app->user->login($user);
  • 25. ACL use yiifiltersAccessControl; class CategoryController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ 'allow' => true, 'actions' => ['index', 'create', 'update', 'delete'], 'roles' => ['@'] ], ], ];
  • 26. RBAC 'authManager' => [ 'class' => 'yiirbacPhpManager', ] if (Yii::$app->user->can('createCategory')) { ... } if (Yii::$app->user->can('updateCategory', ['category' => $category])) { ... } RBAC - role base access control.
  • 27. class RoleRule extends Rule { public $name = 'Role'; public function execute($user, $item, $params) { $user = User::findOne($user); if($user) { $role = $user->role; if($item->name === 'admin') { return $role == Role::ROLE_ADMIN; } else if($item->name === 'user') { return $role == Role::ROLE_ADMIN || $role == Role::ROLE_USER; } } return false; } }
  • 28. События События - это механизм, внедряющий элементы собственного кода в существующий код в определенные моменты его исполнения. class Product extends Component { const EVENT_EXPORT_TO_XML = 'export_to_xml'; public function export() { $this->trigger(self::EVENT_EXPORT_TO_XML); } }
  • 29. $product = new Product(); $product->on(Product::EVENT_EXPORT_TO_XML, 'printProduct', 'XML'); function printProduct($event) { echo $event->data; } $product->off(Product::EVENT_EXPORT_TO_XML, 'printProduct');
  • 30. Модули Модули - это законченные программные блоки, состоящие из моделей, представлений, контроллеров и других вспомогательных компонентов. namespace appmodulesforum; class Forum extends yiibaseModule { public $controllerNamespace = 'appmodulesforumcontrollers'; public function init() { parent::init(); } }
  • 31. ... 'modules' => [ 'forum' => [ 'class' => 'appmodulesforumForum', ], ], ... app/ modules/ forum/ controllers/ DefaultController.php view/ default/ index.php Forum.php