8,5
рейтинг
13 октября 2014 в 14:32

Разработка → Yii 2.0. Релиз

Yii*, PHP*
После трёх лет интенсивной разработки и почти 10000 коммитов более 300 авторов вышла стабильная версия PHP фреймворка Yii 2.0! Спасибо за поддержку и терпение!

Как вы, возможно, уже знаете, Yii 2.0 был переписан с нуля. Это решение было принято, так как мы хотели получить отличный PHP фреймворк, который сохранит простоту и расширяемость Yii и, в то же время, будет использовать свежие технологии и возможности, чтобы стать ещё лучше. Сегодня мы рады сообщить, что цель достигнута.

Немного полезных ссылок про Yii и Yii 2.0:



Далее мы рассмотрим самые интересные возможности новой версии. Если вы спешите попробовать фреймворк в деле, начните с чтения раздела руководства Getting Started.



Самое интересное



Следование стандартам и использование последних технологий


Yii 2.0 использует пространства имён и трейты PHP, стандарты PSR, Composer и Bower. Всё это делает работу с фреймворком более приятной. Сторонние библиотеки теперь использовать намного проще.

Надёжная основа


Как и в 1.1, в Yii 2.0 поддерживаются свойства объектов через геттеры и сеттеры, конфигурации, события и поведения. Новый код более эффективен и выразителен. К примеру, обработать событие вы можете следующим образом:

$response = new yii\web\Response;
$response->on('beforeSend', function ($event) {
    // обрабатываем событие "beforeSend"
});


В Yii 2.0 реализованы dependency injection container и service locator. При правильном использовании они делают приложения более гибкими и тестируемыми.

Инструменты для разработки


В Yii 2.0 включены несколько инструментов, которые облегчают разработчикам жизнь.

Отладчик Yii позволяет изучать детали работы вашего приложения. Он также может использоваться для профилирования производительности и поиска узких мест.

Как и в версии 1.1, в Yii 2.0 есть существенно экономящий время генератор кода Gii. Он отлично расширяется, что позволяет создавать свои генераторы. Работать с Gii можно как из браузера, так и из консоли.

Документация по API Yii 1.1 получила немало хвалебных отзывов. Многие хотели такой же документации для своих проектов, поэтому в Yii 2.0 включён генератор документации. Он поддерживает Markdown, что позволяет писать более лаконично и выразительно.

Безопасность


Yii 2.0 помогает вам писать более безопасный код. В фреймворке имеются возможности для предотвращения SQL инъекций, XSS атак, CSRF атак, подделки cookie и т.д. Некоторые части кода были проверены экспертами по безопасности Tom Worster и Anthony Ferrara и впоследствии переписаны.

Базы данных


Работа с базами данных никогда не была такой простой. В Yii 2.0 поддерживаются миграции, DAO, построитель запросов и Active Record. Если сравнивать с 1.1, в версии 2.0 улучшена производительность Active Record, а синтаксис для работы с ним такой же, как и при работе с построителем запросов. Ниже показано получение данных клиента при помощи построителя запросов и Active Record. В обоих случаях используется цепочка вызова методов, напоминающая SQL.

use yii\db\Query;
use app\models\Customer;

$customers = (new Query)->from('customer')
    ->where(['status' => Customer::STATUS_ACTIVE])
    ->orderBy('id')
    ->all();
    
$customers = Customer::find()
    ->where(['status' => Customer::STATUS_ACTIVE])
    ->orderBy('id')
    ->asArray();
    ->all();


Следующий код показывает выборки связанных данных через Active Record:

namespace app\models;

use app\models\Order;
use yii\db\ActiveRecord;

class Customer extends ActiveRecord
{
    public static function tableName()
    {
        return 'customer';
    }
    
    // задаёт связь типа one-to-many с моделью Order
    public function getOrders()
    {
        return $this->hasMany(Order::className(), ['customer_id' => 'id']);
    }
}

// возвращает клиента с id равным 100
$customer = Customer::findOne(100);
// возвращает заказы клиента
$orders = $customer->orders;


Ниже мы обновляем запись о клиенте. При этом используется связывание параметров, что практически исключает возможность SQL инъекции. В базу сохраняются только изменённые данные.

$customer = Customer::findOne(100);
$customer->address = '123 Anderson St';
$customer->save();  // выполнит SQL: UPDATE `customer` SET `address`='123 Anderson St' WHERE `id`=100


Yii 2.0 поддерживает множество баз данных. Помимо традиционно используемых реляционных баз добавлена поддержка Cubrid, ElasticSearch и Sphinx. Также поддерживаются и NoSQL хранилища, такие как Redis и MongoDB. Для доступа ко всем этим базам данных, как через построитель запросов, так и через Active Record используется тот же самый API, что позволяет легко перейти от использования одного хранилища, к использованию другого. При использовании Active Record можно строить связи между данными из разных баз (например, между MySQL и Redis).

Для приложений с большими базами и высокими требованиями к производительности в Yii 2.0 реализована поддержка репликации БД и разделение чтения/записи.

RESTful API


Yii позволяет получить рабочий и совместимый с последними протоколами RESTful API написав всего пару строчек кода. Пример ниже показывает создание RESTful API для данных пользователя.

Сначала создаём контроллер app\controllers\UserController и указываем app\models\User в качестве модели данных:

namespace app\controllers;

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'app\models\User';
}



Далее изменяем конфигурацию компонента urlManager так, чтобы использовать красивые URL:

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
    ],
]


Готово! API, который был только что создан, поддерживает:

  • GET /users: список всех пользователей с постраничной разбивкой;
  • HEAD /users: заголовки с информацией о списке пользователей;
  • POST /users: создаёт нового пользователя;
  • GET /users/123: информация о пользователе с id = 123;
  • HEAD /users/123: заголовки с информацией о пользователе с id = 123;
  • PATCH /users/123 и PUT /users/123: обновляет информацию пользователя с id = 123;
  • DELETE /users/123: удаляет пользователя с id = 123;
  • OPTIONS /users: возвращает поддерживаемые глаголы HTTP для /users;
  • OPTIONS /users/123: возвращает поддерживаемые глаголы HTTP для /users/123.


Попробовать API можно при помощи curl:

$ 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,
        ...
    },
    ...
]


Кеширование


Как и в версии 1.1, в Yii 2.0 отличная поддержка кеширования как на стороне сервера (фрагменты, запросы), так и на стороне клиента (HTTP). Есть драйверы для многих хранилищ, в том числе APC, Memcache, файлы, базы данных и т.д.

Формы


В Yii 1.1 можно быстро создать HTML формы с поддержкой как клиентской, так и серверной валидации. Во второй версии сделать это ещё проще. В примере ниже показано создание формы логина.

Сначала создаётся модель LoginForm, которая представляет собираемые из формы данные. В модели указываются правила валидации, которые будут автоматически использованы для генерации необходимого для валидации на клиенте JavaScript.

use yii\base\Model;

class LoginForm extends Model
{
    public $username;
    public $password;

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['username', 'password'], 'required'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
        ];
    }

    /**
     * Validates the password.
     * This method serves as the inline validation for password.
     */
    public function validatePassword()
    {
        $user = User::findByUsername($this->username);
        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError('password', 'Incorrect username or password.');
        }
    }
}


Далее создаём view:

use yii\helpers\Html;
use yii\widgets\ActiveForm;

