yii2

32
Yii2 Web Карнаухов Даниил

Upload: noveo

Post on 14-Apr-2017

216 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Yii2

Yii2Web

Карнаухов Даниил

Page 2: Yii2

Почему Yii2- Free, OpenSource- Постоянно развивающийся- Общирное сообщество- Оптимизированная производительность- Гибкий. Хорошо настраиваемый- Подходит для решения любых задач- Включает множество необходимых инструментов- Большое количество модулей

Page 3: Yii2

Паттерн MVC

Page 4: Yii2

Как реализован MVC в фреймворке

Page 5: Yii2

Жизненный цикл запроса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 yii\web\Application($config))->run();

Page 6: Yii2

Composer. Установка шаблона.Composer - это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении.https://getcomposer.orgcomposer global require "fxp/composer-asset-plugin:~1.1.1"composer create-project yiisoft/yii2-app-advanced advanced 2.0.8

Page 7: Yii2

Автозагрузка классовКаждый класс должен принадлежать пространству имен (т.е. base\models).Каждый класс должен находиться в отдельном файле, путь к которому определяется правилом:

$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');

Page 8: Yii2

Конфигурация приложенияФайлы конфигурации находяться в /config/*.php (для basic приложения).

Основные элементы конфигурации :user - класс аутентификации в системе;mailer - отправка почты;db - подключение к базе данных;urlManager - роутинг;cache - класс кеша;errorHandler - стандартный обработчик ошибок;session - компонент сессий.

Page 9: Yii2

Контроллерыuse yii\web\Controller;

class SiteController extends Controller{ public function actionTest() { return 'Hello world!'; }}yii\web\Controlleryii\console\Controlleryii\rest\Controller

Page 10: Yii2

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

Page 11: Yii2

Основы роутинга'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ],],'contacts' => 'site/contacts',[ 'pattern' => 'my-super-category', 'route' => 'category/view', 'defaults' => ['id' => 1],],

Page 12: Yii2

Моделиuse yii\base\Model;class LoginForm extends Model { … }

Аттрибуты, метки аттрибутов, валидация встроенными правилами, сценарии, массовое присвоение.

public function rules(){ return [ [['username', 'password'], 'required'], ['rememberMe', 'boolean'], ['password', 'validatePassword'], ];}

Page 13: Yii2

Представленияview/ layouts/ main.php site/ index.phpreturn $this->render('contact', [ 'model' => $model,]);<?= $this->render('_form', [ 'model' => $model,]) ?>

Page 14: Yii2

Формы<?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(); ?>

Page 15: Yii2

Валидация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) { ...}

Page 16: Yii2

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();}

Page 17: Yii2

$query = (new \yii\db\Query()) ->select(['id', 'name']) ->from('category') ->where('description IS NOT NULL') ->limit(2);print_r($query->all());

Page 18: Yii2

ActiveRecordclass Category extends \yii\db\ActiveRecord{ public static function tableName() { return 'category'; }

public function rules() { return [ [['name'], 'required'], [['description'], 'string'], [['name'], 'string', 'max' => 255], ]; } ...

Page 19: Yii2

$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);}

Page 20: Yii2

Введение в поведенияПоведения - “реализация множественного наследования в Yii2”.

use yii\behaviors\TimestampBehavior;

class Category extends \yii\db\ActiveRecord{

public function behaviors() { return [ TimestampBehavior::className(), ]; }

...}

Page 21: Yii2

return [ [ 'class' => TimestampBehavior::className(), 'createdAtAttribute' => 'create_time', 'updatedAtAttribute' => 'update_time', 'value' => new \yii\db\Expression('NOW()'), ]];return [ [ 'class' => 'app\behaviors\ActiveRecord\FileUpload', 'fileAttribute' => 'image', 'fileDir' => 'img\category\uploads', ]];

Page 22: Yii2

GiiБыстрая генерация шаблонов: ActiveRecord, CRUD операций для ActiveRecord, контроллеров, модулей, расширений, форм.

$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', 'allowedIPs' => ['127.0.0.1', '::1'],];

Page 23: Yii2

ActiveRecord relationВалидация:

[['category_id'], 'exist', 'skipOnError' => true, 'targetClass' => Category::className(), 'targetAttribute' => ['category_id' => 'id']],Связывание моделей:// Category.phppublic function getProducts(){ return $this->hasMany(Product::className(), ['id' => 'category_id']);}// Product.phppublic function getCategory(){ return $this->hasOne(Category::className(), ['id' => 'category_id']);}

Page 24: Yii2

Аутентификация'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true,],class User extends \yii\base\Object implements \yii\web\IdentityInterface{ ...}$user = new User;Yii::$app->user->login($user);

Page 25: Yii2

ACLuse yii\filters\AccessControl;

class CategoryController extends Controller{ public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ 'allow' => true, 'actions' => ['index', 'create', 'update', 'delete'], 'roles' => ['@'] ], ], ]; }

Page 26: Yii2

RBAC

'authManager' => [ 'class' => 'yii\rbac\PhpManager',]

if (\Yii::$app->user->can('createCategory')) { ...}if (\Yii::$app->user->can('updateCategory', ['category' => $category])) { ...}

RBAC - role base access control.

Page 27: Yii2

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

Page 28: Yii2

СобытияСобытия - это механизм, внедряющий элементы собственного кода в существующий код в определенные моменты его исполнения.class Product extends Component{ const EVENT_EXPORT_TO_XML = 'export_to_xml';

public function export() { $this->trigger(self::EVENT_EXPORT_TO_XML); }}

Page 29: Yii2

$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');

Page 30: Yii2

МодулиМодули - это законченные программные блоки, состоящие из моделей, представлений, контроллеров и других вспомогательных компонентов.namespace app\modules\forum;

class Forum extends \yii\base\Module{ public $controllerNamespace = 'app\modules\forum\controllers'; public function init() { parent::init(); }}

Page 31: Yii2

...'modules' => [ 'forum' => [ 'class' => 'app\modules\forum\Forum', ],],...

app/ modules/ forum/ controllers/ DefaultController.php view/ default/ index.php Forum.php

Page 32: Yii2

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