 
                PHP-код становится слишком сложным из за стремления к безграничной гибкости.
Многие считают, что это единственный правильный путь.
Все проблемы программирования можно решить дополнительным слоем абстракции… кроме проблемы избыточной абстракции
David Wheeler
 
                     
                 
                *Кроме PECL и микрофреймворков
https://getcomposer.org/download/
composer global require "fxp/composer-asset-plugin:1.0.0-beta2"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
* --stability=dev
cd basic
php -S localhost:80
 
                    bootstrap
 
                    валидация и формы
 
                    отладчик
 
                    помнит всё
 
                    ищет по логам
 
                    полезные ошибки
 
                    полезные фаталы
try {
    file_get_contents('test');
} catch (\yii\base\ErrorException $e) {
    // ну и ладно :(
}
 
                    генератор кода
 
                    генерируем контроллер
 
                    preview
 
                    diff
 
                    консоль
 
                    gii в консоли
ставятся очень просто:
composer require --prefer-dist yiisoft/yii2-mongodb "*"
и всё, можно работать
Уже есть около 750 неофициальных пакетов.
Один синтаксис для всего.
$query = (new \yii\db\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(['a' => 10]);
$finder2 = clone $finder;
$finder2->addWhere(['b' => 1]);
$model = $finder->one();
$model2 = $finder2->one();
// шорткаты
$post = Post::findOne(10); // pk = 10
$post = Post::findOne(['a' => 10, 'b' => 1]); // where a = 10 and b = 1
                    has one, has many. Объявляются методами.
class User extends \yii\db\ActiveRecord
{
  public function getPosts()
  {
    return $this->hasMany('Post', ['user_id' => 'id']);
  }
  public function getActivePosts()
  {
    return $this->hasMany('Post', ['user_id' => 'id'])
      ->where(['status' => Post::STATUS_ACTIVE]);
  }
}
                    
$posts = $user->getPosts()->limit(10)->all();
$postCount = $user->getPosts()->count();
                    
class Post extends \yii\db\ActiveRecord
{
    public function getTags()
    {
        return $this->hasMany(Tag::className(), ['id' => 'tag_id'])
            ->viaTable('post_tag', ['post_id' => 'id']);
    }
}
$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!';
// INSERT INTO post_comment ...
$post->link('comments', $comment);
// DELETE FROM post_comment ...
$post->unlink('comments', $comment);
                    
// 10 записей за раз
foreach (Customer::find()->batch(10) as $customers) {
    // $customers — массив 10 или менее объектов
}
// 10 записей за раз, итерация по одной
foreach (Customer::find()->each(10) as $customer) {
    // $customer — объект Customer
}
// с жадной загрузкой
foreach (Customer::find()->with('orders')->each() as $customer) {
}
    setMyCoolFactoryDependencyInjectionContainer()
                        
                Делаем приятный API, покрываем 80%, даём умолчания, позволяем расширять остальное.
 
                 
                
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
    public $modelClass = 'app\models\User';
    public function actionSearch($keyword) // !!!
    {
        $result = SearchService::search($keyword);
        return $result;
    }
}
'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => 'user'
        ],
    ],
]
curl -i -H "Accept:application/json" "http://localhost/users"
    HTTP/1.1 200 OK
    Date: Sun, 02 Mar 2014 05:31:43 GMT
    Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
    X-Powered-By: PHP/5.4.20
    X-Pagination-Total-Count: 1000
    X-Pagination-Page-Count: 50
    X-Pagination-Current-Page: 1
    X-Pagination-Per-Page: 20
    Link: <http://localhost/users?page=1>; rel=self,
        <http://localhost/users?page=2>; rel=next,
        <http://localhost/users?page=50>; rel=last
    Transfer-Encoding: chunked
    Content-Type: application/json; charset=UTF-8
    [
        {
            "id": 1,
            ...
        },
        {
            "id": 2,
            ...
        },
        ...
    ]
                Документация: http://www.yiiframework.com/doc-2.0/guide-rest-quick-start.html
12 Октября 2014
1.1 стабилен и поддерживается минимум до 2016.
