Комментарии 130
Нет ли случайно открытого проекта, где это воспроизводится? Спасибо.
{applause} !!!
(и да, можете минусовать за бессодержательность)
PhpStorm, как одна из IDE на этой платформе, научился запоминать свое состояние для каждой ветки и восстанавливает его при переключении между ними.
Это касается Favorites ?
p.s. Извини, нет возможности сейчас самому проверить.
А если у меня в одной ветке файл есть, а в другой его нет и я туда закладку поставил, то после переключения на вторую ветку и обратно закладка пропадёт навсегда?
Ведь любое исключение в PHP 7.1 — Throwable. Да и система указывает на исключение которое наследуется от Exception.
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. Тогда вроде как все верно. Но лучше гляньте лишний раз.
Ну да, внутри catch
-блока выбрасывается MyCustomException
. Если оно не задекларировано и выше нигде не ловится, то PhpStorm считате его необработанным.
При этом такой объект создается через динамический require(), поэтому Шторм такое не засечет.
В общем, суть та же что и с функциями
Про анонимные классы — это я погорячился, с ними ситуация точно такая же, как и с обычными. Т.е. не имеет значения его дальнешее использование, важно либо задекларировать исключение в PHPDoc метода, либо его обработать внутри метода. Иная ситуация с анонимными функциями, но они тут не причем, поэтому я и отредактировал сообщение.
Ну, тут уж извините: чем больше используется динамечских фич языка, тем сложнее IDE помогать с помощью статического анализа. Единственное, что приходит в голову, так это дать возможность указывать, какие исключения являются unchecked (WI-22936). Сейчас это только RuntimeException
и LogicException
. Но мы с удовольствием выслушаем альтернативные предложения.
В Postman ответ в виде Json дерева, а тут получается весь Json в строку.
Читать крайне неудобно.
Но вот вопрос появился, а как передать тело запроса?
Например получить с Эластика агрегированные данные отправив такое тело:
{
"aggs":
{
"agg_name":
{
"terms":
{
"field":"filed_name",
"order":{"_count":"desc"},
"min_doc_count":1
}
}
}
}
И ещё что раздражает — результаты покрытия кода тестами никак не меняются при обновлении файла. Приходится вручную удалять и добавлять.
Голосуйте за поддержку code coverage в Codeception — youtrack.jetbrains.com/issue/WI-34962 и за обновление — youtrack.jetbrains.com/issue/WI-25513.
Спасибо, очень клевые изменения. А можно как-то временно выключить «Контроль Исключений». У нас автотесты засветились, как Рождественская елка. :)
В настройках Editor | Inspections | PHP, названия инспекций перечислены в тексте статьи. Можно отключить совсем или поменять уровень на "No highlighting", если планируете пользоваться квикфиксами. Там же можно задать область, в который инспекции должны работать. Это может быть полезно, если инспекции нежелательны только в тестах, но не в коде.
Хотелось бы, что бы была настройка Smart-Checkout при переключении между ветками, которая позволяла бы текущие незакомиченные изменения отправлять в Shelf автоматически и возвращать при переключении обратно.
Есть такой тикет, голосуйте (IDEA-173936).
Поддерживаю приходится мышь трогать. Кстати возникает не всегда, а через раз, закономерность отследить не получилось
Это Php Inspections плагин, все вопросы к автору.
Кстати, а почему вы не хотите в ядро затащить этот плагин? Всё же статик анализ он предоставляет бесподобный.
В ядре мы стараемся сохранять баланс функциональность/производительность. Добавление большой пачки инспекций замедлит работу PhpStorm у всех, даже у тех, кому они не нужны. В то же время над каждой новой своей инспекцией мы проводим большую работу по оптимизации ее производительности. Поэтому мы взяли за правило сотрудничать с авторами, а не брать их работу себе.
Например:
- Extract (function/field) to new superclass (в новый клас и сделать его родителем текущего)
- Extract (function/field) to new Trait (в новый трейт и использовать в текущем)
Создание суперклассов (возможно абстрактных) и интерфейсов. Добавление метода/константы в интерфейс. Как-то по аналогии с Pull Members Up, можно даже прямо в нём с возможностью создания нового суперкласса/интерфейса.
А в 2017.3 у меня отломался автокомплит this.props в React компонентах.
Даже "File | Synchronize" не помогает?
Тут детали важны. Как я понимаю gulp просто работает в фоне (gulp watch
или тому подобное) и при этом Вы не переключаетесь с одного приложения на другое (как при редактировании в блокноте, например). Если так, то да — PhpStorm не проверяет файлы на изменения в фоне — только при получении фокуса (когда альт-табишся с одного приложения на другое).
Или у Вас другая ситуация?
Composer из докер-контейнера запускаться еще не научили? Очень не хватает такой возможности, приходится через docker exec
извращаться, чтобы композер не ругался на то, что на хосте нет расширений.
А зачем TS и БД может понадобится интерпретатор? Что именно Вы бы хотели получить с появлением такой возможности?
Для базы данных хочется иметь возможность настроить источник находящийся в докер контейнере.
Хост ничего не знает о nodejs и базе данных, порты не пробрасываются.
В случае с БД, я понимаю что это вопрос конфигурации, поэтому и интересуюсь будет ли возможность без проброса портов пользоваться этим инструментом :)
Его можно добавить при создании новой конфигурации (Run | Edit configurations...).
По поводу БД. Не представляю, как можно подключиться к базе, если порт не проброшен.
Можно поднять контейнер с прокси, который пробросит порт :)
Но у меня другая частая проблема — активно используется динамический проброс порта, то есть докер сам назначает порт на хосте. Нельзя ли как-то в источниках сделать чтобы можно было брать порт из метаданных контейнера, отбираемого по какому-то фильтру, например по регулярке/префиксу имени?
эх, а переходить по импортам import Anything from '@/components/anything';
в .vue файлах так и не научили ;( упорно заявляет:
cannot find declaration to go
UPD: посыпаю голову пеплом, нашел в настройках как это пофиксить.
settings > languages & frameworks > JavaScript > webpack — указать пусть до webpack.config
Нам о такой проблеме неизвестно. Не могли бы Вы создать тикет и приложить туда логи?
Было бы здорово увидеть конкретные куски кода, для которых сломалось форматирование.
{% 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 %}
Так вот, в новой версии задержки вывода символов на экран удалось сократить в четыре раза! Тем, кто работает с большими и огромными файлами, должно стать приятнее редактировать. Если же у вас в проекте ООП и по файлу на класс, вы разве что заметите слегка увеличившийся срок работы от батареи
Запустил проект, открыл файл PHP на 2 тысячи строк, Второй файл на 4 тысячи, между ними переключался и просто листал трекпадом, phpstorm начал сильно жрать батарею + процесор поднимаеться на 10 градусов сразу, как то странно, вроде бы до этого не было ;(
Если что Macbook, Highlighting = Inspection
Если это воспроизводится, было бы здорово увидеть CPU-snapshot того, что так разогревает процессор (инструкция).
1) Я могу каждый месяц обновлять EAP-версию? Это легально, или такая уловка, которая не поощряется?
2) Какие ограничения использования EAP?
2.1) Могу ли использовать EAP-версию для коммерческого индивидуального использования?
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
Багфиксная — это которая на сайте называется «Free 30-day trial»?
Можно ли где-нибудь подробнее почитать об этом?
Багфиксная — это которая на сайте называется «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 недели (по идее).
Думал что-то найти не могу — писал в саппорт, но там мне только посоветовали юзать Ctrl+N и Class#method, иногда можно конечно воспользоваться, но постоянно исправлять :: на # уже раздражает и главное непонятно зачем дело стало, функционал то уже такой есть…
В документации ссылки такого вида отлично работают в паре с тегом @see
. О какого рода "сообщениях об ошибках" идет речь?
О сообщениях я имел ввиду страницу ошибки которую выводит YII2, думал, что в таком виде берется из стэка вызовов PHP, но посмотрел — нет все таки сами во фреймворке так выводят, так, что именно это можно считать специфичным для YII2. Но первый пункт все таки актуален, и главное — сам то пхпшторм такую ссылку формирует! Ее бы передаешь кому-то посмотреть, а он по быстрому перейти по ней не может, как в случае со ссылкой на строке.
В общем случае, конечно, мы можем это сделать. В частности, нам придется писать парсер PHPDoc, который будет пытаться из текста вычленить такие выражения. И нам бы очень не хотелось этим заниматься, есть куча других интересных вещей. В других языках это решается специальными тегами. Например, в Java есть {@link}
, ссылки внутри которого отлично подсвечиваются. В PHP тоже такой был, но его сделали deprecated, а альтернативы не предложили. Если бы можно было использовать {@see}
, это решило бы проблему. Но текущая версия спецификации этого не позволяет.
Спасибо за терпение :)
К сожалению, так и не подружились с результатами тестов при использовании specify https://youtrack.jetbrains.com/issue/WI-36214#u=1493669446130
После обновления PhpStorm стал глючить (например, многократные сообщения об ошибке в плагине CSS Support). Пришлось удалить глобальные настройки, чтобы исправить. Уже не первое такое обновление.
Не у кого подобной проблемы нету?
Пока пришлось откатиться, память сжирает на старте
dropmefiles.com/wSZdU
dropmefiles.com/FMTJI
Доступен PhpStorm 2017.3