company_banner

Доступен PhpStorm 2017.3

    PhpStorm 2017.3


    Всем привет!


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


    Для вступления, я думаю, достаточно. Стоит разве что добавить, что статья является вольным переводом страницы “What’s new”. Скачать новую версию можно по предыдущей ссылке или с помощью Toolbox App. Как всегда, доступна 30-дневная пробная версия. Полную же версию могут использовать обладатели действующей подписки на PhpStorm или All Products pack, а также студенты и разработчики проектов с открытым исходным кодом.


    Погнали! (Осторожно, под катом 2873.15 Кбайт картинок.)


    REST-клиент в редакторе кода


    С незапамятных времен в комплекте с PhpStorm идет плагин REST Client. Даже если вы с ним не знакомы, то можете представить его функциональность, если когда-либо использовали Postman или что-нибудь подобное. Мы решили пересмотреть эту концепцию и сделали REST-клиент, работающий напрямую с запросами в формате RFC 2616.


    REST-клиент


    Можно как вставить в редактор имеющийся запрос, так и написать новый. Во втором случае привычные любому пользователю IDE автодополнение и рефакторинги упростят работу. Сформированный запрос можно выполнить прямо из редактора, и там же увидеть ответ.


    Все данные хранятся в текстовых файлах с расширением .http, так что референсные запросы можно держать в любимой VCS прямо рядом с кодом. Части специфичные, например, для тестового или боевого окружения, можно прятать за переменными.


    Переменные окружения


    Утилиту сравнения файлов, встроенную в IDE, можно использовать для ответов сервера. Достаточно выполнить запрос несколько раз и выбрать желаемую пару.


    Сравнение файлов


    Подробнее и с картинками про REST-клиент — в нашем блоге, правда, на английском языке.


    Производительность редактора


    Как уже упоминалось во вступительной части, улучшения производительности коснулись редактирования. В мире PHP нередко встречаются файлы с тысячами, а иногда десятками тысяч строк! Мы, например, очень любим тестировать скорость работы PhpStorm на Mpdf.php. Это ядерная смесь из PHP, HTML и JS в одном флаконе объемом 1 МБ (порядка 40к строк кода). Обычно, если что-то работает быстро для mPDF, оно работает быстро для всего.


    Тест производительности


    Так вот, в новой версии задержки вывода символов на экран удалось сократить в четыре раза! Тем, кто работает с большими и огромными файлами, должно стать приятнее редактировать. Если же у вас в проекте ООП и по файлу на класс, вы разве что заметите слегка увеличившийся срок работы от батареи. Кстати, о батарее: Power save mode не только экономит энергию, но и ускоряет работу IDE.


    Nullable-типы при рефакторинге


    PhpStorm поддерживает большую часть нововведений PHP 7.1 с момента релиза, который состоялся почти год назад. Однако мы продолжаем улучшать продукт, чтобы еще больше упростить использование новой версии языка. В этот раз изменения коснулись рефакторингов Extract interface и Change signature.


    Рефакторинг Change signature


    Модификации, совершаемые упомянутыми рефакторингами, теперь сохраняют метку nullable (?) для типов параметров и возвращаемого типа. Диалоги же, в свою очередь, позволяют эту метку добавить или убрать.


    Шаблоны генерации кода


    Диалог создания нового класса теперь дает возможность выбирать не только из имеющегося набора типов (класс, интерфейс или типаж), но и из списка пользовательских шаблонов.


    Диалог создания нового класса


    Новая переменная ${NAMESPACE} позволяет подставить имя неймспейса в шаблон. Пригодится в проектах, использующих PSR-0 / PSR-4 пространства имен. Также во всех шаблонах PHPDoc теперь можно использовать переменные с текущей датой и/или временем.


    Контроль исключений


    PhpStorm уже давно умеет отслеживать выбрасываемые исключения. Инспекция Missing @throws tag(s) с 2012 года предлагает обновить PHPDoc, если в нем отсутствует соответствующий тег. Однако пользователям хотелось большего. Так появились сразу три новые инспекции: Unhandled exception, Redundant @throws tag и Redundant catch clause.


    Инспекция Unhandled exception подсвечивает выражение, из которого может быть выброшено исключение. Выражение не должно быть обернуто в try-catch-блок, а исключение не должно быть задекларировано в вышележащей функции с помощью @throws. Чтобы быстро исправить проблему, сгенерируйте try-catch или добавьте @throws.


    Инспекция Unhandled exception


    Инспекции Missing @throws tag(s) давно нужна была пара. Если можно забыть задекларировать исключение, то можно забыть и лишнюю декларацию убрать, верно? Redundant @throws tag рапортует об исключениях, которые, по мнению анализатора, из функции не выбрасываются. PhpStorm предлагает @throws с таким исключением удалить или же обновить PHPDoc целиком.


    Инспекции Missing @throws tag(s)


    Завершает список Redundant catch clause. Если внутри catch-блока обрабатывается исключение, которое внутри него не выбрасывается, такой блок будет отмечен инспекцией как излишний. Для устранения проблемы предлагается такой блок удалить.


    Инспекция Redundant catch clause


    В отличие от уже существовавшей инспекции Missing @throws tag(s), три новые гораздо интенсивнее работают с кодом. Без доработки анализатора они бы существенно замедлили IDE. Однако скорость новой версии PhpStorm почти не изменилась, а отдельно взятая Missing @throws tag(s) стала быстрее в несколько раз — еще один пример работы над производительностью.


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


    Диалог создания нового теста расширился шаблонами для тестов Codeception Unit, Codeception Functional и PHPSpec.


    Диалог создания нового теста


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


    Диалог создания нового теста


    Если вы используете PHPUnit-аннотацию @dataProvider, то порадуетесь возможности перезапускать только один тест из упавшего набора.


    Перезапуск теста


    Кроме того, новый PhpStorm позволяет найти и сгенерировать недостающий провайдер.


    Генерация недостающего провайдера


    Twig


    Появилась возможность вставлять различные языки между произвольными тегами или внутрь именованных блоков. Такие “инъекции” можно создавать как на лету, так и с помощью заранее подготовленных правил.


    Инъекции


    Кроме того, улучшено форматирование сложных структур. В частности, их выравнивание.


    Форматирование сложных структур


    Веб-технологии


    Командой WebStorm была улучшена поддержка Vue.js. Например, автодополнение и навигация теперь работают для свойств и методов Vue-компонентов. Закрывающая фигурная скобка автоматически добавляется во время печати во Vue-шаблонах. А также добавлена коллекция снипетов, позволяющих ускорить написание распространенных кусков кода. Новый же шаблон Vue-файлов позволяет ускорить создание компонентов.


    Vue.js


    Обновилась и поддержка JavaScript. Теперь для автодополнения стандартных объектов и методов JS PhpStorm “под капотом” использует TypeScript declaration-файлы. Благодаря этому, в том числе, улучшилась документация для методов (она берется из этих файлов или скачивается из MDN).


    MDN


    Новый рефакторинг Pull member up позволяет перемещать методы JavaScript- или TypeScript-класса в родительский класс или интерфейс. Если же “родителя” еще нет, он может быть создан с использованием рефакторинга Extract superclass на основе полей и методов “ребенка”.


    Рефакторинг Pull member up


    Как обычно, все улучшения WebStorm 2017.3 доступны в соответствующей версии PhpStorm (либо “из коробки”, либо путем установки плагинов). А это, помимо вышеупомянутого: рефакторинги Extract type alias и Extract interface для TypeScript, поддержка нескольких версий JavaScript в одном проекте, улучшенная интеграция Jest, обновленная поддержка CSS, импорт стилей из ESLint и TSLint и многое другое.


    Системы контроля версий


    Платформа IntelliJ обновила поддержку систем контроля версий, а это значит, что PhpStorm, как одна из IDE на этой платформе, научился запоминать свое состояние для каждой ветки и восстанавливает его при переключении между ними.


    Переключение между ветками


    Дополнительно, во вкладке Shelf теперь можно переименовывать списки изменений, а также перетаскивать их между вкладками Shelf и Local Changes.


    Базы данных


    PhpStorm может все, что может DataGrip 2017.3. В частности: улучшенный просмотр баз данных, генерация SQL, автодополнение после выражения JOIN, поддержка SSH-туннелей.


    Базы данных


    В завершение


    А еще мы переработали страницу настроек Code Style | PHP (избавившись от вкладки Other), добавили журнал операций Composer, улучшили конфигурацию запуска PHPUnit тестов, добавили возможность задавать область видимости полей при рефакторинге (Code Style | PHP | Code Generation).


    Пожалуй, это все, о чем мы хотели бы вам рассказать. Но это далеко не все, что вошло в релиз. Полный список изменений, как всегда, можно найти в нашем выпускном альбоме release notes. Сообщайте о проблемах в нашем трекере, ну, или просто оставляйте свои комментарии под этим постом или в нашем блоге.


    Спасибо за внимание!


    Команда JetBrains PhpStorm
    The Drive to Develop

    JetBrains
    376.42
    Делаем эффективные инструменты для разработчиков
    Share post

    Similar posts

    Comments 130

      +2
      Вчера обновил webstorm и первое что реально порадовало за много лет, это проведенная оптимизация автокомплита. Теперь автокомплит успевает даже на очень слабых машинах. Это чудо!
        0
        Сегодня обновил WebStorm и что удивило, что Jest перестал работать, теперь валится где-то в недрах с ошибкой «RangeError: Maximum call stack size exceeded», так что пришлось откатываться. При этом генерируемая комманда работает из терминала нормально.
          +1
          Интересная проблема. А при запуске из IDE и из терминала используется одна и та же версия node? Был бы признателен, если можно было бы посмотреть на полный стектрейс этой ошибки, в идеале в виде бага на youtrack.jetbrains.com/issues/WEB :)
          Нет ли случайно открытого проекта, где это воспроизводится? Спасибо.
            +1
            Постараюсь завтра выделить время на разбор проблемы и описать более детально. К сожалению не открытый и поделиться естественно им не могу.
        –4

        {applause} !!!


        (и да, можете минусовать за бессодержательность)

          0
          О, так запоминания состояния на разных ветках небыло раньше? Блин, а я все время думал, что это у меня что-то глючит :)
            0
            PhpStorm, как одна из IDE на этой платформе, научился запоминать свое состояние для каждой ветки и восстанавливает его при переключении между ними.

            Это касается Favorites ?

              0
              Закладки общие.
                0
                Переключение веток переключает tasks? Будет ли оно работать, если ветку сменю в консоли и потом вернусь в редактор, сменит ли он контекст?
                p.s. Извини, нет возможности сейчас самому проверить.

                  0

                  По второму — нет, переключать ветки нужно в IDE. По первому сейчас уточню. Но у меня есть ощущение, что контекст из Tasks не отслеживается.

                    0

                    Да, все так и есть — задачи при переключении веток переключаться не будут. Если очень хочется, то заведите, пожалуйста, тикет здесь.

                  0

                  А если у меня в одной ветке файл есть, а в другой его нет и я туда закладку поставил, то после переключения на вторую ветку и обратно закладка пропадёт навсегда?

                    0
                    Увы. Будет здорово, если Вы сообщите об этой проблеме по ссылке в моем комментарии выше.
                0
                Хм. А почему Unhandled exception появляется в блоке catch (Throwable $e)?
                Ведь любое исключение в PHP 7.1 — Throwable. Да и система указывает на исключение которое наследуется от Exception.
                  0
                  Можно пример кода?
                    0
                    Конечно. Все классы есть в use, поэтому на неймспейсы не грешите.

                    try{
                        ...
                    } catch (Throwable $e) {
                        $this->exception($e); // Unhandled ....
                        continue;
                    }


                    protected function exception(Throwable $e)
                    {
                        $this->exceptionCount++;
                    
                        if ($this->exceptionCount > $this->getMaxExceptionCount()) {
                            throw new MyCustomException('текст ошибки', 0, $e);
                        }
                    }


                    class MyCustomException extends \Exception
                    {
                    // Пустой класс
                    }


                    UPD: А, стоп. Оно ж в блоке catch. А выше там класс анонимный и оно не может определить его использование и верхний catch. Тогда вроде как все верно. Но лучше гляньте лишний раз.
                      0

                      Ну да, внутри catch-блока выбрасывается MyCustomException. Если оно не задекларировано и выше нигде не ловится, то PhpStorm считате его необработанным.

                        0
                        Анонимный класс, это «return new class extends MyAbstractClassEtc {...}».
                        При этом такой объект создается через динамический require(), поэтому Шторм такое не засечет.

                        В общем, суть та же что и с функциями
                          0

                          Про анонимные классы — это я погорячился, с ними ситуация точно такая же, как и с обычными. Т.е. не имеет значения его дальнешее использование, важно либо задекларировать исключение в PHPDoc метода, либо его обработать внутри метода. Иная ситуация с анонимными функциями, но они тут не причем, поэтому я и отредактировал сообщение.

                            0
                            Немного не в тему, но может подскажете как убрать комментарий «TODO: Change the autogenerated stub» при оверрайде методов? :) Запарился уже его удалять каждый раз.
                              0

                              Editor | File and Code Templates | Code | PHP Overridden Method Body.

                  0
                  Ребята, вы молодцы! Особенно контроль исключений — то, чего давно не хватало, так держать!
                    0
                    Спасибо, стараемся :)
                      0
                      Однако не обошлось без чайной ложечки дёгтя, к сожалению. Теперь все, что отлавливалось с помощью set_exception_handler подсвечивается и мозолит глаза.
                        0

                        Ну, тут уж извините: чем больше используется динамечских фич языка, тем сложнее IDE помогать с помощью статического анализа. Единственное, что приходит в голову, так это дать возможность указывать, какие исключения являются unchecked (WI-22936). Сейчас это только RuntimeException и LogicException. Но мы с удовольствием выслушаем альтернативные предложения.

                          +1
                          Было бы очень круто, тк сейчас все методы вызывающие методы работающие с бд подсвечены, тк доктрина может в случае недоступности бд кинуть исключение.
                    +1
                    По REST запросам интересная модификация, но вот 1 момент который все-же не дает пока перейти от Postman — Форматирование ответа.

                    В Postman ответ в виде Json дерева, а тут получается весь Json в строку.
                    Читать крайне неудобно.
                      0

                      Мы планируем добавить возможность автоматического форматирования ответа (WEB-28672).

                        0
                        Помимо форматирования ещё и содержимое кириллицы в ответе выводится как есть. Какое-нибудь \u041F\u0440\u0438\u0432\u0435\u0442 не особо читабельно, даже если его отформатировать.
                          0

                          Мы всегда рады предложениям в трекере.

                            0
                            У меня ответы идут в UTF-8 и с Кирилицей все нормально.

                            Но вот вопрос появился, а как передать тело запроса?
                            Например получить с Эластика агрегированные данные отправив такое тело:

                            {
                            	"aggs":
                            	{
                            		"agg_name":
                            		{
                            			"terms":
                            			{
                            				"field":"filed_name",
                            				"order":{"_count":"desc"},
                            				"min_doc_count":1
                            			}
                            		}
                            	}
                            }
                              0
                              Пустая строка после заголовков, потом тело.
                          0
                          Что-то как-то для Codeception слабенько все. Не хватает нормальной возможности запускать отдельные тесты и кейсы, запуска с code coverage. Ещё хочется научиться запускать тесты внутри docker контейнера.
                          И ещё что раздражает — результаты покрытия кода тестами никак не меняются при обновлении файла. Приходится вручную удалять и добавлять.
                            +1
                            Работа над Codeception продолжается, но многое из того, что вы перечислили уже поддерживается. Отдельные тесты и кейсы уже можно запускать — кликните правой кнопкой на методе и выберете Run или в Run Configuration выберете Method. Тесты внутри Docker контейнера тоже подерживаются — www.youtube.com/watch?v=UuiLnmWMvv0.

                            Голосуйте за поддержку code coverage в Codeception — youtrack.jetbrains.com/issue/WI-34962 и за обновление — youtrack.jetbrains.com/issue/WI-25513.
                              0

                              Про покрытие есть тикет (WI-34962), для всего остального предлагаю Вам не стеснятся и тикеты завести. Мы всегда рады обратной связи.

                              0
                              Привет.
                              Спасибо, очень клевые изменения. А можно как-то временно выключить «Контроль Исключений». У нас автотесты засветились, как Рождественская елка. :)
                                0

                                В настройках Editor | Inspections | PHP, названия инспекций перечислены в тексте статьи. Можно отключить совсем или поменять уровень на "No highlighting", если планируете пользоваться квикфиксами. Там же можно задать область, в который инспекции должны работать. Это может быть полезно, если инспекции нежелательны только в тестах, но не в коде.

                                0
                                JetBrains как всегда на высоте! Услышали меня с форматированием структур Twig. Может и следующее пожелание услышат:
                                Хотелось бы, что бы была настройка Smart-Checkout при переключении между ветками, которая позволяла бы текущие незакомиченные изменения отправлять в Shelf автоматически и возвращать при переключении обратно.
                                  0

                                  Есть такой тикет, голосуйте (IDEA-173936).

                                    0
                                    Отлично, спасибо, пошел голосовать.
                                  +3
                                  JetBrains, есть такой баг. Прошло 2 года… Новые фичи — это классно, но блин… 2 года прошло, а баг все еще бесит
                                    0

                                    Поддерживаю приходится мышь трогать. Кстати возникает не всегда, а через раз, закономерность отследить не получилось

                                    • UFO just landed and posted this here
                                        0

                                        А у меня другая комбинация, бесит меньше, чем один шифт жать:
                                        Shift-Shift
                                        Нет фокуса
                                        Alt-Tab
                                        Alt-Tab
                                        Shift-Shift
                                        Есть фокус)

                                        • UFO just landed and posted this here
                                            0

                                            Или пойти в тикет и приложить логи, которые помогут исправить проблему ;) Там же можно скачать тестовый билд, в котором проблема должна быть исправлена (см. последние комментарии).

                                        0
                                        Господи, я оказывается не один такой. На рабочем ноуте webstorm после апдейта на 2017.1 через какое-то время начал страдать этим. Причём дома с ней же — всё отлично. Переставлять не хочется, вроде баг мелкий, но такой противный.
                                        • UFO just landed and posted this here
                                          0
                                          Что-то не работают новые исклюения. Теперь весь код светится не перехваченными ошибками, игнорируя throws.

                                          Картиночка

                                            0

                                            Это Php Inspections плагин, все вопросы к автору.

                                              0
                                              Понял, принято.
                                                0
                                                Кстати, ребята починили вчера.
                                                  0
                                                  Огонь!

                                                  Кстати, а почему вы не хотите в ядро затащить этот плагин? Всё же статик анализ он предоставляет бесподобный.
                                                    0

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

                                            +1
                                            Странно как-то: в PhpStorm анонсируют рефакторинги для JS, которых для PHP нет. Сегодня прочитал бегло анонс на английском перед одним мероприятием, после него побежал к компу обновляться и никак не мог понять где этот рефакторинг, что не так делаю. И только сейчас, уже дома, читая этот пост, понял, что не про PHP было написано. Пришлось ручками выделять суперкласс и интерфейс.
                                              0
                                              А чего странного-то? В PhpStorm есть поддержка JavaScript, отчего бы нам не писать про новые JS фичи? К тому же, в тексте об этом сказано достаточно явно.
                                                0
                                                Кстати, а каких рефакторингов-то не хватает?
                                                  +2

                                                  Например:


                                                  • Extract (function/field) to new superclass (в новый клас и сделать его родителем текущего)
                                                  • Extract (function/field) to new Trait (в новый трейт и использовать в текущем)
                                                    0

                                                    Создание суперклассов (возможно абстрактных) и интерфейсов. Добавление метода/константы в интерфейс. Как-то по аналогии с Pull Members Up, можно даже прямо в нём с возможностью создания нового суперкласса/интерфейса.

                                                  0
                                                  Вечно включающийся ESLint (YouTrack Issue) никак не починят.
                                                  А в 2017.3 у меня отломался автокомплит this.props в React компонентах.
                                                    0
                                                    this.props будет исправлен в 2017.3.1
                                                    0
                                                    Все та же проблема с gulp watcher. Не видит storm изменения внешних файлов, если оно сделано через gulp. Да, если я сделаю через блокнот изменения шторим увидит, но не через gulp.
                                                      +1

                                                      Даже "File | Synchronize" не помогает?

                                                        0
                                                        Помогает наверное, но это не то. Там есть галочка Upload external changes так вот изменения от других программ она видит, но не от gulp.
                                                          0

                                                          Тут детали важны. Как я понимаю gulp просто работает в фоне (gulp watch или тому подобное) и при этом Вы не переключаетесь с одного приложения на другое (как при редактировании в блокноте, например). Если так, то да — PhpStorm не проверяет файлы на изменения в фоне — только при получении фокуса (когда альт-табишся с одного приложения на другое).


                                                          Или у Вас другая ситуация?

                                                            0
                                                            Такая, но смена фокуса тут не причем. Изменения файлов это события файловой системы. Если автоаплоад включен можно со свернутым штормом блокнотом править файлы и он будет свернутым все заливать с галочкой Upload external changes.
                                                      0
                                                      Как вернуть multiple carets по ctrl + alt + перетаскивание мышки, как было в старых версиях? Сейчас это по ctrl double click with arrow keys.
                                                        0
                                                        multiple carets по ctrl + alt + перетаскивание мышки

                                                        А когда такое было?

                                                          +1

                                                          Оно и сейчас работает: только это Alt + Mouse selection (Default keymap; Windows 10)

                                                            0

                                                            Ну, да. Вот мы тут и не очень поняли, о чем вообще речь.

                                                        0
                                                        Блин, да вы издеваетесь?
                                                        image
                                                          +2
                                                          Этот пункт меню из стороннего плагина. Например, у Symfony плагина есть такой баг.
                                                            0
                                                            О, спасибо, помогло. Но ведь на предыдущей версии-то не было.
                                                            0
                                                            Видимо это меню зависит от проекта/окружения. у меня там есть пункт создания тестов
                                                            0
                                                            Когда сделаете отключаемую проверку файлов на фтп? понятно что разные люди работают над разными вещами… но 7 лет игнорировать один из самых запрашиваемых реквестов… =((
                                                              0

                                                              Composer из докер-контейнера запускаться еще не научили? Очень не хватает такой возможности, приходится через docker exec извращаться, чтобы композер не ругался на то, что на хосте нет расширений.

                                                                0

                                                                Пока нет, но планируем (WI-23544).

                                                                0
                                                                А когда будет возможность настраивать удалённый интерпретатор в docker контейнере для typescript и баз данных?
                                                                  0

                                                                  А зачем TS и БД может понадобится интерпретатор? Что именно Вы бы хотели получить с появлением такой возможности?

                                                                    0
                                                                    Интерпритатор node для Typescript(Languages & Frameworks > TypeScript). Сейчас можно настроить только для локально установленной nodejs, на машине разработчика. Не удобно тем, что имея nodejs в докере, приходится на хосте устанавливать nodejs.
                                                                    Для базы данных хочется иметь возможность настроить источник находящийся в докер контейнере.
                                                                    Хост ничего не знает о nodejs и базе данных, порты не пробрасываются.
                                                                      0

                                                                      Для Node.js есть плагин. С БД вообще не должно быть проблем: поднимаете контейнер, создаете data source с соответствующим IP и портом. Если порты не пробрасываются — это вопрос конфигурации Докера, здесь мы ничем помочь не можем.

                                                                        0
                                                                        Плагин уже установлен, возможность настроить удалённый интерпретатор не появляется. image

                                                                        В случае с БД, я понимаю что это вопрос конфигурации, поэтому и интересуюсь будет ли возможность без проброса портов пользоваться этим инструментом :)
                                                                          0

                                                                          Его можно добавить при создании новой конфигурации (Run | Edit configurations...).


                                                                          Node.js

                                                                          Node.js


                                                                          По поводу БД. Не представляю, как можно подключиться к базе, если порт не проброшен.

                                                                            0

                                                                            Можно поднять контейнер с прокси, который пробросит порт :)


                                                                            Но у меня другая частая проблема — активно используется динамический проброс порта, то есть докер сам назначает порт на хосте. Нельзя ли как-то в источниках сделать чтобы можно было брать порт из метаданных контейнера, отбираемого по какому-то фильтру, например по регулярке/префиксу имени?

                                                                              0

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

                                                                  0
                                                                  Выражаю огромную благодарность за добавление аутентификации с использованием key-агента при подключении к БД через ssh-туннель.
                                                                    0
                                                                    Неудобно что в Unit-тестах с аннотацией @expectedException всё равно требует try-catch или @throws, а отключить это инспекцию, как понял, можно только на весь проект.
                                                                      +1
                                                                      а отключить это инспекцию, как понял, можно только на весь проект.

                                                                      Да нет. Создайте отдельный Scope только для тестов и отключите эту инспекцию только для него.

                                                                        0

                                                                        И правда неудобно. Завел (WI-38998), поправим.

                                                                        0

                                                                        эх, а переходить по импортам import Anything from '@/components/anything'; в .vue файлах так и не научили ;( упорно заявляет:


                                                                        cannot find declaration to go

                                                                        UPD: посыпаю голову пеплом, нашел в настройках как это пофиксить.
                                                                        settings > languages & frameworks > JavaScript > webpack — указать пусть до webpack.config

                                                                          0
                                                                          Подскажите, пожалуйста, как выглядит ваш webpack конфиг?
                                                                            0
                                                                            А каким образом это заработало? У меня пути не подсвечиваются и не доступны для перехода в принципе, а клик на компоненте лишь переносит к секции components
                                                                            0
                                                                            В ubuntu 17.10 не работает поиск. Нажимаешь «ctrl+f», появляется неактивное окошко поиска, в которое невозможно ничего вписать. Обновился блин…
                                                                              0

                                                                              Нам о такой проблеме неизвестно. Не могли бы Вы создать тикет и приложить туда логи?

                                                                              0
                                                                              Очень не хватает функции выгрузки файлов по ftp которые пришли по git pull, в истории они отображаются, а выделить и отправить нельзя, приходится искать корневые папки и отправлять все файлы
                                                                                0
                                                                                Записали себе (WI-7372), учтем. Спасибо!
                                                                                  0
                                                                                  Если открыть панель version control, вкладку log, то там можно выбрать файлы в отдельных коммитах и залить на фтп шоткатом с клавиатуры
                                                                                  0
                                                                                  Подскажите пожалуйста, как в macOS вернуть иконки PhpStorm для файлов (типов) в системе? Они затираются другими программами, но как восстановить оригинальные не понятно, переустановка Шторма иконки в Finder не меняет.
                                                                                    0

                                                                                    Найти файл в Finder, открыть свойства и поменять программу по-умолчанию. Применить для всех файлов этого типа.

                                                                                    0
                                                                                    Что — то вообще какая-то дичь с форматирование сложных twig файлов (множественные вложенные if) стала, все файлы поломались => отступы уходят вправо и не возвращаются…
                                                                                      0

                                                                                      Было бы здорово увидеть конкретные куски кода, для которых сломалось форматирование.

                                                                                        0
                                                                                        вот полное содержание файла на котором ломается форматирование:
                                                                                        Содерждимое одного из файлов где всё ломается
                                                                                        {% set itemsCount = 0 %}
                                                                                        {% for subfolder in subfolders %}
                                                                                            
                                                                                            {% if subfolder.IsNotMade %}
                                                                                                <div style="margin: 10px  10px 20px 0;">
                                                                                                    <a style="color:#ccc; float:right;"
                                                                                                       href="{{ base_url }}{{ subfolder.TreeAnchor }}">{{ subfolder.FolderName }}</a>
                                                                                                </div>
                                                                                                <div class="div_clear"></div>
                                                                                            {% else %}
                                                                                                
                                                                                                {% set itemsCount = itemsCount + 1 %}
                                                                                                
                                                                                                {% if subfolder.Tip == constant('repository\\ViewModels\\TreeTip::GROUP') %}
                                                                                                    {% if subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Group::DYNAMIC') %}
                                                                                                        <div class="content-block-header article-content-expander" {% if not subfolder.IsVisible %} style="display: none;" {% endif %}
                                                                                                            data-bind="click: CollapseClick.bind($data, $('#models_{{ subfolder.FolderId }}'), $('#sign_{{ subfolder.FolderId }}'))">
                                                                                                            <span class="left nowrap strong">
                                                                                                                <a href="#" class="h2_node_link" style="color:#06c;">
                                                                                                                    <span id="sign_{{ subfolder.FolderId }}"  style="font-size:10.5pt;">+</span>{{ subfolder.FolderName }}
                                                                                                                </a>
                                                                                                            </span>
                                                                                                        </div>
                                                                                                        
                                                                                                        <div style="margin-bottom: 5px;{% if subfolder.IsVisible %}display: none;{% endif %}" class="to_show" data-expand="0"  id="models_{{ subfolder.FolderId }}">
                                                                                                            {% if subfolder.Models %}
                                                                                                                {% if subfolder.IsVisible %}
                                                                                                                    {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                                                                                                {% else %}
                                                                                                                    {% if itemsCount == 1 %}
                                                                                                                        {% include 'model_groups/models_table.twig' with {'models' : subfolder.Models} only %}
                                                                                                                    {% else %}
                                                                                                                        {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                                                                                                    {% endif %}
                                                                                                                {% endif %}
                                                                                                            {% endif %}
                                                                                                    
                                                                                                            {% if subfolder.SubFolders %}
                                                                                                                {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                                                                                                            {% endif %}
                                                                                                        </div>
                                                                                                
                                                                                                    {% elseif subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Group::HEADER') %}
                                                                                                        {% if subfolder.SubFolders %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                                                                                            </div>
                                                                                                
                                                                                                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                                                                                                        {% else %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models, 'group_name' : subfolder.FolderName} only %}
                                                                                                            </div>
                                                                                                        {% endif %}
                                                                                                
                                                                                                    {% else %}
                                                                                                        <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                        </div>
                                                                                                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                                                                                                    {% endif %}
                                                                                                {% elseif subfolder.Tip == constant('repository\\ViewModels\\TreeTip::DIVISION') %}
                                                                                                
                                                                                                    {% if subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Division::INDEPENDENT') %}
                                                                                                
                                                                                                        <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                                                                                        </div>
                                                                                                
                                                                                                    {% elseif subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Division::MAIN') %}
                                                                                                        <div style="color:#666; margin:25px 0px 5px 30px; font-size:11pt;">
                                                                                                            <strong>{{ subfolder.FolderName }}</strong>    
                                                                                                        </div>
                                                                                                        {% if subfolder.SubFolders %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table.twig' with {'models' : subfolder.Models} only %}
                                                                                                            </div>
                                                                                                
                                                                                                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                                                                                                        {% else %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table.twig' with {'models' : subfolder.Models} only %}
                                                                                                            </div>
                                                                                                        {% endif %}
                                                                                                
                                                                                                    {% elseif subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Division::FULL') %}
                                                                                                        <div style="color:#666; margin:25px 0px 5px 30px; font-size:11pt;">
                                                                                                            <strong>{{ subfolder.FolderName }}</strong>    
                                                                                                        </div>
                                                                                                        {% if subfolder.SubFolders %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                                                                                            </div>
                                                                                                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                                                                                                        {% else %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                                                                                            </div>
                                                                                                        {% endif %}
                                                                                                
                                                                                                    {% else %}
                                                                                                        {% if subfolder.SubFolders %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                            </div>
                                                                                                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                                                                                                        {% else %}
                                                                                                            <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                            </div>
                                                                                                        {% endif %}
                                                                                                    {% endif %}
                                                                                                
                                                                                                {% elseif subfolder.Tip == constant('repository\\ViewModels\\TreeTip::SUBSECTION') %}
                                                                                                    <div style="color:#666; margin:25px 0px 0px 30px; font-size:11pt;">
                                                                                                        <strong>
                                                                                                            {% if subfolder.FolderIcon %}
                                                                                                                <img src="{{ subfolder.FolderIcon }}"  style="vertical-align: middle; margin: 0px;">
                                                                                                            {% endif %}
                                                                                                        {{ subfolder.FolderName }}
                                                                                                        </strong>    
                                                                                                    </div>
                                                                                                    {% if subfolder.SubFolders %}
                                                                                                        <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                        </div>
                                                                                                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                                                                                                    {% else %}
                                                                                                        <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                        </div>
                                                                                                    {% endif %}
                                                                                                {% elseif subfolder.Tip == constant('repository\\ViewModels\\TreeTip::SECTION') %}
                                                                                                    {% if subfolder.SubFolders %}
                                                                                                        <div id="mod_data"  style="margin-bottom: 5px;">
                                                                                                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                        </div>
                                                                                                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                                                                                                    {% endif %}
                                                                                                {% else %}
                                                                                                    {% if subfolder.SubFolders %}
                                                                                                        <div id="mod_data" style="margin-bottom: 5px;">
                                                                                                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                        </div>
                                                                                                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                                                                                                    {% else %}
                                                                                                        <div id="mod_data"  style="margin-bottom: 5px;">
                                                                                                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                                                                                                        </div>
                                                                                                    {% endif %}
                                                                                                    
                                                                                                {% endif %}
                                                                                            {% endif %}
                                                                                        
                                                                                        {% endfor %}
                                                                                        

                                                                                          0

                                                                                          Да, как-то ему нехорошо. Завел (WI-39018), спасибо.

                                                                                            0
                                                                                            Вам спасибо. Буду ждать )
                                                                                      0
                                                                                      Так вот, в новой версии задержки вывода символов на экран удалось сократить в четыре раза! Тем, кто работает с большими и огромными файлами, должно стать приятнее редактировать. Если же у вас в проекте ООП и по файлу на класс, вы разве что заметите слегка увеличившийся срок работы от батареи


                                                                                      Запустил проект, открыл файл PHP на 2 тысячи строк, Второй файл на 4 тысячи, между ними переключался и просто листал трекпадом, phpstorm начал сильно жрать батарею + процесор поднимаеться на 10 градусов сразу, как то странно, вроде бы до этого не было ;(
                                                                                      Если что Macbook, Highlighting = Inspection
                                                                                        0

                                                                                        Если это воспроизводится, было бы здорово увидеть CPU-snapshot того, что так разогревает процессор (инструкция).

                                                                                          +1
                                                                                          Залил на dropbox Скачать
                                                                                            0
                                                                                            Смотрим, спасибо! А пока суть да дело: есть ли шанс приватно получить доступ к проекту? Очень помогло бы в локализации проблемы.
                                                                                              0
                                                                                              Так, по текущей информации проблема должна быть исправлена в одном из первых патчей (2017.3.1 или 3.2). Проверьте, пожалуйста, еще раз, когда они выйдут. Ну и в любом случае, мы всегда рады снэпшотам в нашем трекере ;)
                                                                                          0
                                                                                          Вопрос про EAP, я не нашёл ссылок на лицензию EAP и официального объяснения.
                                                                                          1) Я могу каждый месяц обновлять EAP-версию? Это легально, или такая уловка, которая не поощряется?
                                                                                          2) Какие ограничения использования EAP?
                                                                                          2.1) Могу ли использовать EAP-версию для коммерческого индивидуального использования?
                                                                                          2.2) А в компании?..
                                                                                            +2

                                                                                            Есть 2 вида EAP:


                                                                                            • мажорная (2017.3) — любой может пользоваться ею. С каждой версией/билдом идет своя 30-дневная лицензия. Новые фичи, новые баги (вполне возможно, ибо это WIP — Work In Progress). Упор идет на добавление нового функционала а не на производительность (сначала сделать что бы работало, а когда уже работает то и оптимизировать можно); на более массовое тестирование нового функционала, выявление возможных при этом багов/возможных доработок.
                                                                                            • багфиксная (2017.3.1, 2017.3.x) — самая обычная — нужна полноценная лицензия (либо стандартный 30-дневный триал). Это для тех кому нужны багфикси уже сейчас а не ждать официального релиза. Новый функционал здесь уже не очень то и появляется (более мелкие доработки), релиз считается стабильным, поэтому нужна лицензия.

                                                                                            На данный момент EAP для мажорной уже закончен (ибо состоялся финальный 2017.3 релиз). Следующий EAP билд будет для 2017.3.1 и будет требовать лицензию. Бесплатным EAP будет опять для 2018.1

                                                                                              0
                                                                                              Спасибо!
                                                                                              Багфиксная — это которая на сайте называется «Free 30-day trial»?
                                                                                              Можно ли где-нибудь подробнее почитать об этом?
                                                                                                +1
                                                                                                Багфиксная — это которая на сайте называется «Free 30-day trial»?

                                                                                                "Багфиксная" это 2017.3.1, 2017.3.2 и т.д. Та что на сайте это 2017.3.0 final/release (то-есть уже не EAP но еще не багфикс релиз).


                                                                                                Последний доступный EAP билд был для мажорной EAP — по идее Вы можете им пользоваться до окончания встроенной временной лицензии (я не помню есть ли требование мол "если финалка выпущена то нужно прекратить использование EAP билда" — раньше такого не видел да и лицензия у меня есть).


                                                                                                Первый "багфиксный" EAP билд будет скорее всего в следующую среду (как правило они публикуют их в этот день недели; и он будет требовать лицензию) а официальный релиз 2017.3.1 состоится где-то через 2-3 недели (по идее).


                                                                                            +1
                                                                                            Спасибо, за крайне удобный шторм, но вот частенько сильно не хватает одной небольшой мелочи — невозможно перейти по ссылке вида Class::method или Class::$property. Такие ссылки встречаются довольно часто — в доках, сообщениях об ошибках и даже штормовская функция Copy Reference такую создает, а перейти по ней сам не может, печаль.
                                                                                            Думал что-то найти не могу — писал в саппорт, но там мне только посоветовали юзать Ctrl+N и Class#method, иногда можно конечно воспользоваться, но постоянно исправлять :: на # уже раздражает и главное непонятно зачем дело стало, функционал то уже такой есть…
                                                                                              0

                                                                                              В документации ссылки такого вида отлично работают в паре с тегом @see. О какого рода "сообщениях об ошибках" идет речь?

                                                                                                0
                                                                                                Про документацию имел ввиду не код, а описание например в какой-то вики-системе, почему указывать в доках именно в таком виде — это общепринятая практика и идет от доков самого пхп, вот например видно, что они повсеместно описывают подобным образом php.net/manual/ru/pdo.begintransaction.php.
                                                                                                О сообщениях я имел ввиду страницу ошибки которую выводит YII2, думал, что в таком виде берется из стэка вызовов PHP, но посмотрел — нет все таки сами во фреймворке так выводят, так, что именно это можно считать специфичным для YII2. Но первый пункт все таки актуален, и главное — сам то пхпшторм такую ссылку формирует! Ее бы передаешь кому-то посмотреть, а он по быстрому перейти по ней не может, как в случае со ссылкой на строке.
                                                                                                  0

                                                                                                  В общем случае, конечно, мы можем это сделать. В частности, нам придется писать парсер PHPDoc, который будет пытаться из текста вычленить такие выражения. И нам бы очень не хотелось этим заниматься, есть куча других интересных вещей. В других языках это решается специальными тегами. Например, в Java есть {@link}, ссылки внутри которого отлично подсвечиваются. В PHP тоже такой был, но его сделали deprecated, а альтернативы не предложили. Если бы можно было использовать {@see}, это решило бы проблему. Но текущая версия спецификации этого не позволяет.

                                                                                                    +1
                                                                                                    Наверное мы о разном, а имел ввиду не сделать возможным переход по таким ссылкам в пхпдоке, а сделать переход из диалога Ctr+N (меню Navigate-Class) — сейчас он отлично позволяет переходить по ссылкам вида Class#method и Class#property, но не позволяет делать точно такой же! переход по аналогичным ссылкам Class::method и Class::$property, хотя именно такой вид ссылок используются в доках по пхп и другой документации по пхп-библиотекам. Т.е. достаточно сделать, чтобы этот диалог распознавал ссылки с разделителем :: наравне с # и делал точно такой же переход — это мне кажется достаточно простая доработка, но очень полезная для быстрой навигации.
                                                                                                    Спасибо за терпение :)
                                                                                                      +1
                                                                                                      А, это и правда о другом. Зафайлил (WI-39109), спасибо.
                                                                                              0
                                                                                              del
                                                                                                0

                                                                                                К сожалению, так и не подружились с результатами тестов при использовании specify https://youtrack.jetbrains.com/issue/WI-36214#u=1493669446130

                                                                                                  0

                                                                                                  После обновления PhpStorm стал глючить (например, многократные сообщения об ошибке в плагине CSS Support). Пришлось удалить глобальные настройки, чтобы исправить. Уже не первое такое обновление.

                                                                                                    0
                                                                                                    После обновления при запуске выкидывает «there is not enough memory to perform the requested operation phpstorm», стоит по дефолту 725mb, всегда этого хватало, пробовал увеличивать вдвое, все равно мало.
                                                                                                    Не у кого подобной проблемы нету?
                                                                                                    Пока пришлось откатиться, память сжирает на старте
                                                                                                      0
                                                                                                      В папке с логами (Help | Show Logs) должны быть мемори дампы, хотелось бы на них взглянуть.
                                                                                                        +1
                                                                                                        dropmefiles.com/3nOKB
                                                                                                        dropmefiles.com/wSZdU
                                                                                                          0
                                                                                                          По первой ссылке файл удален, а во второй что-то не очень помогает. Это точно от правильной версии? Для разных версий логи хранятся в разных папках. Кстати, о логах, На них тоже было бы здорово взглянуть.
                                                                                                            +1
                                                                                                            вся папка с логами
                                                                                                            dropmefiles.com/FMTJI
                                                                                                              0
                                                                                                              Спасибо. Это известная проблема, будет исправлена в первом патче.
                                                                                                                0
                                                                                                                Вам спасибо)

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