https://github.com/yiisoft/yii2/
roadmap там же в wiki
C
.Используются для настройки компонент и автозагрузки классов.
echo \Yii::getAlias('@yii'); // директория фреймворка
echo \Yii::getAlias('@app'); // директория приложения
\Yii::setAlias('@Zend', '@app/vendors/Zend'); // определяем псевдоним для корня ZF и позволяем подгружать его классы
Начинаются с @
.
\yii\base\Object
— геттеры и сеттеры, метод init
, конфигурирование массивом, Object::className()
.\yii\base\Component extends Object
— event, behavior.
class GoogleMap extends \yii\base\Object
{
public function __construct($param1, $param2, $config = array())
{
// ...
parent::__construct($config);
}
public function init()
{
// ...
parent::init();
}
}
$object = \Yii::createObject(array(
'class' => '\app\components\GoogleMap',
'apiKey' => 'xyz',
'apiSecret' => 'cde',
), $param1, $param2);
API простой, нет необходимости декларировать заранее:
$component->on($eventName, $handler);
$component->off($eventName, $handler);
$component->trigger($eventName, Event $eventObject = null);
Глобальные события:
// инициируем
\Yii::$app->trigger($eventName);
// подписываемся
\Yii::$app->on($eventName, $handler);
View
— данные, скрипты, render
.$this
в шаблонах ссылается на него.$this->context
на контроллер или другого родителя.
echo \yii\widgets\Menu::widget(array(
'items' => $items,
));
<?php $form = yii\widgets\ActiveForm::begin(); ?>
<?php echo $form->field($model, 'username')->textInput(); ?>
<?php echo $form->field($model, 'password')->passwordInput(); ?>
<div class="form-actions">
<?php echo Html::submitButton('Login'); ?>
</div>
<?php yii\widgets\ActiveForm::end(); ?>
echo $this->render(...);
Убили CFormModel
.
Один синтаксис для всего.
$query = new \yii\db\Query;
$query->select('id, name')
->from('tbl_user')
->orderBy('id DESC')
->limit(10);
$command = $query->createCommand();
echo $command->sql;
$rows = $command->queryAll();
$users = User::model()->find()
->orderBy('id DESC')
->limit(10)
->all();
$finder = Post::find()->where(array('a' => 10));
$finder2 = clone $finder;
$finder2->addWhere(array('b' => 1));
$model = $finder->one();
$model2 = $finder2->one();
// шорткаты
$post = Post::find(10); // pk = 10
$post = Post::find(array('a' => 10, 'b' => 1)); // where a = 10 and b = 1
class User extends \yii\db\ActiveRecord
{
public function getPosts()
{
return $this->hasMany('Post', array('user_id' => 'id'));
}
public function getActivePosts()
{
return $this->hasMany('Post', array('user_id' => 'id'))
->where(array('status' => Post::STATUS_ACTIVE));
}
}
$posts = $user->getPosts()->limit(10)->all();
$posts = Post::find()->limit(10)->asArray()->all();
foreach($posts as $post) {
echo $post['title']."\n";
}
При save()
сохраняется только то, что поменялось.
Появился метод link
для сохранения связанных записей и unlink
для удаления.
$comment = new Comment();
$comment->text = 'Hello, Yii!';
$post->link('comments', $comment);
yii sitemap/index all --verbose
$mergedConfig = ArrayHelper::merge($baseConfig, $specificConfig);
$posts = Post::model()->limit(10)->all();
$titles = ArrayHelper::getColumn('title');
$hash = SecurityHelper::generatePasswordHash($password);
// ...пишем хеш в базу...
// при логине читаем хеш из базы
if (SecurityHelper::verifyPassword($password, $hash) {
// всё нормально
} else {
// плохой пароль
}
Либо полностью, либо никак...
Рекомендуемый способ работы с Yii2:
curl -s http://getcomposer.org/installer | php
php composer.phar create-project --stability=dev yiisoft/yii2-bootstrap path/to/install
Почему не monolog, компоненты Symfony и т.д.?
Мы можем это сделать качественно и с более приятным API в стиле фреймворка.
1.1 стабилен и поддерживается минимум до 2016