<?php $form = ActiveForm::begin() ?>
    <?= $form->field($model, 'username') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <?= Html::submitButton('Login') ?>
<? ActiveForm::end() ?>


Аутентификация и авторизация


Как и в версии 1.1, в Yii 2.0 есть встроенная возможность аутентификации и авторизации пользователя. Поддерживаются вход, выход, аутентификация на основе cookie и токена, фильтр контроля доступа и контроль доступа на основе ролей (RBAC).

Также есть возможность входа через внешние сервисы по OpenID, OAuth1 и OAuth2. Есть и готовая поддержка популярных сервисов, таких как Facebook, GitHub, Google, Twitter, Вконтакте и Яндекс.

Виджеты


Для построения интерактивных пользовательских интерфейсов в состав фреймворка включено довольно много готовых элементов, называемых виджетами. Есть поддержка виджетов Bootstrap и jQuery UI. Помимо этого, предоставляются такие часто используемые элементы как постраничная разбивка, грид, список и т.д. Все они делают разработку веб приложения действительно быстрым и приятным процессом. Например, используя следующий код можно получить полностью рабочий элемент jQuery UI для выбора даты на русском:

use yii\jui\DatePicker;

echo DatePicker::widget([
    'name' => 'date',
    'language' => 'ru',
    'dateFormat' => 'yyyy-MM-dd',
]);



Хелперы


Для упрощения частых задач в фреймворке имеются хелперы. Например, в хелпере Html собраны методы для создания различных тегов HTML а хелпер Url позволяет создавать различные URL:

use yii\helpers\Html;
use yii\helpers\Url;

// создаёт список чекбоксов со странами
echo Html::checkboxList('country', 'USA', $countries);

// выводит URL "/index?r=site/index&src=ref1#name"
echo Url::to(['site/index', 'src' => 'ref1', '#' => 'name']);



Интернационализация


Так как фреймворк используется по всему миру, мы позаботились о хорошей поддержке интернационализации. Поддерживаются перевод сообщений и перевод view, основанные на локали множественные формы и форматирование данных по стандарту ICU. Например:

// переводим сообщение с форматированием даты
echo \Yii::t('app', 'Today is {0, date}', time());

// переводим сообщение с множественными формами
echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => 0]);




Шаблонизаторы


По умолчанию Yii 2.0 использует в качестве языка шаблонов PHP, но также поддерживает Twig и Smarty через специальные расширения. Возможно создавать и свои расширения для поддержки других шаблонизаторов.

Тестирование


Yii 2.0 официально поддерживает интеграцию с Codeception и Faker. В состав фреймворка включено решение для фикстур через миграции, что делает работу с данными для тестов более удобной.

Шаблоны приложений


Для того, чтобы сделать разработку ещё быстрее, в релиз вошли два шаблона приложений, каждый из которых представляет собой полностью рабочее веб приложение. Шаблон basic рекомендуется использовать как основу для небольших относительно простых веб проектов, таких как порталы и персональные сайты. Шаблон advanced больше подходит для крупных приложений с разделением на множество серверов, разрабатываемых большой командой.

Расширения


Несмотря на то, что Yii 2.0 предоставляет много полезных возможностей, в нём реализована система расширений, что делает его ещё более мощным. Расширениями называются распространяемые отдельно пакеты, специально предназначенные для использования в приложениях Yii. Множество возможностей Yii уже вынесены в расширения, например отсылка почты и Bootstrap. На сайте Yii представлена большая пользовательская библиотека, насчитывающая на данный момент почти 1700 расширений. На packagist.org можно найти более 1300 пакетов для Yii.

Начало работы



Для начала работы введите следующие команды:

# устанавливаем composer-asset-plugin глобально. Это нужно сделать один раз.
php composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta2"

# устанавливаем шаблон приложения basic
php composer.phar create-project yiisoft/yii2-app-basic basic 2.0.0


Команды выше сработают, если у вас уже установлен Composer. Если это не так, стоит его установить.

Стоит отметить, что в процессе установки Composer может потребовать логин и пароль от GitHub для генерации токена, который позволяет преодолеть ограничения на количество запросов к API.

После выполнения команд выше вы можете начинать работать с веб приложением, доступным по URL localhost/basic/web/index.php.

Обновляемся



Если вы обновляетесь с предыдущих версий Yii 2.0 (альфа, бета или RC), следуйте инструкциям.

Обновление с версии 1.1 без переписывания кода приложения невозможно так как Yii 2.0 был полностью переписан и изменений синтаксиса очень много. Тем не менее, многие идеи сохранены, так что работать с 2.0, зная 1.1, будет проще. Большие изменения по сравнению с версией 1.1 подробно описаны в документации.

Документация



Для Yii 2.0 доступно полное руководство и документация по API. Руководство переводится на множество языков. Переводы будут доступны немного позже. По Yii 2.0 уже вышла одна книга и пишутся ещё. Одна из книг будет написана известным техническим писателем Larry Ullman, который помогает нам с полным руководством. Александр Макаров координирует и редактирует книгу рецептов Yii 2.0, похожую на тепло принятую книгу рецептов Yii 1.1.

Спасибо



