Yii 1.1.8

    Вышел релиз PHP-фреймворка Yii 1.1.8, включающий более 80 багфиксов, новых возможностей и улучшений. Огромное спасибо тем, кто репортил баги, предлагал новые фичи и использовал по назначению Orphus на yiiframework.ru.

    Забрать свежий дистрибутив можно с официального сайта.

    Инструкции по обновлению можно почитать в UPGRADE.

    Полный список изменений, как обычно, можно прочитать в CHANGELOG, мы же бегло рассмотрим самое интересное.



    Свои классы для правил URL



    Для сложной работы с URL, с которой не может справится стандартный класс CUrlRule (например, когда часть URL зависит от значений в базе данных), можно написать свои классы для обработки URL и использовать их в конфигурации CUrlManager:

    
    array(
        // стандартное правило '/login' → 'site/login' и т.д.
        '<action:(login|logout|about)>' => 'site/<action>',
     
        // нестандартное правило для '/Производитель/Модель'
        array(
            'class' => 'application.components.CarUrlRule',
            'connectionID' => 'db',
        ),
     
        // стандартное правило для 'post/update'
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    ),
    


    Сам класс при этом наследуется от CBaseUrlRule и выглядит примерно так:

    
    class CarUrlRule extends CBaseUrlRule
    {
        public $connectionID = 'db';
     
        public function createUrl($manager,$route,$params,$ampersand)
        {
            if ($route==='car/index')
            {
                if (isset($params['manufacturer'], $params['model']))
                    return $params['manufacturer'] . '/' . $params['model'];
                else if (isset($params['manufacturer']))
                    return $params['manufacturer'];
            }
            return false;  // не применяем правило
        }
     
        public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
        {
            if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches))
            {
                // совпадают ли $matches[1] и $matches[3] с
                // производителем и моделью в базе?
                // если да, выставляем $_GET['manufacturer'] и/или $_GET['model']
                // и возвращаем 'car/index'
            }
            return false;  // не применяем правило
        }
    }
    


    Улучшенный автозагрузчик классов



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

    
    // По умолчанию сторонний загрузчик регистрируется до загрузчика Yii
    Yii::registerAutoloader($autoloader);
    


    Теперь можно делать так:

    
    // При передаче true вторым параметром сторонний автозагрузчик добавляется после загрузчика Yii
    Yii::registerAutoloader($autoloader, true);
    


    По умолчанию автозагрузчик Yii использует PHP include path. Для некоторых хостингов это является проблемой, решить которую можно немного поправив index.php:

    
    require('path/to/yii.php');
    // отключаем PHP include path
    Yii::$enableIncludePath = false;
    Yii::createWebApplication($config)->run();
    


    Логирование в режиме реального времени



    Некоторые консольные приложения могут работать очень долго. Для них полезно писать сообщения в лог сразу, а не ждать завершения приложения:

    
    // автоматически передаём каждое сообщение роутеру лога
    Yii::getLogger()->autoFlush = 1;
    // автоматически пишем сообщения при получении логгером
    Yii::getLogger()->autoDump = true;
    


    Работаем со счётчиками в БД через AR



    В классе CActiveRecord появился новый метод saveCounters(), похожий на существующий CActiveRecord::updateCounters(). Главное отличие — saveCounters() работает только с текущим объектом в то время как updateCounters() работает со всей таблицей:

    
    $post = Post::model()->findByPk(1);
    // наращиваем количество просмотров поста
    $post->saveCounters(array('views'=>1));
    // то же для прошлый версий
    Post::model()->updateCounters(array('views'=>1), 'id=1');
    


    Генерация файлов переводов



    При использовании yiic message часто приходилось удалять старый файл и заменять его новым, который генерировался рядом. Теперь можно писать сразу в старый файл, если выставить в конфигурации команды опцию overwrite в true.

    Создание URL в консольных приложениях



    В веб-приложениях для генерации URL обычно используется CUrlManager, который ранее не был доступен консольным приложениям. Теперь и в веб-приложениях и в консольных можно пользоваться Yii::app()->createUrl(), что очень удобно, например, для построения sitemap, в котором перечисляются URL веб-приложения.

    В clips теперь можно использовать параметры



    Это полезно в том случае, когда кусок кода в view повторяется много раз, но он недостаточно сложен для выноса его в отдельный файл:

    
    <?php // определяем clip ?>
    <?php $this->beginClip('hello')?>
    <p>Привет, {username}!</p>
    <?php $this->endClip() ?>
     
    <?php // используем clip ?>
    <?php $this->renderClip('hello',array(
        '{username}'=>'Qiang',
    ))?>
    <?php $this->renderClip('hello',array(
        '{username}'=>'Alex',
    ))?>
    <?php $this->renderClip('hello',array(
        '{username}'=>'Michael',
    ))?>
    
    • +64
    • 4.9k
    • 8
    Support the author
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 8

      +3
      Молодцы!
      Вчера, как раз удалял старый файл переводов и заменял его новым
      Теперь поставлю overwrite

      Спасибо.
        +2
        А я в пятницу только расширил функционал logger'а для консольных утилит. Оперативно, как по заказу. Кажется разработчики Yii научились читать мысли)
          0
          Релиз, конечно, менее впечатляющий, чем прошлый, но, в любом случае — уиии!
            0
            Как всегда много вкусных и нужных плюшек. Спасибо!
              +1
              А я писал свою реализацию clips'ов :)действительно читаю мысли.
                0
                Теперь можно красиво роутить иерархические URL вида /page1/page2/page3/page4/…
                Спасибо!
                  0
                  Жаль не поправили баг с AR many to many и checkBoxList, опять пришлось накатывать патч…
                  code.google.com/p/yii/issues/detail?id=2412
                    0
                    Еще можно было отметить появление возможности использовать CDbExpression, в insert и update в CDbCommand. Только сегодня понадобилось и вот оказывается уже вчера появилось)

                    Only users with full accounts can post comments. Log in, please.