yii2
TRANSCRIPT
Yii2Web
Карнаухов Даниил
Почему 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 yii\web\Application($config))->run();
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
Автозагрузка классовКаждый класс должен принадлежать пространству имен (т.е. base\models).Каждый класс должен находиться в отдельном файле, путь к которому определяется правилом:
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
Конфигурация приложенияФайлы конфигурации находяться в /config/*.php (для basic приложения).
Основные элементы конфигурации :user - класс аутентификации в системе;mailer - отправка почты;db - подключение к базе данных;urlManager - роутинг;cache - класс кеша;errorHandler - стандартный обработчик ошибок;session - компонент сессий.
Контроллерыuse yii\web\Controller;
class SiteController extends Controller{ public function actionTest() { return 'Hello world!'; }}yii\web\Controlleryii\console\Controlleryii\rest\Controller
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 yii\base\Model;class LoginForm extends Model { … }
Аттрибуты, метки аттрибутов, валидация встроенными правилами, сценарии, массовое присвоение.
public function rules(){ return [ [['username', 'password'], 'required'], ['rememberMe', 'boolean'], ['password', 'validatePassword'], ];}
Представленияview/ layouts/ main.php site/ index.phpreturn $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 \yii\db\Query()) ->select(['id', 'name']) ->from('category') ->where('description IS NOT NULL') ->limit(2);print_r($query->all());
ActiveRecordclass Category extends \yii\db\ActiveRecord{ 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 yii\behaviors\TimestampBehavior;
class Category extends \yii\db\ActiveRecord{
public function behaviors() { return [ TimestampBehavior::className(), ]; }
...}
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', ]];
GiiБыстрая генерация шаблонов: ActiveRecord, CRUD операций для ActiveRecord, контроллеров, модулей, расширений, форм.
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', 'allowedIPs' => ['127.0.0.1', '::1'],];
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']);}
Аутентификация'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);
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' => ['@'] ], ], ]; }
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.
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 app\modules\forum;
class Forum extends \yii\base\Module{ public $controllerNamespace = 'app\modules\forum\controllers'; public function init() { parent::init(); }}
...'modules' => [ 'forum' => [ 'class' => 'app\modules\forum\Forum', ],],...
app/ modules/ forum/ controllers/ DefaultController.php view/ default/ index.php Forum.php
Спасибо за внимание.