Спасибо всем, кто принимал и принимает участие в разработке Yii.
Ваша поддержка неоценима!
Александр Макаров @SamDark
карма
281,4
рейтинг 8,5
PHP, Yii, Android
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (236)

  • +11
    Поздравляю. Долгожданный релиз!
  • +13
    Алилуя! Отличная новость
    • +3
      Ожидал релиза еще только 20-го числа, а тут на тебе!
      • +5
        Когда CookBook в магазинах появится? Есть приблизительные сроки?
        • +3
          Какие магазины? Ещё писать и писать.
        • +3
          На самом деле текущей документации вполне достаточно на данный момент, для написания проекта практически любой сложности. Насколько помню даже ведется активный перевод на русский язык.
          • +2
            На самом деле даже год назад с документацией было все в порядке. Начали проект на альфе, обновили до беты, теперь будем обновлять до релиза.
  • +7
    Ура! Поздравляю авторов, всех без исключения. Наконец-то дождались релиза! Теперь осталось только подвинуть Laravel с занятых позиций.
    • 0
      Очень актуальный вопрос, кстати. Я только пару дней назад поставил Laravel, для тестов. А тут еще и Yii 2 вышел.
      Ни тем, ни тем не пользовался. Выбор осложнился ((
      • +5
        Пробуйте оба.
      • –5
        Попробуйте Symfony или RoR.
        • 0
          Почему «или»?
        • –3
          Не ради холивара. Глядя на ActiveRecord в Yii 2, понимаешь, какие они классные в RoR.
          • +2
            Не ради холивара было бы так: «Глядя на ActiveRecord в Yii 2 подумал что можно перенять вот эти идеи из RoR: X, Y, Z» ;)
            • 0
              Я один не понял ни вашего высказывания ни aTei?

              ActiveRecord в php никогда не будет таким же клевым как в RoR, потому что PHP не Ruby и объектная модель у этих двух языков в корне отличается. Именно по этой причине в RoR их ActiveRecord можно эффективно использовать буквально для всего, а в Yii2 все наследуется от каких-то мегажирных классов, появляются кастыли с бихейверами и т.д.
              • 0
                Не, ну Eloquent довольно близко. Разве что belongs_to, before\after, scope и прочие задаются толстыми методами, а не парой строк, вида:
                class Comment < ActiveRecord::Base
                  belongs_to :user
                
                  scope :older_than, -> timestamp { where 'created_at > ?', timestamp }
                end
                


                class Comment extends Eloquent
                {
                  public function user() { return $this->belongsTo('User'); }
                
                  public function scopeOlderThan($query, $timestamp) { return $query->whereRaw('created_at > ?', [$timestamp]); }
                }
                
                • 0
                  Дак и AR в Yii тоже похож:

                  class Comment extends ActiveRecord
                  {
                      public function getUser()
                      {
                          return $this->hasOne(User::className(), ['id' => 'user_id']);
                      }
                  
                      public static function find()
                      {
                          return new CommentQuery(get_called_class());
                      }
                  }
                  
                  class CommentQuery extends ActiveQuery
                  {
                      public function olderThan($timestamp)
                      {
                          $this->andWhere('>', 'timestamp', $timestamp);
                          return $this;
                      }
                  }
                  
          • +2
            Чем они классные?
  • +1
    Отлично! Больше добавить нечего +)
  • +2
    Ура товарищи вот он долгожданный релиз yii2, особенно понравилась новая версия работы интернационализации
    • +1
      Только, к сожалению, для удобной интернационализации в Yii сильно не хватает утилиты типа Poedit, как в WordPress.
      • +3
        Можно сделать…
      • +1
        Если я не ошибаюсь, в yii2 есть импорт-экспорт в .po, так что можно использовать тот же poedit вполне.
        • 0
          Не ошибаетесь, но для остальных форматов данных также не помешало бы хоть и есть консольная утилита для этого.
      • +5
        github.com/zelenin/yii2-i18n-module
        такой модуль написал. Через веб-интерфейс переводим, есть экспорт/импорт.
  • +1
    Вот это хорошо, вышли из бетты в релиз достаточно быстро!
  • +1
    Хорошие новости с понедельника! Ура!
  • +1
    Ура, поздравляю!
    Как раз новые проекты уже на 2й версии начали делать :)
  • +2
    Yii2 такой же торт, как и Yii1.1 в свое время.
    Особенно радует поддержка эластика и сфинкса из коробки.
  • +2
    Ура! Мир сегодня шагнул еще на одну ступень в развитии web фреймворков. Поздравляю всех!
  • 0
    Ну, поздравляю! Какие ваши дальнейшие действия по развитию? С кем планируете бороться и как?
    • +4
      В ближайшее время дорихтуем документацию и запилим новый сайт. Ну и 1.1, скорее всего, релизнем.
  • 0
    Молодцы, спасибо вам огромное.
  • 0
    Ура!) Долгожданный релиз!
    Молодцы, быстро прошли от беты до RC, а теперь релиз)
    Не поторопились?;) все хорошо?;)
    • 0
      Пока да :)
  • –12
    Рад за Вас. Постоянно использую Ваш фреймворк для фильтрации кандидатов на собеседование. Просто задаю вопрос — нравится. не нравиться, и сразу многое стает понятно.
    • +9
      Какой странный фильтр :)
    • +6
      Особенно если учесть что в первой версии хватало велосипедов которые вызывали раздражение при работе.
    • 0
      Просьба разъяснить что конкретно становится понятно конкретно обо мне, если я скажу, что я не люблю первый Yii и сторонник Laravel, RoR и Symfony? Так, мне просто любопытно. =)

      З.Ы. Про второй Yii я ничего не говорил, т.к. мнения пока не сложилось.
      • +1
        Я думаю, что имела место просто пунктуационная ошибка. Так что полагаю именно «не люблю yii1» и хотел услышать автор сего комментария.
        • +1
          Имхо, автор комментария просто не указал, что ожидает критики и\или похвалы в развёрнутом виде, а не просто в виде словосочетания «Yii божественный» или «Yii просто дно», т.к. именно зная все плюсы и минусы своего «любимца» можно сделать проект лучше.
          • 0
            Если так, то похвально. В принципе, не важно что обсуждать на собеседовании. Важно как.
      • +6
        Просьба разъяснить что конкретно становится понятно конкретно обо мне, если я скажу, что я не люблю первый Yii и сторонник Laravel, RoR и Symfony? Так, мне просто любопытно.
        Вы испытываете острую потребность в прочной и глубокой привязанности, эмоциональном комфорте и защите от внешних воздействий. Потребность в понимании, любви и поддержке является ведущей и поэтому наиболее легко травмируемой мишенью. Вас характеризуют дружелюбие, конформность установок, но и замкнутость, избирательность в контактах, аналитический склад ума, вдумчивый подход к решению проблем, инертность в принятии решений, преобладание стремления к покою, уединенности. Всплески активности быстро сменяются фазой пассивности.
        • +2
          Это бесподобно! :D
        • 0
          Тест Люшера прикольная штука.:)
  • +1
    А я огорчился, что так быстро выпустили релиз! Мне настолько понравился Yii 2, что теперь придётся переписывать всё с Yii 1 (:
  • 0
    Ура!
    Только в пятницу уговаривал клиента потерпеть и остаться на бете, поскольку «уже RC2 и релиз не за горами».
    Прямо подарок )
  • 0
    Скажите, а есть для миграций авто-генерация того что в up и down. Натравил на таблицу и получил готовый результат, без ручного заполнения.
    • +1
      Нет. Технически реализовать можно, но штука получится опасная. Выстрелить из такой в ногу — раз плюнуть.
      • 0
        Вот отлично работает в доктрине, не надо в ногу стрелять.
        А вот сейчас пишу на Laravel — там миграции один в один, так уже стреляют — писать руками людям влом, старое меняют.
        • 0
          Ну, старое менять — верный способ :) Попробую как-нибудь запилить ещё раз. Может выйдет лучше.
        • 0
          В доктрине у вас главные объекты и отношения между ними, вы полностью описываете мэппинг и сравнить что описано и то в базе проблемы не составляет. А в AR (покрайнемере в Yii) мэппинг ресолвится по таблицам, так что сделать diff не из чего… Так что соглашусь с SamDark, получится неплохая такая пушка для выстрелов в ногу, особенно учитывая любовь начинающих разработчиков не разбираться с тем что они используют.
      • +1
        Было бы неплохо иметь автогенерацию и down от нее. А применение этой миграции уже на совести прогера. Можно сделать так, чтобы код внутри ф-ии был закомментирован, и если программист его раскомментировал, значит он понимает и согласен с тем что сгенерировалось. А выстрелить в ногу можно и вручную, допустив ошибку в запросе.
        • 0
          Хорошо было бы всё-таки не запросами генерить а построителем.
          У меня в моем ORM были активрекордс для баз, таблиц, пользователей и ключей. В реальности оно не так часто бывает нужно, и вполне можно обойтись и чуть другими методами, но довольно привычка пользоваться обычными гридами и т.п. для структуры базы осталась). Но сам я миграции как и все пишу копированием запросов в файлик. Иногда лезу в консоль и создаю пустую миграцию, иногда файлик копирую соседней миграции и переименовываю. Запрос беру из пхпмайадмина. Каждый раз говорю себе — не ленись, пиши на пхп а не sql, и потом каждый раз ругаю себя когда надо перейти на какой-то другой СУБД, но всё равно делаю на SQL — ибо лень)
          • 0
            Построитель и имелся ввиду, это более универсально.
      • –1
        Иметь возможность делать delete тоже опасная штука, ну как без него, когда надо. Было бы хорошо как предложили ниже: скажем создано, но закомментировано — а дальше можно просмотреть если что и подправить. Просто выходит создавать структуру в базе, а потом еще раз в миграциях — лишние телодвижения.
        • +2
          А зачем создавать структуру в базе, ведь можно один раз в миграциях. Заодно и проверите, что они работают.
          • 0
            Какой-нибудь dbForge, который все покажет, привычней.
            • +1
              Вы еще и под виндой… ух…

              На самом деле используя API DBAL можно спокойно себе написать миграцию не связываясь с SQL. Хотя лучше через SQL. Миграции это не только «добавить поле в базу», это еще и наполнить эту базу или изменить структуру оной что бы ничего не поломалось.

              Хотя в идеале у вас изменения в базе не должны влиять на предыдущий релиз, что бы можно было накатывать миграции до того, как переключить симлинки со старой на новую версию приложения. Хотя думаю этот вопрос вам вообще до лампочки.
          • 0
            В базе привычно и удобно. Создал в базе, из нее в гии создал модельку, из базы же скопировал запросы создания структуры в миграцию, добавил пару строк для начального заполнения и готово. Прикольно было бы в гии модель делать указывая поля и их типы прямо в форме создания модели, и чтобы он из нее же добавлял миграцию. С внешними ключами, лейблами и гулящими женщинами. Примерно как в пхпмайадмин мы табличку создаем, только с выбором типов, связей и т.п. из пространства юии.
      • +1
        Я просто оставлю это здесь

        Я предлагал включить этот функционал в ядро, но cebe отказал ) Сказал, что слишком опасно.
        • 0
          Мало ли кто и как себе в ногу стреляет. Я например вообще люблю себе в ногу стрелять вот так:
                  /**
                  * Performs db migration to the latest available version
                  */
              public function actionMigrateUp()
              {
                  try{
                      $commandPath = Yii::app()->getBasePath() . DIRECTORY_SEPARATOR . 'commands';
                      $runner = new CConsoleCommandRunner();
                      $runner->addCommands($commandPath);
                      $commandPath = Yii::getFrameworkPath() . DIRECTORY_SEPARATOR . 'cli' . DIRECTORY_SEPARATOR . 'commands';
                      $runner->addCommands($commandPath);
                      $args = array('yiic', 'migrate', '--interactive=0');
                      ob_start();
                      $runner->run($args);
              		echo nl2br(CHtml::encode(ob_get_clean()));
                  }catch(Exception $e){
                      echo $e->getMessage();
                  }
              }
          
              public function actionMigrateDown()
              {
                  try{
                      $commandPath = Yii::app()->getBasePath() . DIRECTORY_SEPARATOR . 'commands';
                      $runner = new CConsoleCommandRunner();
                      $runner->addCommands($commandPath);
                      $commandPath = Yii::getFrameworkPath() . DIRECTORY_SEPARATOR . 'cli' . DIRECTORY_SEPARATOR . 'commands';
                      $runner->addCommands($commandPath);
                      $args = array('yiic', 'migrate', 'down', '--interactive=0');
                      ob_start();
                      $runner->run($args);
              		echo nl2br(CHtml::encode(ob_get_clean()));
                  }catch(Exception $e){
                      echo $e->getMessage();
                  }
              }
          

          И что теперь чтобы я себе в ногу не стрелял будут что-то в ядро добавлять?)))
          ИМХО более чем достаточно добавить в начало создаваемых методов выброс исключения «Дорогой друг, проверь код миграции _ИМЯ_МИГРАЦИИ_ и удали эту строчку.»
          • 0
            Не знаю, не знаю. Мой гист спокойно проходит, как мне кажется, большую часть баз данных (хотя проверял на MySql только). Создает FK, PK индексы и прочие типы последовательно и используя абстракцию, предоставленную в классе Schema.
            Сам гист я перерабатывал из существующего для Yii 1.1. имея знакомство с фреймворком только по мануалам, но не смотря на это он отработал на отлично, и я спокойно перенес базу созданную в MySQL Workbench в миграции.
            • +2
              Ну для себя то конечно именно так и пишут. А когда пишут для других, то часто ставят предохранитель даже на револьверы :)
              В принципе согласен, что человек который не перечитывает автогенеренный код, и не потрудившийся при этом обеспечить себя нормальным ревью выстрелит в ногу и более простым способом. Но паранойя говорит что в таком нежном месте лучше перестраховаться.
              • 0
                Да, возможно.
                В конце концов, мне никто не мешает допилить реализацию и сделать разширение для тех, кто не знаком с миграциями.
    • 0
      А в чем проблема параллельно подключить Propel и миграции на нем выполнять?
      • 0
        Жирноват он только для миграций.
        • 0
          Хм, Propel2 (alpha3) у меня в вендорах весит 4387 KiB. Он же ведь в рантайме сайта работать не будет. А так 4 метра на харде вообще не проблема. Если критично, можно и в require-dev добавить.
      • 0
        Проще заменить им AR Yii или вообще на Doctrine. Но тогда от Yii мало чего останется.
        • 0
          Имхо, вообще непросто. Не думаю, что для зависимых от БД компонент ребята закладывали адаптеры под ОРМ. А это добрых полфреймворка, наверное.
        • +1
          Не надо в Yii доктрину, пожалуйста. По крайней мере, по умолчанию. Есть ZF2 с модулем / Symphony, кому надо — могут ими пользоваться.
          • +1
            Собственно и пользуемся.
            • +1
              да я и сам пользуюсь, как впрочем и Yii, поэтому и уверен, что в Yii доктрине не место. По крайней мере в дефолте.
  • –10
    Ушел на Symfony 2
  • 0
    Скажите, пожалуйста, есть ли полная поддержка Hip Hop compiler от Facebook?
    • 0
      Тесты проходят, но я не уверен на 100%, что оно заведётся.
    • 0
      Hip Hop compiler вроде как устаревшая уже давно технология. Нынче все крутится на HHVM, никаких компиляторов, только JIT.

      На самом деле должно работать, просто попробуйте. Но велик риск что прирост производительности выполнения PHP кода вы убъете медленной и не оптимизированной базой.
      • –1
        Спасибо, мне ваш ответ стал полезным!
        • 0
          я использую hhvm в своих проектах уже с пол года, никаких проблем (wordpress, yii1, yii2 alpha, vbulletin, bitrix). Прирост производительности есть, но не могу сказать что прям большая разница. Но ресурсов потребляет явно меньше (на wordpress раза в 2). Теперь жду php-ng, хочу потестировать и его.

          Единственное с чем у меня возникла проблема при использовании hhvm так это с кэшированием при использовании плагинов для wordpress в memcache, в итоге поставил w3 total cache, кэш в файлы и теперь всё ок. Поэтому нужно обязательно в проектах всё оборачивать в тесты, тогда сразу будет понятно есть ли проблемы.
      • 0
        Я про HHVM отвечал, если что…
        • 0
          Я понял, если что… Просто HipHop compiller таки был, и таки забыт. Я даже слегка удивился что его вспомнил кто-то.
  • +2
    Скажите нет ли в планах добавить в стандартную поставку, компоненты для работы с деревьями: nested sets, adjacency list…
    • +1
      В стандартную нет. Качественное расширение для nested set стоит ждать от creocoder. По adjacency list он тоже что-то думал реализовывать.
      • 0
        Судя по всему уже готово, github.com/creocoder/yii2-nested-set-behavior
        Себе тоже забрал.
        • +3
          было готово для pre-alpha или alpha, но потом перестало работать. Creocoder обещал адаптировать с выходом релиза.
          • 0
            Спасибо за инфу, значит буду ждать
        • 0
          Как все печально… Ни тебе DRY, ни тестов… Интересно что будет если прогнать через phpmd или еще лучше через scrutinizer-ci.
  • 0
    Поздравляю. Печалит только одно, теперь придется изучать, а лень :)
    • +2
      Оно окупится.
      • –1
        Не сомневаюсь. Только вот ничего нового на горизонте не светит, а старые сайты и прочие CMS переписывать нет смысла. Похоже не скоро доберусь :(
  • 0
    Получилась ли наконец-то поддержка шардинга в ORM и шардированных миграций?
    • +3
      Нет. Шардинг — штука специфичная и его стратегия сильно меняется от проекта к проекту. Зато появилась поддержка read/write split-а и репликации.
      • 0
        Печально. Именно из-за отсутствия не только шардинга из коробки, но и подходящего слоя абстракций для его реализации, пришлось в двух проектах отказываться от Yii.
        • 0
          Напишите мне в почту, обсудим. Я пока слабо представляю, как можно из шардинга сделать что-то стандартное, покрывающее все случаи.
          • +2
            Может вы бы лучше здесь обсудили? Думаю не только мне было бы интересно.
            Шардинг в юии мне видится как переопределение компоненты дб своей прослойкой которая уже будет по своей логике разруливать между базами. По идее все модели должны обращаться к дб, хардкод запросов и т.п. тоже должен идти через нее, так что если нигде костылей нет, то по хорошему тут хватит и абстрактного класса который будет содержать в себе все коннекты к разным базам и различную типовую логику. Но это чисто теоретически. На юии я до шардинга ни разу не доходил…
            • +2
              Мы делали шардинг на Yii 1.1. CActiveRecord почти идеально подходит для этого, нужен только один костылик для подмены имени таблицы в getMetaData()->tableSchema->rawName. Я обращался с этим вопросом к SamDark, но он посчитал его «немного странным», ибо «MySQL легко работает с сотнями миллионов записей, если дать ему достаточно памяти» ;) (пруфлинк). В остальном в сущности достаточно переопределить методы tableName и getDbConnection, написать маппер для определения бд и таблицы, а так же позаботиться о том, чтобы атрибут для определения шарда присутствовал в модели при создании выборок. Плюс мы ещё делали простой итератор для выборок из всех шардов (для статистических запросов в основном) и общий автоинкремент. Могу выложить куда-нибудь, если интересно.

              В Yii2 методы tableName и getDbConnection стали статичными, что осложняет использование шардинга в ActiveRecord. Но в реальности в сложных нагруженных проектах есть смысл отказаться от ActiveRecord вообще и использовать более лёгкие конструкции для работы с данными с целью повышения производительности.

              PS: Хак для переопределения имени таблицы в CActiveRecord:

              public function getMetaData()
              {
              	$md = parent::getMetaData();
              	$md->tableSchema->rawName = $this->getDbConnection()->quoteTableName($this->tableName());
              	return $md;
              }
              


              • 0
                В Yii2 методы tableName и getDbConnection стали статичными, что осложняет использование шардинга в ActiveRecord.

                Благодарю, полезная информация. У меня сейчас как раз один проект в котором живет два фреймворка, один из которых юии1.1 подрос до глобального рефакторинга. Нагрузка пока в пределах, но это важный фактор для принятия решения. Думаю куда двигаться — переносить обе части на юии2, или переносить депрекейтед-фреймворк на юии1.1, и пока не заморачиваться. Всё больше склоняюсь к тому, что технология которую все знают (юии1) будет разумнее на данном этапе. И похоже Ваш аргумент будет решающим :)
                Могу выложить куда-нибудь, если интересно.

                Был бы премного благодарен.
                • +2
                  Выложил на github. В примере реализация с фиксированным количеством шардов, но можно сделать и создание нового шарда на каждые N новых ключей, используя тот же интерфейс.
                  • 0
                    Спасибо. Поизучаю.
              • 0
                На мой взгляд, все сложнее. Как только возникла необходимость реализации связей вообще ленивого поиска в частности оказалось, что нужно переопределять кучу внутренних классов — причем во многих случаев они не были рассчитаны на наследование и переопределение. После некоторого времени борьбы стало понятно, что тратится больше времени на попытки совместить свои дочерние классы с ядром Yii, чем экономится от его использования, и пришлось отказаться.
            • 0
              Да, примерно так все и устроено, но, как я упоминал в другой ветке, нужно, чтобы смежные классы — особенно отвечающие за работу связей, предусматривали такую возможность.
              Для шардинга необходимо, чтобы к моменту вызова getDbConnection() у класса было уже достаточно данных для обращения к нужному споту данных. В старом Yii под капотом (особенно в случае с построением дерева Join) нередко вызывалась в непредсказуемом снаружи месте конструкция ModelName::model(), что приводило к работе с пустыми полями и невозможности установить корректное соединение. Также было невозможно задать свои реализации ActiveFinder, например. Вернее, для того, чтобы их использовать, приходилось переопределять и все те места, где они вызываются я ядре, так как абстракции не были заложены.
              Все эти проблемы, теоретически, подлежали решению, но на каком-то этапе оно стала требовать неадекватно больших усилий.
              • +1
                Уберите join-ы — и жизнь сразу станет легче ;). В сложных проектах гораздо более гибкой и долгоиграющей стратегией будет реализация связей на уровне приложения, а не базы данных. Естественно, появится небольшой оверхед на дополнительные запросы, но будет и профит в виде возможности более гибко и эффективно масштабироваться.
                • +1
                  Совершенно верно, но это не значит, что связи не должны быть прописаны. Если мы пытаемся сохранить подход ActiveRecord, то он должен поддерживать и установку связей под капотом.
                  А воплощаются ли они в реальную sql-команду join или объелиняются в приложении — вопрос реализации, которая под капотом и останется (в идеале). В случае с шардированными записями это наверняка будет сделано именно в приложении.
                  • 0
                    Вообще говоря не должен. Это вопрос конкретной реализации ActiveRecord.
                • 0
                  Не плохая стратегия, но противоречит патерну «обрабатывать данные там где они храняться». Тогда уж лучше оверхедить, создавая нормальные представления и логику связей по ключам.
                  • +1
                    Паттерн «информационный эксперт» несколько не о том гласит. Он гласит «обрабатывать данные там где они есть», но это только в контексте ООП, иначе по этой логике большая часть бизнес логики у нас перенеслась бы в хранимые процедуры. А вот реализовать построение запросов при join и гидрации так, что бы клиентский код не заподозрил бы что джойнов то и небыло и все было получено и склеено внутр ORM это нормально.
                    • +1
                      Чем вам php не ОО? Так вы оставляйте бизнес логику в обрабатывающем данные коде, а вот контроль и преобразование можно уже разносить между ORM и процедурами. DiZeee прав в плане «избегать join-ы» (скорость решает, тк неоднократно вспомнили здесь, что БД — самое узкое место). Любой join можно заменить на представление и это будет быстрее.

                      Использую join-ы, как индикатор проблемных мест: нашёл, переписал, производительность повысил)) Единственный момент где понадобится без вариантов join — это динамические линковки, но в реальной жизни такое не попадалось.
                      И, в конце-то концов, всё можно написать на pgsql!
                      • 0
                        Причем тут php и ОО? Я про «информационного эксперта» вне контекста ООП. По поводу отказа от джойнов, вьюшек и т.д. я полностью согласен. И по поводу pgsql так же. Я больше к тому что паттерны все эти и другие GRASP-овские принципы они не о том. Тут вопрос конкретно в архитектуре базы данных. Вьюшки, процедуры, словом сокрытие сложности реализации архитектуры на уровне базы данных вместо DBAL/ORM вполне себе логичны. Просто некоторые стараются избегать этого всего так как «усложняется деплоймент». Главное что бы наши доменные модели не знали как их кто хранит и выбирает.

  • 0
    разьве нельзя стратегию вынести в интерфейсы? В doctrine уже делались какие-то безуспешные попытки работы с кластером.
    Поддержка репликации это то-же самое что поддержка r/w/x, разьве нет? Просто внесли доп.слой абстракции в конфиги и quiery-builder? Это все полезно, но — неинтересно. Интересен шардинг на уровне подключения, БД, таблиц, мигратора.
    Что-то в этом направлении будет делаться к релизу Yii3 еще лет через пять?
    • 0
      Как вы уже и сказали, в доктрине была попытка сделать экстеншен для DBAL для упрощения шардинга… но как-то все зачахло. Проблемы которые нужно решить хорошо расписаны в документации. И вы серьезно думаете что это должно хоть как-то решаться на уровне ORM? Мне казалось что проекты которые оперируют такими объемами данных что приходится к шардингу прибегать стараются избегать использования ORM, или как минимум там не подходит ActiveRecord.
      • 0
        Да я бы не сказал. ActiveRecord — это только интерфейс, сам по себе он не создает страшного оверхеда, а плюсы в большом проекте те же, что и в малом — простота реализации бизнес-логики, которая (простота) может быть для большого проекта, где сложностей и так хватает, критичнее докупки нескольких серверов, если таковая вообще понадобится. В любом проекте есть слой абстракции над БД, такой или другой, совсем без оверхеда не обойтись.

        Мне случалось организовывать шардинг на ActiveRecord для нагруженного проекта, вполне приемлемо. Да, некоторые ограничения есть — в основном, с группировкой и сортировкой, и их приходится учитывать при использовании, но от этого никуда не деться, а плюсы, с моей точки зрения, того стоят.
      • 0
        Как раз каноническая ActiveRecord, с её подходом «таблица<->класс, запись<->объект», подходит нормально, требуя лишь небольших изменений «однонодового» кода. Проблемы начинаются при попытках нагрузить ORM групповыми задачами с агрегациями и сортировками, для которых ActiveRecord не предназначен — его задача-максимум выбрать список объектов по условию без гарантированного порядка, предполагая агрегацию и сортировку на стороне приложения.
        • +1
          Володь, как Вы себе представляете сортировку на стороне приложения в банальной пагинации? Если есть лимит, то сортировка неизбежно на стороне базы.
          • 0
            Это уже не проблема конкретно подхода ActiveRecord — с такими сложностями вы столкнетесь в любом случае, делая пагинацию по шардированным записям с условиями выборки, группировки, сортировки, какой бы ни была прослойка для работы с базой.
            • +1
              Сильно зависит от задачи. Сферический пример — форум. Шардинг таблицы комментариев. Разносим по нодам по полю топикИд. Условие запроса топикИд=ххх, сортировка по дате, ну или по ид, как «неявному времени» для уменьшения ключей. Я понимаю что пример сферический, и к примеру поиск, или поиск всех сообщений пользователя всё поломает, но задачи бывают разные…
              • 0
                Я писал: с такими сложностями вы столкнетесь в любом случае, делая пагинацию по шардированным записям с условиями выборки, группировки, сортировки

                В приведенном вами случае это как раз поиск по нешардированным записям, если они у вас все в одной базе. Независимо от того, что где-то в проекте есть подобные таблицы, относящиеся к другим спотам, конкретно этот запрос будет работать с плоской структурой данных.
                • 0
                  почему не шардированная? в рамках запроса плоская, но таблица то шардированная.
                  • +4
                    Мне кажется, вы меня не понимаете.

                    У вас есть 4 грузовика (шарда) с яблоками (данными). В каждой сидит грузчик (СУБД), готовый по запросу эти яблоки отдавать.

                    Я утверждаю, что проблема поиска, например, 20-и самых красных яблок по всем машинам и выкладывания их по убыванию красноты, независимо ни от сноровки грузчика (организации базы), ни от того, как точно вы сформулируете ему задачу (архитектура прослойки), не может быть решена без взаимодействия или грузчиков между собой или каждого из них с вами (приложением).

                    Вы говорите: может, если искать только в одном грузовике. Я отвечаю: да, но это не имеет отношения к задаче поиска по нескольким машинам. Вы говорите: как не имеет, вот же они рядом стоят. А за углом еще две. А еще у меня груши есть…
                    • 0
                      Мы с Вами немного о разных вещах. Я говорю о том, что во многих ситуациях можно обойтись без решения проблемы сортировки и группировки в шардах, если таковая будет использоваться на стороне ноды, а не на стороне приложения. Вы говорите о том, что бывают случаи когда это невозможно. Ну да, бывают :) Я же не спорю то. Скорее всего они и будут в реальном проекте. Но зачем себе усложнять жизнь? В начале ветки спор начался с того можно ли отказываться от сортировки на стороне СУБД.
          • 0
            Если есть лимит, то это уже слабо относится к ActiveRecord, да и вообще ORM. Это область ответственности всяких QueryBuilder и Repository, которые используют ORM в качестве маппера.
  • +1
    А теперь долгая и нудная миграция проекта с 1.1 на 2.0 =\
  • 0
    Всем привет

    Хочу в будущем php изучить. Какой фреймворки лучше изучать после основ php?

    Пока я на jquery еще, но потом после пойду в наступление на php
    • +1
      Yii и начинай, хорошая штука ;)
      • 0
        Спасибо за совет.

        В вакансиях чаще вижу или Zend Framework, или все 3 фреймворка вместе. Сам пока не разбираюсь, поэтому и прошу совета профессионалов :)
        • +1
          Работаю на фреймворках много и давно, в рунете Yii хотят в большинстве проектов. Начинал использовать фреймворки с ZF и сейчас на нем найти работу гораздо сложнее, чем на Yii.
          Yii и проще для старта. Я бы тоже с него рекомендовал начать.
          • 0
            Говорю именно по личному опыту не претендуя на холивар. Года два назад тоже решил изучить какой-нибудь фреймворк — выбор пал на Yii, довольно много провозился и в итоге разочаровался, не только из-за проблем в освоении (может я просто краб), но в основном просто из-за обилия бессмысленных конфигов и отсутствия модульности, перешёл на Laravel — никаких нареканий или вопросов ко второму не было — изучился сходу, как по маслу. Так что тут каждому своё.

            Но всё же в ру-регионах более востребованный Yii, так что думаю всё же стоит взяться за Yii (хотя в европейских странах и америке — ларавелька уже давно всех обогнала по уровню популярности). Всё зависит от цели — зачем именно изучать.
            • 0
              Я верно понимаю, что Yii был вашим первым фреймворком? Если да, то дело в том, что второй фреймворк учится всегда легче.
              • 0
                Скорее вторым, т.к. первый был немного переработанный Zend (уже готовый проект на поддержке), но не совсем в том виде, под которым подразумевают «изучить», скорее «знаю как работает, где-что вызывается и что-где создавать и писать», без изучения ядра и всяких специфических возможностей, так что можно считать Yii моим «полторашным» фреймворком.

                В любом случае — я совершенно солидарен, всё учится проще, если это второе или третье «решение», будь то фреймворк или язык программирования, и вполне может быть в этом и есть причина, почему судьба сложилась именно так.
                • 0
                  Но положа руку на сердце и без всяких уже сложившихся стереотипов — доки у Laravel всё же мне больше импонируют.

                  Допустим я опять решил изучить Yii — хочу найти роутинг — захожу на Yii и открываю документацию, вот что я нахожу: www.yiiframework.com/doc-2.0/guide-runtime-routing.html а вот, что я вижу у Laravel: laravel.com/docs/4.2/routing

                  UPD: Если я ошибся ссылкой на доки по Yii — прошу меня простить и поправить.
            • +1
              Очень интересен опыт сравнения Yii и Lavarel.
              Правильно ли я понимаю, что вы работали с первой версией Yii? Или удалось пощупать и вторую версию?
              Laravel, думаю, не зря так резво набирает популярность. Интересно ваше мнение — почему?
              Анализировал фреймворки для миграции с Zend'а (работал с ним с версии 0.7 и вторая версия откровенно разочаровала). Меня в Lavarel'e оттолкнула некоторая его «винигретность» — по ощущениям, надергано компонент из фреймворков и создается ощущение, что нет целостности и это все не способно работать идеально.
              Yii 2 же после Zend'а мне кажется просто песней (не потому, что Zend был плох, а потому, что он скорее был основой для разработки своего фреймворка — все, что нужно надо было писать самому, а он только предоставлял инструменты). Часто слышу похожие сравнения Lavarel с Yii (типа «Yii хорош, и вы будете любить его пока не попробуете Laravel»). Что, несомненно, интригует.
              Если есть реальный опыт разработки на обоих этих фреймворках — расскажите, в чем преимущества?
              • +2
                Есть опыт разработки на Yii 1.4 и на Laravel 4, не скажу что Laravel идеален, но по сравнению с Yii, это просто сказка.

                Актив рекорд и запросы связей с условием вызывает боль и страдание, если вы не понимаете про что я, то рекомендую прочитать yiiweb.wordpress.com/activerecord/relations/

                Роутинг в Yii через пару месяцев превращается в сложно понимаемую кашу, из массивов. ( К сожалению, в версии 2, роутинг почти не изменился.)

                Конфигурация виджетов через массивы, приносит очень много неудобств, и заставляет постоянно держать открытыми вкладки с документациями.

                Но тут нужно сказать, что в Yii есть тот функционал которого нет в Laravel из коробки, и это иной раз подкупает.
                • 0
                  Правильное слово «из коробки». Этот отсутствующий функционал в Laravel легко дополняется пакетами, начиная с валидации в моделях, заканчивая всякими виджетами.
                • +1
                  В 2.0 AR стал сильно лучше. Роуты можно группировать, вытаскивать в модули, строить на лету или реализовывать классами.
                • +1
                  Не соглашусь по поводу роутинга в Yii. В первых моих проектах он действительно превращался в кашу, но потом я научился с ним обходиться. А если роутинг в приложении действительно очень сложен, то стоит посмотреть в сторону расширения роутинга своим классом.
              • +2
                Вы правильно сказали про винигретность! Именно такие ощущения о Laravel у меня и сложились. Кроме того, у Laravel внутри все как-то сложнее устроено и труднее понять что и как работает. Иногда сбоит автодополнение в IDE, а новомодные паттерны усложняют отладку (иногда сложно докопаться до реально именно того метода того класса, который вызывается), еще неприятно отсутствие встроенной в AR валидации. С другой стороны, у Laravel очень крутой artisan, более удобные конфиги и еще мелочи, которые мне сейчас трудно вспомнить.

                Еще, как мне показалось, Yii проще в изучении и комьюнити у него приятнее.

                Чисто субъективно, Laravel немного лучше, чем Yii, но хуже, чем Yii 2.
                • +1
                  Автодополнение легко восстанавливается одним пакетом «barryvdh/laravel-ide-helper», валидация в моделях, если очень надо — точно так же, пакетом ставится. Внутреннее устройство становится кристально очевидным после просмотра файлов запска приложения и самого класса Illuminate\Foundation\Application.

                  В остальном верно — у L4 очень много магии (имхо, даже с избытком), которая реализуется разработчиком буквально парой строчек, а осмысливается «что именно произошло и как оно работает» — довольно долго.
                • 0
                  а новомодные паттерны усложняют отладку

                  этим паттернам уже лет 15. Или вы хотите сказать что поставив во главу угла можно сделать что-то хорошее? Что вообще вы под «винигретностью» подразумеваете? Для меня это сильно связанная система, в которой все перемешано.

                  неприятно отсутствие встроенной в AR валидации.

                  Так это же хорошо! AR ничего о валидации знать не должна.
                  • 0
                    поставив наследование во главу угла*
                  • +2
                    Для меня это сильно связанная система, в которой все перемешано.

                    Для меня это просто ощущение отсутствия целостности, единого подхода к разработке всех частей фреймворка. В принципе, ничего удивительного в том, что именно такое впечатление о Laravel у меня сложилось, так как по большей части он состоит из библиотек, взятых у других проектов.

                    Так это же хорошо! AR ничего о валидации знать не должна.

                    Писать каждый раз валидацию в контроллерах — странно, а выносить валидацию в отдельный класс — муторно и бессмысленно. Я еще ни разу не имел проблем из-за того, что у меня валидация была в AR.
                    • +1
                      Писать каждый раз валидацию в контроллерах


                      А зачем в контроллерах? В сервисном слое.
                  • +1
                    AR ничего о валидации знать не должна

                    Смотря что считать валидацией. Валидация форм и параметров запросов — это одна валидация, проверка вызова сеттеров модели и других методов, изменяющих состояние, на то, что состояние будет соответствовать бизнес-модели — это другая валидация (на уровне форм зачастую нерешаемая без обращений к конкретным объектам модели). Но на практике, обычно, подавляющее большинство правил валидации форм и параметров сеттеров совпадают, а из модели их выносить нельзя, поскольку модели не только из форм заполняются. Потому хорошим решением выглядит или инкапсуляция всей валидации в модель, или (обычно красивее) вынос большей части валидации в сущность, от которой класс модели зависит. Альтернатива — дублирование кода.
              • +1
                1) Пощупал первую версию, не долго, с месяцок — запилил себе бложик, на этом закончил общение.

                2) L4 набирает популярность из-за (имхо): Очень интересной идеологии (фасады + провайдеры), великолепной документации и компонентной базе, которая включает пакеты из других фреймворков — это позволяет развиваться ему на порядок быстрее любого фреймворка и в тоже время быть стабильнее (пока Yii 1 переходил на Yii 2 вышли версии L4, 4.1, 4.2 и в этом месяце выходит версия 5). Но основное преимущество именно в том, что разработчики брали всё самое лучшее от веб-среды, включая RoR и ASP.NET, а не изобретали своих велосипедов. Плюс 4-ка появилась во время «бума» Композера, что позволило буквально за год-два выйти в топ.

                3) В 4ой версии такого ощущения нет — возникает внутреннее чувство сбалансированного автомобиля — всё на своих местах, работает как надо, ничего лишнего, а всё, что претендует на лишнее — вынесено из ядра. Например в Yii меня, как некого ценителя красоты — очень сильно раздражает наличие JS и вообще зависимости от JS внутри ядра. А вот про 5ку я уже такого не скажу, может она и мощнее, но лично у меня складывается впечатление некоторой «потерянной идеологии», всё вперемешку и как раз так, как Вы выразились — винегрет.

                4) На Yii бложик (для себя, чтоб понять что за зверь такой), на L4 довольно много ресурсов, начиная от OAuth сервера, заканчивая всякими файлопомойками и некоторыми более серьёзными ресурсами. На счёт каких-то преимуществ рассказывать не стану, ибо считаю, что не совсем хорошо знаю и помню Yii, чтоб грамотно всё расписать не вдаваясь в холивары.
                • 0
                  3) Забавно. Мне тройка нравилась в плане понятности, а вот четвёрка уже не очень.
                  • 0
                    Я как раз начинал с 4ки (в то время как раз пошли слухи о готовящемся Yii2 или уже даже альфа появилась — точно не скажу), тройку не довелось пощупать.
              • +1
                Спасибо всем за развернутые комментарии.
                Решил, что Laravel буду тоже щупать. Вообще, чем больше фреймворков использовать, тем лучше — при взгляде с разных сторон более объективная картина складывается.
        • 0
          Все наши проекты уже давно мигрировали на Yii, и за 2 года очень довольны фреймворком.
          • 0
            А какие еще фреймворки, которые повыходили последние года 3 вы пробовали?
            • 0
              Я, например, пробовал Yii 1.1, Symfony, ZF2, Phalcon, CI. Ближе всех ментально оказался всё-таки наш отечественный, православный Yii. Сейчас потихоньку пробую Yii2, к сожалению старые проекты перенести будет проблематично из-за постоянно сжатых спринтов где нет времени на нормальный рефакторинг всей бизнес логики.
              Кстатие Phalcon мне тоже понравился, интересная вещь, но когда я его осваивал в одном маленьком проекте у него было достаточно много проблем со стабильностью, хотя я слышал их устранили и он стал вполне стабилен для продакшена.
              • 0
                оказался всё-таки наш отечественный, православный Yii

                Это каким боком он «наш отечественный»? Так можно тогда и про PHP говорить, раз уж пара коре контрибьютеров русские.
  • +2
    то чувство когда Yii1 еще не достаточно изучил, а уже вышел Yii2
  • 0
    С urlManager что-то перемудрили.
    Почему что бы установить свои url rules, надо устанавливать enablePrettyUrl равным true?
    • 0
      Потому что в обратном случае и свои и не свои rules игнорируются и все параметры представляются в виде http://example.com/index.php?r=controller/action&param1=value1&param2=value2
      • 0
        Не понятно, зачем игнорируются.
        Получается невозможно добавить свои url rules и иметь их в виде:
        http://example.com/index.php?r=controller/action¶m1=value1¶m2=value2
        • 0
          Хм… а как именно вы пытаетесь добавить rules?
          • 0
            Как обычно в конфиге config/web.php
                    'urlManager' => [
                        'enablePrettyUrl' => false,
                        'rules' => [
                            'zzz' => 'site/index',
                        ],
                    ],
            
            • 0
              Ничто не запрещает таким образом объявить правила. В чём проблема?
              • 0
                Запрещает: github.com/yiisoft/yii2/blob/master/framework/web/UrlManager.php#L61
                Проверка enablePrettyUrl стоит в init() и addRules().
                Похоже что rules игнорируются если enablePrettyUrl=false.
                • 0
                  Игнорируются, да. Потому что при отключенном enablePrettyUrl их просто незачем использовать, ведь формат получается всегда стандартный. Но никакие исключения не кидаются, так что в коде можно смело прописывать и при включении enablePrettyUrl всё начнём добавляться и работать.
                  • 0
                    Но получается свой урл к экшену нельзя написать: habrahabr.ru/post/240149/#comment_8072599
                    Если я не хочу иметь PrettyUrl.
                    В Yii1 это было возможно, а теперь странное ограничение ввели.
                    • 0
                      Ничего не понимаю. Что вы хотите получить при наличии правила 'zzz' => 'site/index', и выполнении кода:

                      echo Url::to(['site/index']);
                      


                      ?
                      • 0
                        ну zzz

                        Я хочу чтобы но адресу
                        index.php?r=zzz
                        открывался site/index к примеру.
                        • 0
                          Не, так не работает. Получите index.php?r=site/index. Если не секрет, для чего вам index.php?r=zzz и что мешает нормально настроить рерайт?
                          • 0
                            Мне это надо просто так. Это было в Yii1.
                            Просто я не понимаю почему вы это так переделали. Одна из настроек формата url (enablePrettyUrl) ограничивает работу правил (rules), зачем?
                            Формат url и правила маршрутизации вообще не должны быть связаны.
                            • 0
                              Вот и мы тоже искали причины поддерживать правила для запроса через параметры и не нашли ни одной.
                              • 0
                                Тогда понятно :)
                                • +2
                                  Yii 2.0 — это не обратно совместимый релиз. Не стоит ждать того, что всё будет как в 1.1. Особенно когда дело касается сомнительных фич.
  • 0
    Насколько я понял во второй версии в любом вызове createObject() используется встроенный DI Container с обращением к рефлексии — это не вредит производительности? У первой версии фреймворка одно из главных преимуществ было в производительности, в том числе за счет отсутствия таких модных, но тяжелых решений.
    Да, и кстати почему DI Container, а не общепринятое IoC Container?
    • 0
      Вроде не вредит, но надо будет перезамерить. Реализация контейнера у Yii одна из самых быстрых.

      Термины DI container и IoC container обозначают одно и то же. Почему выбрали название DI, а не IoC, уже не помню.
  • 0
    Я все никак в толк не возьму. Почему в Advanced Application Template используется миграция с int типом для created_at и updated_at вместо timestamp. Может я еще не познал дзен?
    Почему для реализации функционала timestamp используется TimestampBehavior, а не поведение бд?
    • 0
      Потому что часто это проще:

      1. unix timestamp в int он всегда int.
      2. Он не зависит от часового пояса.
      3. Для работы с ним всё есть как в БД так и в PHP.
      • 0
        Спасибо. Ушел познавать дзен дальше.
  • 0
    В статье есть упоминание о генераторе документации, который поддерживает и бла-бла-бла… заинтересовали, заинтриговали, но ссылка уже битая… Куда копать? Где искать и как использовать?
    Кстати, с основной страницы документации на github -тоже ссылка битая.
    Может кто-то подскажет варианты? Или кто что использует для своих проектов на Yii2?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.