{"id":378374,"date":"2023-08-03T18:38:08","date_gmt":"2023-08-03T17:38:08","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=378374"},"modified":"2025-09-17T14:09:38","modified_gmt":"2025-09-17T13:09:38","slug":"phpstorm-2023-2-is-now-available","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/ja\/phpstorm\/2023\/08\/phpstorm-2023-2-is-now-available","title":{"rendered":"PhpStorm 2023.2 Is Now Available"},"content":{"rendered":"\n<p>This release is a major update that includes improvements for generics in PHP, Laravel Pint support, native support for PHP assertions, AI Assistant (Limited access), GitLab integration, text search in <em>Search Everywhere<\/em>, and much more.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2023\/08\/phpstorm-2023-2-is-now-available\/\"><img decoding=\"async\" loading=\"lazy\" width=\"2560\" height=\"1440\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/Featured_Blog_1280x720_PhpStorm-2x.png\" alt=\"\" class=\"wp-image-378421\"\/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/phpstorm\/whatsnew\/2023-2\/\" target=\"_blank\" rel=\"noopener\">Download PhpStorm 2023.2<\/a><\/p>\n\n\n\n<p>For a quick video overview, check out this roundup of the key changes from our Developer Advocate, Brent.<\/p>\n\n\n\n<p align=\u201dcenter\u201d><iframe loading=\"lazy\" title=\"YouTube video player\" src=\"https:\/\/www.youtube.com\/embed\/iPoyQ_qXUqY\" allowfullscreen=\"allowfullscreen\" width=\"1120\" height=\"630\" frameborder=\"0\"><\/iframe><\/p>\n\n\n\n<p>\u2014<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">PHP<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Generics in PHP<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">New <em>Rename generic<\/em> refactoring<\/h4>\n\n\n\n<p>Press <strong><kbd>Shift+F6<\/kbd><\/strong> while on a generic type to start renaming it and PhpStorm will automatically update the name throughout your whole codebase.<\/p>\n\n\n\n<p>Another way to do the same is by pressing <strong><kbd>Ctrl+T<\/kbd><\/strong> and then choosing <em>Rename<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1400\" height=\"850\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/05\/eap-1-rename-generic-1.gif\" alt=\"\" class=\"wp-image-357146\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Support for the `static` type in generics<\/h4>\n\n\n\n<p>One of the most highly anticipated features in this area has been support for static references in generic templates.<\/p>\n\n\n\n<p>We\u2019ve finally implemented it in this release but will continue to work on making PHP generics support the best it can possibly be going forward.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1400\" height=\"850\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/05\/eap-1-generic-static.gif\" alt=\"\" class=\"wp-image-357123\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Support for @mixin with templates<\/h4>\n\n\n\n<p>With generic <code>@mixin<\/code> annotations, you can fully benefit from decorator and other patterns for injecting behavior into objects. PhpStorm now provides code completion for these where applicable.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1400\" height=\"850\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/generics_mixin.png\" alt=\"\" class=\"wp-image-378474\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">No more redundant PHPDocs generation<\/h3>\n\n\n\n<p>PhpStorm now drops redundant declarations from auto-generated PHPDoc blocks in a larger number of its actions and reports on specific redundant PHPDoc tags in doc comments.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-6-docblock-getters-setters.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>To invoke the generation of getter and setter methods, use the Add getter\/setter intention (<strong><kbd>Alt+Enter<\/kbd><\/strong>) or the generate code action (<strong><kbd>\u2318N<\/kbd> \/ <kbd>Alt+Insert<\/kbd><\/strong> on Windows).<\/p>\n\n\n\n<p>Previously generated PHPDoc blocks have been addressed as well:<\/p>\n\n\n\n<ul>\n<li>The <em>Redundant PHPDoc comment<\/em> inspection has been extended to report PHPDoc comments that contain at least one redundant tag. Previously, it only worked if the whole block was redundant.<\/li>\n\n\n\n<li>The new <em>Remove all redundant PHPDoc tags<\/em> quick-fix removes only redundant tags from a PHPDoc block. This quick-fix is available on doc comments even if the inspection has a <em>No highlighting<\/em> severity level.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/0aeNNx1GPqPJ-ziwEQItkHw2Xb8k30tyY4I6htenKwND39XuRRjN1YiTNc1ic1JEYi-vP9QiTMCJhOw29uTv4wmuKRO165uTVASvv6Vysf8H1rZeKIv0stI5hecM_BW7hgg7c7IyGbWUITSSBdS-dt4.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>There are still more IDE actions that could benefit from this improvement, such as the Generate PHPDoc intention and the Update PHPDoc Comment quick-fix. If this is something you are waiting for, please upvote the issue <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/WI-72892\/Generate-PHPDocUpdate-PHPDoc-Comment-add-an-option-to-not-generate-redundant-tags\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Object shapes support<\/h3>\n\n\n\n<p>In this release, we are adding the ability to define the structure of generic objects via shape annotation, similar to how it is done for <a href=\"https:\/\/blog.jetbrains.com\/ja\/phpstorm\/2022\/02\/phpstorm-2022-1-eap-3#support-specific-arrays-in-object-like-arrays\">array shapes<\/a>.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/6OpE1tnnNjwBoqVfU7ZtsuuEEauvAHFe8uFUs-AVvBv0IlR1qQj4zp8WQ0W9ldxVqNFCaW0xbccD62GWotUcssKcudHaT8orWBLr0fSzVNN4GrNFmkI3hZUsUVyDPHQXX0z0QjPMgSa_CvCHcQUE8rY.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>While you would normally define objects via declared properties, you may also need proper code completion for dynamic properties with classes like&nbsp;<code>stdClass<\/code> or functions like <code>__get()<\/code>\/<code>__set()<\/code> or <code>json_decode()<\/code>.<\/p>\n\n\n\n<p>Now you can define the structure of an arbitrary object in a PHPDoc comment, and PhpStorm will parse the object shape and display a code completion tooltip during assignment of object properties. The syntax is supported for nested objects as well.<\/p>\n\n\n\n<p>The other way around, you can use a PhpStorm quick-fix <kbd><strong>Alt+Enter<\/strong><\/kbd> to generate object shapes in a PHPDoc comment or an&nbsp;<\/p>\n\n\n\n<p><code>#[ObjectShape]<\/code> attribute for the objects that already have properties assigned to them.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/zBQ7KCC5qvdzdyOcv-Mqi3kO4RkAEDxc8TFnFAVTmm-EDNjGUj6gkL7T5FOf1sLE0Uw9-5gdKLJkj6bvmLIy-QQxuDNvHNnS6gh9aUg8roqu1McWRMMC2M3ctTCKMD9yToYeT6SP4gT_qDfWA2g6_M.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Built-in support for Laravel Pint<\/h3>\n\n\n\n<p>PhpStorm has added <a href=\"https:\/\/laravel.com\/docs\/9.x\/pint\" target=\"_blank\" rel=\"noopener\">Laravel Pint<\/a> to the list of supported quality tools. Code style issues reported by Laravel Pint can now be treated like <a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/running-inspections.html\" target=\"_blank\" rel=\"noopener\">PhpStorm&#8217;s own code inspections<\/a>.<\/p>\n\n\n\n<p>To configure the integration with Laravel Pint, go to <em>Settings | PHP | Quality Tools<\/em> and expand the <em>Laravel Pint <\/em>section.<\/p>\n\n\n\n<p>Here, you can also set Laravel Pint as your external formatter of choice. This would enable the fixing of all issues detected by Laravel Pint in one go with the <a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/reformat-and-rearrange-code.html\" target=\"_blank\" rel=\"noopener\"><em>Reformat Code<\/em><\/a> (<strong><kbd>\u2318\u2325 L<\/kbd> <\/strong>\/ <strong><kbd>Ctrl+Alt+L<\/kbd><\/strong>) action.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/1lhb7Qy7Ntjra_76v1BC8gBzhepDcZdWW4WqIrwA1FxqOkZbOmOiHD89jjBRqHk1_BouKrUI78LzGzbtM-PFqjKnaQODhyIwMhCoa89vXa2uitN_NMnywNjQ_DvGcQGl7S9WPG63ThB6xg6ntKTZGCY.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>To enable Laravel Pint as a PhpStorm inspection, go to <em>Settings | Editor | Inspections <\/em>and select the checkbox for <em>Laravel Pint validation<\/em> under <em>PHP | Quality Tools<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/713eO_gjtsVH0SMAR3VuxkzQdQBXAVzoO8-lcIWc2ILIZUx84sx3CAA8Ukf05ulH1dkqAp3Mb3ss_Oa8DSCtHdyPU93MOAEQLjlYYtZEmVOqKKIB03_0PMshlm-36p6wETTK7AwDbOc4MkT5-lfk3iU.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>With the inspection enabled, issues detected by Laravel Pint will be highlighted in any opened PHP file or reported in the<strong> <\/strong><em>Problems <\/em>tool window.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Improvements to code quality tools<\/h3>\n\n\n\n<p>PhpStorm 2023.2 has revised the approach to running inspections with third-party code quality tools. The new implementation enables the usage of a baseline and the<strong> <\/strong>exclusion of files from inspections and mappings.<\/p>\n\n\n\n<p>Previously, PhpStorm would run the code quality tool on a temporary copy of the source files, which made it impossible to use a baseline with ignored inspections or options like <em>excludePath<\/em> or <em>scanDirectories<\/em>. Now, PhpStorm runs the code quality tool directly on the source files (for batch inspections) or passes the contents of source files as <code>STDIN<\/code> input (for instant analysis of opened files).<\/p>\n\n\n\n<p>So far, the switch to <code>STDIN<\/code> input has been implemented only for PHP_CodeSniffer, but we also aim to have other code quality tools like PHPStan, PHP CS Fixer, and Psalm support input from <code>STDIN<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Inspections for PHP assertions<\/h3>\n\n\n\n<p>With this release, we\u2019ve extended the code insight logic to cover PHP assertions.<\/p>\n\n\n\n<p>PhpStorm now detects and highlights assertions that are redundant because they are always true or always false. This is available for PHP\u2019s built-in <code>assert()<\/code> constructs, PHPUnit\u2019s assertion methods, and methods from the <a href=\"https:\/\/github.com\/webmozarts\/assert\" target=\"_blank\" rel=\"noopener\">webmozart\/assert<\/a> and <a href=\"https:\/\/github.com\/beberlei\/assert\" target=\"_blank\" rel=\"noopener\">beberlei\/assert<\/a> libraries.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/SH0MjIMWzG_T4bjfyOiL1cz2sGopjXGg5w1EdwKikfGywAzLcU-S1nk7dl8mLKc1ju0sc_7qkAXTpQqG0ng_7uFnE8bPRUMKZ9C4X2CgFoiyH2PSEncbhUIpST5URKnQ1Y8cEBM9X2m00KD611mmkeU.png\" width=\"1432\" height=\"734\"><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Xdebug: download and install extension<\/h3>\n\n\n\n<p>Configuring Xdebug can be hard, so we\u2019ve tried to improve it with every release.<\/p>\n\n\n\n<p>When starting the debugger for the first time, if PhpStorm cannot connect to Xdebug, then the IDE will offer to download the extension and install it locally by updating <code>php.ini<\/code>.<\/p>\n\n\n\n<p>This works on Windows, macOS, and Linux.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/2RBF7KECWTnhhG7y7yQwekjTFdLYIAacLFE5LUzF4Zic2Hz3UdGhjpCyu0fJ4Q8DUiBGQMoldOirlXBhYhYNWcogY4-ZxL8IAfOxNQTN3ksAr2BYNHPoCdhGjH7VOTNUjG0r8Jz0g-AEcKAZB6rw0Zs.png\" width=\"712\" height=\"151\"><\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Improved framework plugins navigation<\/h3>\n\n\n\n<p>Previously, the <em>Settings | PHP | Frameworks<\/em> section listed only the PHP frameworks supported by JetBrains out of the box. Now, we\u2019ve also added community-maintained plugins for <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/13441-laravel-idea\" target=\"_blank\" rel=\"noopener\"><strong>Laravel Idea<\/strong><\/a> and <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/7219-symfony-support\" target=\"_blank\" rel=\"noopener\"><strong>Symfony<\/strong><\/a> to the list.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/9zKC7bTBzVTpyCkuO9vXzXjL0s5T0zL6bSPtJ7a0XlRMjXUuaTY7QGyBauJkvoEfJcdqKXLOdFcwyCl4QwjjgnLdmqnoqKN1ZxirNAInEXTnPMaK8jHuxA7ZsVdg2a-IT6KVaNJEGm3DrUtbvUR75G4.png\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">AI Assistant (Limited access)<\/h2>\n\n\n\n<p>A major addition in this version is AI Assistant, which is designed to augment your coding with AI capabilities. With its starting set of features, you can already chat with AI Assistant and have it do things like automatically write documentation comments for you, suggest names, generate commit messages, and more.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">AI chat<\/h3>\n\n\n\n<p>Use the <em>AI Assistant<\/em> tool window to communicate with the LLM (Large Language Model), ask questions, or get help with a piece of code. PhpStorm will provide project-specific context, such as the PHP language level and the framework used in your project. Once you\u2019re happy with the resulting AI-generated code, click <em>Insert Snippet at Caret<\/em> to paste the code into the editor, or just copy it over.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-6-ai-chat.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">AI Actions<\/h3>\n\n\n\n<p>The <strong><kbd>\u2325Enter <\/kbd>\/ <kbd>Alt+Enter<\/kbd> <\/strong>context menu now features <em>AI Actions<\/em>, which include a number of tasks AI Assistant can help you with.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-6-ai-actions.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Rename suggestions<\/h3>\n\n\n\n<p>When using the rename refactoring, the AI Assistant will provide you with suggestions for other names.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-620ai-rename.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Code documentation<\/h3>\n\n\n\n<p>AI Assistant can also generate documentation for you. Press <strong><kbd>\u2325Enter<\/kbd> \/ <kbd>Alt+Enter<\/kbd><\/strong>, select the <em>AI Actions<\/em> menu, and choose <em>Write Documentation<\/em>. Alternatively, AI Assistant will gladly try to explain your code via the chat.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-6-ai-docs.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Commit message generation<\/h3>\n\n\n\n<p>The commit message dialog now has a <em>Commit Message with AI Assistant<\/em> button. Click it to send the diffs of your changes to the LLM, which will generate a commit message describing your changes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-6-ai-git.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">How to access<\/h3>\n\n\n\n<p>AI Assistant is powered by the JetBrains AI service. To access the AI features, you will need to manually install the <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/22282-ai-assistant\" target=\"_blank\" rel=\"noopener\">AI Assistant plugin<\/a> and be logged in to the JetBrains AI service with your JetBrains Account. The simplest way to do this is to click the <em>More tool windows<\/em> icon on the toolbar, select <em>AI Assistant<\/em>, and follow the prompts.<\/p>\n\n\n\n<p>Please also note that AI Assistant access may currently be limited by a waitlist. You can find more information about how AI Assistant works, as well as details on how we handle your code and data, in this <a href=\"https:\/\/blog.jetbrains.com\/ja\/idea\/2023\/06\/ai-assistant-in-jetbrains-ides\">blog post<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/eap-6-ai-install.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>We encourage you to try out these new AI features and send us your ideas and suggestions. To do so, simply click <em>Share your feedback<\/em> in the<strong> <\/strong><em>AI Assistant<\/em> tool window. You\u2019re also welcome to report AI Assistant bugs on <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/LLM\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Text search in <em>Search Everywhere<\/em><\/h3>\n\n\n\n<p><em>Search Everywhere <\/em><strong><em>(Double \u21e7<\/em><\/strong><em> \/ <\/em><strong><em>Double Shift)<\/em><\/strong> is used for searching through files, classes, methods, actions, and settings.<\/p>\n\n\n\n<p>Now it includes text search capabilities similar to those in <em>Find in Files<\/em>. Text search results are displayed when there are few or no other search results available for a given query.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1820\" height=\"920\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/search-everywhere_text-search-1.gif\" alt=\"\" class=\"wp-image-378603\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">User experience<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Colored project headers in the new UI<\/h3>\n\n\n\n<p>You can now assign a unique color and icon to each of your projects, making it easier to distinguish them in your workspace.<\/p>\n\n\n\n<p>Headers come with predefined colors by default, but now you can customize them: Right-click on a header, select the <em>Change Toolbar Color<\/em> option, and then choose your desired color.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1248\" height=\"600\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/project_color.gif\" alt=\"\" class=\"wp-image-378574\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Improved main toolbar customization<\/h3>\n\n\n\n<p>In the new UI, you can now use a dropdown menu to quickly choose actions that you want to add to the toolbar.<\/p>\n\n\n\n<p>Right-click on any widget, select <em>Add to Main Toolbar<\/em>, and explore the available options.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1248\" height=\"600\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/customize_toolbar.gif\" alt=\"\" class=\"wp-image-378563\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Reworked hamburger menu in the main toolbar on Windows and Linux<\/h3>\n\n\n\n<p>We\u2019ve refined the behavior of the hamburger menu in the new UI, located in the main toolbar for Windows and Linux. Once you click on the menu icon, the elements now appear horizontally over the toolbar.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/XD7wJfQ1mrQn6euhS0ML2CQSZoIaBFttCMaxnC8Gu_hX7fqfdT9U63s5kFDzpR7NiwH-egnMuBQq3WE4mpkKBfNeQS84fPCO5KMn9FKbbsE1AG8ZtZj8uh0HzpzxjIvJuNH9aZ1ljwPn6yQZdaZggi4.gif\" alt=\"\"\/><\/figure>\n\n\n\n<p>Also, there\u2019s now an option to turn this menu into a separate toolbar. To do so, go to<em> View | Appearance | Main menu as a Separate Toolbar.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><em>Light theme<\/em> <em>with Light Header<\/em> in the new UI<\/h3>\n\n\n\n<p>We are introducing an alternate <em>Light with Light Header<\/em> theme, which features matching light colors for window headers, tooltips, and notification balloons.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/Va56W8gWK2XpzVoqLSxEnMiBzEZUQxGbEQ9LeslSfz2iR553LCKDO7uCh_Cd6LCZYRl3L0WJAi2xSIg7U-czrad_MNOC5UW-tlzF_0AAv-m0bkor2beu2CpsvlzzmP3s1yJvl5yaK8U18vm9gElfoxc.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Pin run configurations<\/h3>\n\n\n\n<p>To add a run configuration to the <em>Pinned<\/em> section, open the kebab menu (three dots) next to its name and select <em>Pin<\/em>. You can easily rearrange multiple pinned configurations by dragging and dropping them as needed.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"810\" height=\"250\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/pin_run_configuration.gif\" alt=\"\" class=\"wp-image-364714\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Sort files by modification time in the Project view&nbsp;<\/h3>\n\n\n\n<p>You can now arrange your files in the <em>Project<\/em> view based on their modification time. To enable this feature, open the kebab menu (three dots) in the <em>Project <\/em>view and select<em> Tree Appearance | Sort by Modification Time<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"810\" height=\"320\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/sort_files_in_project_view.gif\" alt=\"\" class=\"wp-image-364725\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">New tool for generating shared indexes<\/h3>\n\n\n\n<p>PhpStorm 2023.2 features a new command line tool for quickly building and uploading <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/shared-indexes.html\" target=\"_blank\" rel=\"noopener\">shared indexes<\/a>, helping you eliminate time wasted on locally indexing large projects within your individual teams.&nbsp;<\/p>\n\n\n\n<p>The new tool simplifies the process of generating shared indexes, requiring just a few clicks instead of multiple scripts and services. <a href=\"https:\/\/blog.jetbrains.com\/ja\/idea\/2023\/05\/intellij-idea-2023-2-eap#Newtoolforeasilygeneratingsharedindexes\">Learn more<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/aD6fTcrjC-Bm3jzITyXOJwHNCEaC_lbik3IGkaxq7RDrRO3VXk5npeLY6nnnXZpnr-Lr1oOgTE65m2ml_FUslZn6LIsCnSEhyVVKuV5FtA4qwbDdbOLspwAQQtAe29Jy8nJ4-kcd76nTJSOBQgNCNqI.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/EaIY1duv1VY3Bq3TTtOLpUdH74Onwjfmp760XwibS_lU955vY_Yb9Onb2ja_d-d7ILafbOhmSkRtXaRhK1OjwiMloeBRcvneFjD_W5VHOgflAev1lTqb_lVkovGOm77bjf6xieb_4LebNmDuXJFYLm4.png\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">HTTP Client improvements<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Redoc UI previews for OpenAPI and Swagger files<\/h3>\n\n\n\n<p>You can now switch between Redoc and Swagger UI to preview your OpenAPI documentation.<\/p>\n\n\n\n<p>With the Redoc integration, you can access the <em>Try it<\/em> console right from within PhpStorm and use it to set parameters and send requests to your API.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/DddGBGAWEKVqhRzflVCo5janKWftV-50DubAlhfcWymprY4rC17F1K4PuEtoKuqOYQcHm7gY0phb5_1pPo0oL9o7nFV0GXZRoysVYgV_o9cqu1gIf7gLbMya6VRpIRZGgqUteSAkY1o9AuHl078uc1o.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Support for GraphQL and WebSocket in the HTTP Client CLI<\/h3>\n\n\n\n<p>You can run .http files as requests with a special HTTP Client CLI&nbsp; .<\/p>\n\n\n\n<p>Starting with this release, the tool is now capable of interacting with GraphQL APIs and establishing WebSocket connections with services.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/8ebOSMnZdfgc_WyPLXdWQFaK15KKNJNHWysmLQMF5tZcbSDhwwwYQAHAuobrnMA21ukt_VFG8szwFdWex04FlHFdyAdhDAvhRFDzgk2jL3LP7gdPK5pxqJIrMBFzFhKM2Uh1sYbmqpAkwoK8IoMnU14.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/QN23ii6VtW09-Nqr-_RMtv2b3nVodrR9mdOpsTsZvEaD_hnojaVQsIs1AOrOOEYccfcvXS3a3E4pAYthXmi_MvALggXzqE2zr3FCB7rcDNhMB-O87wZjWQrlm1AWvnlB17sHP4zgIkdiDUZ3sTLySDw.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Support for JavaScript imports in the HTTP Client<\/h3>\n\n\n\n<p>It is now possible to share common JavaScript code for HTTP Client request handlers via imported modules.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/hnU_bxOP94wQJw3L7tqbT7XEp3Wy_LEZtk5cmoKd3Un_GuRVr54tx7K4kp_VRhg_4w-GRnPi4z1fdYr32dOTxlyRNN9SuT2h-c0uBGXzWvjXZdhzZ6NQJxKAynn_ZIOk9JukmaclbQ_gpwqPdRRBpow.gif\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">VCS \/ Git \/ GitLab<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">GitLab <em>Merge Requests<\/em> support<\/h3>\n\n\n\n<p>PhpStorm 2023.2 introduces initial integration with GitLab, allowing you to work with <em>Merge Requests<\/em> right from the IDE.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1620\" height=\"810\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/gitlab_mr.png\" alt=\"\" class=\"wp-image-360320\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Commit changes line by line<\/h3>\n\n\n\n<p>PhpStorm introduces a new level of commit granularity by letting you selectively commit only specific lines of changes in code chunks.<\/p>\n\n\n\n<p>Open the file diff, select the lines within the edited chunk, and call <em>Include these lines into commit<\/em> from the context menu. You\u2019ll see checkboxes for each line, which you can select or leave unselected.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1920\" height=\"1080\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/commit_line-by-line.gif\" alt=\"\" class=\"wp-image-378541\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">LSP support for plugin developers<\/h2>\n\n\n\n<p>Some languages and technologies may not (yet) be natively supported in PhpStorm, but there may be a language server that could provide support for them. This is why we\u2019ve made it possible for plugin developers to use the LSP API and integrate a certain LSP server.<\/p>\n\n\n\n<p><em>If you\u2019ve made your own programming language or framework, you can get it supported in the IDE by writing an LSP server and a plugin.<\/em><\/p>\n\n\n\n<p>Currently the LSP support includes error and warning highlighting, quick-fixes, code completion, and navigation to declarations. Learn more about the LSP support in JetBrains IDEs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bundled JetBrains Qodana<\/h2>\n\n\n\n<p>PhpStorm 2023.2 integrates the code quality platform <a href=\"https:\/\/jb.gg\/qodana_release_php\" target=\"_blank\" rel=\"noopener\">Qodana<\/a> \u2013 our smart static analysis engine designed to fit any CI\/CD pipeline.<\/p>\n\n\n\n<p>You can trigger the analysis with just a few clicks, view the list of problems across your entire project, and then configure Qodana in your preferred CI\/CD system to establish the quality gates and run server-side checks.<\/p>\n\n\n\n<p>Also, once Qodana is configured on your CI\/CD, you will be able to see the results of the server-side analysis without leaving your IDE \u2013 right out of the box.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1616\" height=\"894\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/qodana-1620-910.png\" alt=\"\" class=\"wp-image-378552\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Web development<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Improved error formatting in JavaScript and TypeScript<\/h3>\n\n\n\n<p>JavaScript and TypeScript errors and warnings will now be formatted in a more readable way, making it easier to spot problems in your code.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/b0hi6_gz3GON-z-Mj8YBOjCd7d8k9t-Fi-vq-i0zFUN8VcUMOYOjAWcPJH7wYhyUa0eqS2d9D1bRsFwIwDsqGmkpS1EufhOXCYKc4Bo_rZibzKQGbHYHzXjwb172DPdZGmOsxVlRxXlvTY-_ZOeJuoE.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">CSS nesting support<\/h3>\n\n\n\n<p>We\u2019ve implemented syntax support and an inspection that alerts you if a <a href=\"https:\/\/www.w3.org\/TR\/css-nesting-1\/\" target=\"_blank\" rel=\"noopener\">CSS nested<\/a> selector starts with an identifier or functional notation.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/5k-kq1xG82xWboVjEvF89pDs-gQfQnWGqrFyYr11FFHUPbVNre6KgZkNTa2PJPxjJyCJnFMNYAYhzXZNlvY6BMildm0OSQW31Ahgs7euU7U11OktUlLbcj0o5g0b_Q9SXSDrsKNKmUL6EhPcICqkIXg.png\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Vue Language Server support<\/h3>\n\n\n\n<p>Support for Vue Language Server (VLS), a.k.a. Volar, provides more accurate error detection and better type information in the quick navigation and documentation popups. By default, VLS will be used for TypeScript v5.0 and higher. You can set the Vue service to use VLS integration on all TypeScript versions under <em>Settings | Languages &amp; Frameworks | TypeScript | Vue<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/CBFPuZ-IT2gBnVJsb9oG3yWmpL6HyHp1Rs7bkg8yH9Efszf4KeosRCeM0EVzVVu80q30-sJPtt8cp5AIgQZ-ockZlP84NjSSEHB4dk3B20l52xLtXCw_S3LZm95f2ay4mSlBZFtWr3_RiZ2oH7FFAB4.png\" alt=\"\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>The full list of changes in PhpStorm 2023.2 is available on the <a href=\"https:\/\/youtrack.jetbrains.com\/articles\/WI-A-231736071\/PhpStorm-2023.2-232.8660.205-build-Release-Notes\" target=\"_blank\" rel=\"noopener\">release notes<\/a> page.<\/p>\n\n\n\n<p>That\u2019s all for today. Thanks for keeping up with the changes!<br><\/p>\n\n\n\n<p>We hope they improve your PhpStorm experience.<\/p>\n\n\n\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/phpstorm\/download\" target=\"_blank\" rel=\"noopener\">Download PhpStorm<\/a>.<\/li>\n\n\n\n<li><a href=\"https:\/\/twitter.com\/phpstorm\" target=\"_blank\" rel=\"noopener\">Tweet @ us<\/a>!<\/li>\n\n\n\n<li>Report bugs to our <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/WI\" target=\"_blank\" rel=\"noopener\">issue tracker<\/a>.<\/li>\n<\/ul>\n","protected":false},"author":869,"featured_media":378421,"comment_status":"closed","ping_status":"closed","template":"","categories":[907],"tags":[8112,91,477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/phpstorm\/378374"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/users\/869"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/comments?post=378374"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/phpstorm\/378374\/revisions"}],"predecessor-version":[{"id":624047,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/phpstorm\/378374\/revisions\/624047"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/media\/378421"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/media?parent=378374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/categories?post=378374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/tags?post=378374"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/cross-post-tag?post=378374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}