PHP - BlogFlockAll things PHP2026-06-23T07:55:58.330ZBlogFlockPhpStorm : The IDE that empowers PHP developers | The JetBrains Blog, Exakat, Rob Allen, Blog entries :: mwop.netYour JetBrains IDE Expertise, Now on LinkedIn - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=blog&p=7114592026-06-17T13:11:02.000Z<p>Every developer has tools they rely on daily. The workflows they’ve built around them, the ways they’ve learned to move faster, debug smarter, and write better code – that kind of hands-on experience can be hard to put into words.</p>
<p>We’re collaborating with LinkedIn to make it easier for you to showcase your expertise with JetBrains IDEs on the world’s largest professional network. You can now connect your IDE to LinkedIn and let your real tool usage speak for itself.</p>
<p align="center"><a class="jb-download-button" href="https://plugins.jetbrains.com/plugin/32011-linkedin-connected-apps" target="_blank" rel="noopener" data-test="blog-article-cta"><i class="download-icon"></i>Connect your IDE</a></p>
<p>IntelliJ IDEA, PyCharm, WebStorm, PhpStorm, Rider, GoLand, CLion, RustRover, and RubyMine are already supported via a free plugin, while support for DataGrip is coming soon.</p>
<p>In this blog post, we’ll explain what LinkedIn connected apps are, what they mean for your profile, and how to get started.</p>
<h2 class="wp-block-heading">What this is about</h2>
<p>Building on early <a href="https://www.linkedin.com/pulse/title-newways-stand-out-verify-skills-unlock-new-hari-srinivasan-zhtvc/" target="_blank" rel="noopener">collaboration</a> with Descript, Duolingo, Lovable, Relay.app, and Replit, LinkedIn is expanding the range of apps you can feature on your LinkedIn profile, turning real-world product usage into a credible, visible signal of practical tool experience. We’re glad to join forces with them to bring this to JetBrains IDE users.</p>
<blockquote class="wp-block-quote">
<p></p>
<cite>“We’re building new ways for members to show real, credible proof of what they’re capable of, right on their LinkedIn profile. And for the brands behind these tools, there’s no better endorsement than a customer who’s actively using and loving your product.”<br>– Dan Shapero, CEO of LinkedIn</cite></blockquote>
<p>Connected apps let you link the tools you use in your daily work directly to your LinkedIn profile, where they appear prominently, helping you stand out to your professional network. Once connected, each app generates a simple statement based on how you actually use it. Unlike manually added skills, this is based on real usage and updates automatically as your experience evolves.</p>
<figure class="wp-block-image size-full is-style-default"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" fetchpriority="high" src="https://blog.jetbrains.com/wp-content/uploads/2026/06/In-LinkedIn-4.png" alt="" class="wp-image-713887"/></figure>
<h2 class="wp-block-heading">How to get started</h2>
<p>Open your JetBrains IDE, go to <em>Settings | Plugins</em>, search for the <em>LinkedIn Connected Apps</em> plugin under the <em>Marketplace</em> tab, and install it. </p>
<p>Once installed, the plugin starts collecting data locally about how you use your IDE. Depending on your usage history, you may receive an initial statement right away, which will then be updated once the plugin has collected enough data to better reflect your real IDE expertise.</p>
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/06/LinkedIn-integration-in-JetBrains-IDEs-example-1.png" alt="LinkedIn-integration-in-JetBrains-IDEs-example " class="wp-image-713131"/></figure>
<p><strong>Your IDE usage data stays on your machine</strong>. When you are ready, you can connect your LinkedIn account and share your IDE expertise badge there. If you keep the plugin installed, your badge will update automatically as your IDE usage evolves.</p>
<p>The plugin is free for all JetBrains IDE users.</p>
<h2 class="wp-block-heading">What’s included in this release</h2>
<p>This is the first version of the integration, delivered as a standalone plugin rather than being built directly into the IDE. It covers IntelliJ IDEA, PyCharm, WebStorm, GoLand, PhpStorm, Rider, CLion, RustRover, and RubyMine; DataGrip is not yet supported. </p>
<p>Usage is detected within the IDE itself, so if you use AI features via an external tool or terminal, those won’t be reflected yet.</p>
<h2 class="wp-block-heading">How your IDE expertise is determined</h2>
<p>The model is intentionally simple for now. It is designed to represent your practical use of JetBrains tools, <em>not </em>to rank developers or certify skill levels. Our goal was to provide a solid starting point, but we know there’s more to capture about how developers work with their IDEs.</p>
<p>Statements map to different levels of experience and are generated based on how you interact with your IDE – from writing and editing code using basic features to working with debugging tools, version control, and AI-assisted workflows. For more information, see <a href="https://www.jetbrains.com/help/idea/linkedin-connected-apps.html" target="_blank" rel="noopener">our documentation</a>.</p>
<h2 class="wp-block-heading">What’s coming next</h2>
<p>We’re already working on the next version, planned for later this year. We’ll focus on improving how IDE usage, including AI feature usage, is represented, expanding support to DataGrip, and making the overall experience feel more integrated.</p>
<h2 class="wp-block-heading">FAQ</h2>
<h3 class="wp-block-heading">Which JetBrains IDEs are supported?</h3>
<p>IntelliJ IDEA, PyCharm, WebStorm, GoLand, PhpStorm, Rider, CLion, RustRover, and RubyMine. Support for DataGrip is coming soon.</p>
<h3 class="wp-block-heading">Why isn’t DataGrip supported yet?</h3>
<p>DataGrip is designed for working with databases and includes workflows that differ from our other IDEs. We plan to support it soon.</p>
<h3 class="wp-block-heading">Can I connect multiple IDEs?</h3>
<p>Yes, if you use multiple supported JetBrains IDEs, you can connect each of them. You’ll get a badge for all connected IDEs.</p>
<p><strong>Note</strong>: If you use multiple JetBrains accounts across different IDE instances but link them all to the same LinkedIn profile, IDE usage statements from each account will be displayed on that LinkedIn profile.</p>
<h3 class="wp-block-heading">Do I need to keep the plugin installed after connecting? </h3>
<p>You can share your IDE usage statement once and then remove the plugin, but note that it must remain installed if you want to track your ongoing progress and have any changes reflected on LinkedIn.</p>
<h3 class="wp-block-heading">Is this feature free?</h3>
<p>Yes, it’s available to all JetBrains IDE users at no cost.</p>
<h3 class="wp-block-heading">Is this a certification?</h3>
<p>Connected apps reflect real IDE usage and are designed to showcase applied experience, not to act as a formal certification or skill ranking. Certifications, degrees, and licenses remain important markers of professional achievement. Connected apps on LinkedIn add a different kind of signal: partner-validated tool usage that reflects practical work and can update over time.</p>
<h3 class="wp-block-heading">What data is shared with LinkedIn and JetBrains?</h3>
<p>Only the information required to represent your connected account and IDE usage statement. </p>
<h3 class="wp-block-heading">Will this help me get hired?</h3>
<p>Having connected apps on your LinkedIn profile is extra proof of your practical experience with leading tools. While connected apps make your expertise visible, they are just one part of your profile. Think of it as a way to let your tooling speak for itself.</p>
<p>Give it a try and let us know what you think in the comments below. We’re continuing to develop this integration, and your feedback will help shape what comes next.</p>Contribute to the State of PHP Survey - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=phpstorm&p=7101042026-06-11T10:38:57.000Z<p>Together with <a href="https://thephp.foundation/" target="_blank" rel="noopener">The PHP Foundation</a>, we’re embarking on an exciting expedition – the first annual State of PHP census that aims to tally the elePHPant population across the world. Come join us!</p>
<div class="buttons">
<div class="buttons__row">
<a href="https://surveys.jetbrains.com/s3/b-state-of-php-2026" class="btn" target="_blank" rel="noopener">Take the survey</a>
</div>
</div>
<p>With the <a href="https://thephp.foundation/blog/2026/04/22/announcing-plans-for-a-php-ecosystem-survey/" target="_blank" rel="noopener">help of the community</a>, we’ve designed a comprehensive survey that aims to unearth the PHP developer trends – from years of experience and favorite frameworks to AI preferences and beyond. Our goal is to draw the most representative picture of the PHP ecosystem and the developers behind it, and share insights that will benefit the community and help shape the future direction of PHP.</p>
<figure class="wp-block-image size-full"><a href="https://surveys.jetbrains.com/s3/b-state-of-php-2026" target="_blank" rel="noopener"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" fetchpriority="high" src="https://blog.jetbrains.com/wp-content/uploads/2026/06/Directus-1200x200-2x.png" alt="" class="wp-image-711709"/></a></figure>
<p>For this to be a success, we need your help. Our survey will only be truly representative if PHP developers of all backgrounds participate, regardless of where you live, how long you’ve been developing in PHP, what frameworks you prefer, or the tools you use. So take part in the State of PHP survey now and help us map the herd!</p>
<p>Survey participants can enter a drawing to win one of five EUR 500 (or equivalent in local currency) vouchers, which they can redeem for any prize they want via Tremendous (subject to <a href="https://surveygizmolibrary.s3.amazonaws.com/library/321629/TermsandConditionsoftheStateofthePHPSurveyContest_20260529.pdf" target="_blank" rel="noopener">the applicable terms and conditions</a>).</p>
<h2 class="wp-block-heading">State of PHP report</h2>
<p>You can expect to read the travel logs from this journey in October 2026. We will publish the aggregated results in the State of PHP 2026 report, so be sure to follow <a href="https://x.com/ThePHPF" target="_blank">The PHP Foundation</a> and <a href="https://x.com/phpstorm" target="_blank">PhpStorm</a> on X or sign up for our newsletter below to be among the first to see the results.</p>
<p>Thank you for being part of the first edition of the State of PHP!</p>
<p>The PHP Foundation and PhpStorm teams</p>Fixing two minor git irritations in my OSS fork workflow - Rob Allenhttps://akrabat.com/?p=75662026-05-26T10:00:00.000Z<p>For OSS work, I work with two git remotes:</p>
<ul>
<li><tt>upstream</tt>: the canonical OSS project repository, where <tt>main</tt> is the default branch and is what gets released.</li>
<li><tt>origin</tt>: a personal fork. All my feature branches live here.</li>
</ul>
<p>I set up locally like this:</p>
<ol>
<li>Fork the project repo to my account.</li>
<li>Clone my fork locally, so the <tt>origin</tt> remote is my fork.</li>
<li>Set an <tt>upstream</tt> remote using <tt>git remote add upstream <ssh-url></tt>.</li>
</ol>
<p>and then when working on something, I tend to do these steps:</p>
<ol>
<li>Switch to the main branch with <tt>git switch main</tt>.</li>
<li><tt>git pull</tt> from <tt>upstream</tt> to pick up the latest code.</li>
<li>Create a new feature branch from <tt>main</tt> using <tt>git switch -c <branch></tt>.</li>
<li>Do work, then commit and push the feature branch to <tt>origin</tt>.</li>
<li>Open a PR from <tt>origin/<branch></tt> against <tt>upstream/main</tt> (usually using <tt>gh</tt>).</li>
<li>Once merged upstream, pull from <tt>upstream</tt> back into my local <tt>main</tt> branch and delete my feature branch.</li>
</ol>
<h2>The problems</h2>
<p>I have a couple of little irritations with this workflow that I finally sat down to solve.</p>
<ul>
<li>Firstly, when I <tt>git pull</tt> on main, it pulls from <tt>origin</tt> by default unless I remember to use <tt>git pull upstream main</tt>. If I don't catch it, I don't have the latest code when I branch for my new work.</li>
<li>Secondly, when I push my new branch, I get an error message <em>fatal: The current branch foo has no upstream branch</em> which is just irritating as I then sigh and re-run the <tt>push</tt> with <tt>-u origin</tt>.</li>
</ul>
<h2>The solutions</h2>
<p>To remove these minor irritations, I discovered that I can run these useful git commands:</p>
<p>Firstly, set <tt>main</tt> to track <tt>upstream/main</tt>:</p>
<pre lang="bash">
git branch --set-upstream-to upstream/main main
</pre>
<p>Usually I set which repo's branch to track using <tt>git push -u</tt>, but that doesn't make sense for the <tt>main</tt> branch as I never push it to the upstream repo. Using <tt>--set-upstream-to</tt> on the <tt>branch</tt> command does the same thing, without a push.</p>
<p>Secondly, to make the first <tt>git push</tt> automatically create the <tt>origin/<branch></tt> and track it:</p>
<pre lang="bash">
git config push.autoSetupRemote true
</pre>
<p>
Now <tt>git pull</tt> on <tt>main</tt> always pulls from upstream, and git push on a new branch just works.</p>Improving Accessibility in JetBrains IDEs: What’s New and What’s Next in 2026 - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=platform&p=7073972026-05-21T06:45:13.000Z<p>Making software accessible often comes down to removing small but repeated points of friction in everyday workflows. Today, on <a href="https://accessibility.day/" target="_blank" rel="noopener">Global Accessibility Awareness Day</a>, we’re sharing recent improvements in JetBrains IDEs across several areas: compatibility with assistive technologies on various platforms, keyboard navigation, and non-visual feedback. Some of these improvements are already available, and some are coming later this year.</p>
<p><em>You can use the audio player below to listen to this blog post.</em></p>
<audio class="article-audio" preload="metadata" style="width: 100%;" controls>
<source type="audio/mp4" src="https://blog.jetbrains.com/wp-content/uploads/2026/05/Accessibility-Blog-Post-Audio.mp4">
<a href="https://blog.jetbrains.com/wp-content/uploads/2026/05/Accessibility-Blog-Post-Audio.mp4">
Accessibility Blog Post Audio </a>
</audio>
<h2 class="wp-block-heading">Better compatibility with assistive technologies</h2>
<p>One of the key areas we’ve been working on is improving how JetBrains IDEs interact with OS-level accessibility tools.</p>
<h3 class="wp-block-heading">Improved Magnifier support on Windows</h3>
<p>Screen magnifiers are among the most commonly used assistive technologies in JetBrains IDEs. Until recently, the built-in Windows Magnifier didn’t reliably follow the text cursor in the editor, making navigation and editing more difficult for low-vision users. We’ve implemented support for cursor tracking so Magnifier follows text as you type, just as it does in other applications.</p>
<figure class="wp-block-video" alt="Video demonstrating how Windows Magnifier follows the text caret while typing in a code editor"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/05/MAgnifier_output.mp4"></video></figure>
<p>This builds on earlier work on macOS, where we addressed text cursor tracking with macOS Zoom. Now, the same support is being extended to Windows.</p>
<h3 class="wp-block-heading">Orca and GNOME Magnifier support on Linux</h3>
<p>With version 2026.2, coming this summer, JetBrains IDEs will allow you to use the Orca screen reader and GNOME Magnifier in <a href="https://www.jetbrains.com/help/idea/2026.1/installation-guide.html#operating-systems" target="_blank" rel="noopener">supported Linux environments</a>. </p>
<p>This is an active area of work, with multiple related tasks already underway. Accessibility shouldn’t depend on your operating system, and we’re continuing to improve support across platforms.</p>
<h2 class="wp-block-heading">More predictable keyboard navigation</h2>
<p>We’ve also been making it easier to move through the IDE without relying on a mouse.</p>
<h3 class="wp-block-heading">Main menu access with <em>Alt </em>on Windows</h3>
<p>In native Windows applications, pressing <em>Alt</em> moves the focus to the main menu, allowing you to navigate it with the keyboard. This behavior was previously missing from JetBrains IDEs, and screen readers, such as NVDA, would sometimes announce the system menu instead.</p>
<p>Now, the main menu behaves in a way that feels familiar and predictable for keyboard-only and screen-reader users, and the bright focus indicator helps low-vision users identify the selected item. </p>
<figure class="wp-block-video" alt="Video demonstrating how the IDE main menu receives focus and is highlighted with a blue frame when pressing the Alt key"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/05/AltF_output.mp4"></video></figure>
<h3 class="wp-block-heading">Navigating between major parts of the IDE</h3>
<p>Another focus area is the experience of moving between different parts of the IDE interface, such as toolbars, panels, and the editor. We’re working on a more structured model for navigating through the big component groups:</p>
<ul>
<li><em>Tab</em> and <em>Shift+Tab</em> move the focus within the current area.</li>
<li>A dedicated shortcut lets you jump between larger sections of the IDE.</li>
</ul>
<p>This reduces the effort required to reach essential controls and makes the overall layout easier to navigate. For the current iteration, we made it possible to bring the main toolbar and status bar into focus, and we fixed the <em>Project</em><strong> </strong>and <em>Git</em> toolbar widgets, which were not selectable by screen readers, even though other elements already were. </p>
<figure class="wp-block-video" alt="Video demonstrating how the IDE main toolbar receives focus and is highlighted with a blue frame when the Alt+PgUp shortcut is pressed"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/05/AltPgUp_output.mp4"></video></figure>
<p>As the next step, we’ll polish specific controls and include tool window bars on both sides of the IDE frame in the navigation flow.</p>
<h2 class="wp-block-heading">Exploring richer non-visual feedback with audio cues</h2>
<p>Accessibility is not only about reaching controls, but also about understanding what’s happening while you work. We’re exploring ways to provide richer audio feedback in the IDE. Two directions we’re currently investigating:</p>
<ul>
<li>Contextual signals when the caret lands on lines with errors, warnings, breakpoints, or version control changes. We want the IDE to provide immediate, non-visual feedback in context.</li>
<li>More general audio notifications for IDE actions and state changes.</li>
</ul>
<p>The goal is to reduce the need to rely on visual indicators or switch contexts just to understand what changed. Instead, we want the IDE to provide that information more directly.</p>
<h2 class="wp-block-heading">Accessibility as an ongoing effort</h2>
<p>We’re improving accessibility in JetBrains IDEs across multiple areas at once, including by providing compatibility with assistive technologies like screen readers and magnifiers, as well as by offering more consistent keyboard navigation and clearer feedback for events that are otherwise mostly visual.</p>
<p>These improvements build on earlier updates, such as support for VoiceOver and NVDA, a high-contrast UI theme, and color schemes for red-green vision deficiency. There’s still more to do, and we’ll continue working in this direction.</p>
<h2 class="wp-block-heading">We’d love to hear from you</h2>
<p>We’re eager to hear from developers who rely on accessibility features, as well as from anyone interested in improving the experience of using them.</p>
<p>If you have ideas or feedback about accessibility in JetBrains IDEs, you can reach us directly at <strong>accessibility@jetbrains.com</strong>. You can also report issues through <a href="https://youtrack.jetbrains.com/newIssue?project=IJPL" target="_blank" rel="noopener">YouTrack</a> or the <a href="https://www.jetbrains.com/support/" target="_blank" rel="noopener">support request form</a>.</p>
<p>If you’d like to stay informed about accessibility improvements, you can subscribe to updates <a href="https://lp.jetbrains.com/ij-accessibility/" target="_blank" rel="noopener">here</a>.</p>PhpStorm 2026.2 Early Access Program Has Started - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=phpstorm&p=7067542026-05-12T13:36:37.000Z<p>The Early Access Program (EAP) for the next major PhpStorm 2026.2 release is now open!</p>
<p>PhpStorm’s <a href="https://www.jetbrains.com/resources/eap/" data-type="link" data-id="https://www.jetbrains.com/resources/eap/" target="_blank" rel="noopener">EAP builds</a> are a great opportunity to try upcoming features for free in your real workflows and share feedback with the PhpStorm team. Your input directly influences what makes it into the final release. </p>
<p>This release, our main areas of focus are:</p>
<ul>
<li>Native mode for remote development scenarios, as we aim to significantly improve interaction with the projects located on WSL 2 and in Dev Containers.</li>
<li>Ongoing enhancements in PhpStorm’s understanding of PHPDoc-based generics.</li>
<li>Overall performance and stability improvements, including reduced startup time, indexing time, and freezes. </li>
</ul>
<div class="buttons">
<div class="buttons__row">
<a href="https://www.jetbrains.com/phpstorm/nextversion/" class="btn" target="_blank" rel="noopener">Download PhpStorm 2026.2 EAP</a>
</div>
</div>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<h2 class="wp-block-heading">Getting started with the EAP</h2>
<p>If you’re not familiar with how our Early Access Program (EAP) works, here’s a quick overview:</p>
<ol>
<li>We release new EAP builds weekly, giving you a sneak peek at upcoming features.</li>
<li>EAP builds are completely free to use and do not require a license.</li>
<li>You can install the EAP version alongside your stable PhpStorm installation, so there’s no need to uninstall your current version.</li>
<li>The most convenient way to access EAP builds and keep both your stable and EAP versions up-to-date is by using <a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noopener">our Toolbox App</a>.</li>
<li>Alternatively, you can download EAP builds from the <a href="https://www.jetbrains.com/phpstorm/nextversion/" target="_blank" rel="noopener">EAP page</a> or set up your IDE to automatically receive updates by selecting <em>Check IDE Updates for the Early Access Program</em> under <em>Settings/Preferences | Appearance & Behavior | System Settings | Updates</em>.</li>
</ol>Determining if a reboot is required on Linux - Blog entries :: mwop.nethttps://mwop.net/blog/2026-05-04-reboot-required.html2026-05-04T13:35:08.000Z<p>I've been using the construct <code>sudo run-parts /etc/update-motd.d/</code> to determine if recent system updates required a reboot.</p>
<p>Today I learned I can simply check for the existence of the file <code>/var/run/reboot-required</code>.</p>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-05-04-reboot-required.html">Determining if a reboot is required on Linux</a> was originally
published <time class="dt-published" datetime="2026-05-04T08:35:08-05:00">4 May 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
Join Us for PHPverse 2026 on June 9 - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=phpstorm&p=7044302026-04-30T15:10:32.000Z
<p>JetBrains PHPverse – a community-inspired professional event for PHP developers – returns once more on June 9, 2026. This year, we’re gathering some of the most influential voices in the PHP ecosystem to share their insights on shaping the modern PHP language, the internals of ecosystem tools and frameworks, and the adoption of agentic workflows for shipping PHP code.</p>
<div class="buttons">
<div class="buttons__row">
<a href="https://lp.jetbrains.com/phpverse-2026/#register-for-phpverse-2026" class="btn" target="_blank" rel="noopener">Register now</a>
</div>
</div>
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" fetchpriority="high" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/Featured-blog-1.png" alt="" class="wp-image-704458"/></figure>
<h1 class="wp-block-heading">About PHPverse 2026</h1>
<p>Expect a one-day event of curated talks, live Q&As with the speakers, several special announcements, and even a few surprises (after all, it’s PHP’s 31st birthday).</p>
<p><strong>When: </strong>11:00 am – 3:50 pm UTC on June 9, 2026.</p>
<p><strong>Where:</strong> Streamed live on the <a href="https://youtube.com/live/NR9L0zwXJq4" target="_blank" rel="noopener">PHP Annotated YouTube channel</a>.</p>
<p><strong>Hosted by:</strong> <strong>Brent Roose</strong>, JetBrains Developer Advocate for PhpStorm and creator of the <a href="https://www.youtube.com/@phpannotated" target="_blank" rel="noopener">PHP Annotated</a> YouTube channel, and <a href="https://nunomaduro.com/" target="_blank" rel="noopener"><strong>Nuno Maduro</strong></a>, creator of <a href="https://pestphp.com/" target="_blank" rel="noopener">Pest</a>, <a href="https://github.com/larastan/larastan" target="_blank" rel="noopener">Larastan</a>, and <a href="https://github.com/laravel/pint" target="_blank" rel="noopener">Laravel Pint</a>, and staff software engineer at <a href="https://laravel.com/" target="_blank" rel="noopener">Laravel</a>.</p>
<h1 class="wp-block-heading">This year’s lineup</h1>
<ul>
<li><em>PHP Foundation Keynote</em> by <a href="https://github.com/ElizabethN" data-type="link" data-id="https://www.linkedin.com/in/elizabethn/" target="_blank" rel="noopener">Elizabeth Barron</a>, Executive Director at the PHP Foundation.</li>
<li><em>My AI Writes Perfect* PHP</em> by <a href="https://x.com/ashleyhindle" data-type="link" data-id="https://x.com/ashleyhindle" target="_blank">Ashley Hindle</a>, Founder of Fuel and creator of Laravel Boost.</li>
<li><em>WordPress Is Dead, Long Live WordPress!</em> by <a href="https://x.com/jon_bossenger" data-type="link" data-id="https://x.com/jon_bossenger" target="_blank">Jonathan Bossenger</a>, Developer Advocate at Automattic.</li>
<li><em>Packagist Internals</em> by <a href="https://x.com/naderman" data-type="link" data-id="https://x.com/naderman" target="_blank">Nils Adermann</a>, Co-Founder at Packagist.</li>
<li><em>Running a Large Open-Source Project Like Symfony</em> by <a href="https://x.com/fabpot" data-type="link" data-id="https://x.com/fabpot" target="_blank">Fabien Potencier</a>, Founder and Project Lead at Symfony.</li>
<li><em>PHP RFCs</em> by <a href="https://github.com/crell" data-type="link" data-id="https://github.com/crell" target="_blank" rel="noopener">Larry Garfield</a>, Functional Programming Enthusiast.</li>
<li><em>How AI Is Changing the Programmer World</em> by <a href="https://x.com/jeffrey_way" data-type="link" data-id="https://x.com/jeffrey_way" target="_blank">Jeffrey Way</a>, Founder at Laracasts.</li>
</ul>
<p></p>
<p>For more information about the speakers and their talks, see the <a href="https://lp.jetbrains.com/phpverse-2026/#program" target="_blank" rel="noopener">PHPverse 2026 page</a>.</p>
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/00_Main_PHP_Verse_20260.png" alt="" class="wp-image-704434"/></figure>
<h1 class="wp-block-heading">PHPverse 2025 recap</h1>
<p>PHPverse took off last year as a celebration of PHP’s 30th anniversary, with over 15,000 viewers worldwide tuning in to the livestream. The event outreach and feedback showed how big and vibrant the PHP community is and why we should keep gathering every year to connect and learn from the people behind the major frameworks and tools.</p>
<p>You can catch up with recordings of last year’s talks: </p>
<ul>
<li><a href="https://www.youtube.com/watch?v=k-UwH91XnAo" target="_blank" rel="noopener"><em>FrankenPHP: The Future of PHP?</em></a> by <a href="https://x.com/dunglas" target="_blank">Kévin Dunglas</a></li>
<li><a href="https://youtu.be/7IVDUnvvhmc?si=b4B7g00WZwdbhqEl" target="_blank" rel="noopener"><em>20 Years of Symfony</em></a> by <a href="https://x.com/nicolasgrekas" target="_blank">Nicolas Grekas</a></li>
<li><a href="https://youtu.be/T22_rXew72M?si=me2oD0gFpUpBKTGY" target="_blank" rel="noopener"><em>MCP in PHP</em></a> by <a href="https://x.com/marcelpociot" target="_blank">Marcel Pociot</a></li>
<li><a href="https://youtu.be/lwf7nAuZQHY?si=Zdk-6BXBS0N_0Luh" target="_blank" rel="noopener"><em>Q&A With Taylor Otwell</em></a></li>
<li><a href="https://youtu.be/zxTMzygBt7s?si=3w5hMZC9irsei07B" target="_blank" rel="noopener"><em>Growing PHP for the Future</em></a> by <a href="https://x.com/pronskiy" target="_blank">Roman Pronsky</a> and <a href="https://gpb.moe/" target="_blank" rel="noopener">Gina Banyard</a></li>
<li><a href="https://youtu.be/Jraf2E2QPBI?si=qPj1DoLKRdXT5Mdk" target="_blank" rel="noopener"><em>The Future of PHP Education</em></a> by <a href="https://x.com/jeffrey_way" target="_blank" rel="noreferrer noopener">Jeffrey Way</a>, <a href="https://twitter.com/PovilasKorop" target="_blank" rel="noreferrer noopener">Povilas Korop</a>, and <a href="https://x.com/zenstruck" target="_blank" rel="noreferrer noopener">Kevin Bond</a></li>
</ul>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I gotta say <a href="https://twitter.com/hashtag/PHPverse?src=hash&ref_src=twsrc%5Etfw" target="_blank" rel="noopener">#PHPverse</a> was awesome today! Well done to everyone who spoke for building so many awesome things! <a href="https://t.co/lJttpMlxvG" target="_blank">pic.twitter.com/lJttpMlxvG</a></p>— Liam Hammett (@LiamHammett) <a href="https://twitter.com/LiamHammett/status/1935008846495232367?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">June 17, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PHPverse?src=hash&ref_src=twsrc%5Etfw" target="_blank" rel="noopener">#PHPverse</a> 2025 was such a valuable experience! We got practical advice from dope developers like <a href="https://twitter.com/naderman?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">@naderman</a> (who happened to be co-host), also <a href="https://twitter.com/jeffrey_way?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">@jeffrey_way</a> and <a href="https://twitter.com/PovilasKorop?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">@PovilasKorop</a>.<br><br>My favourite session was: Laravel Q&A With <a href="https://twitter.com/taylorotwell?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">@taylorotwell</a>.<br><br>I feel super inspired to level up 💪<a href="https://twitter.com/hashtag/PHP30?src=hash&ref_src=twsrc%5Etfw" target="_blank" rel="noopener">#PHP30</a> <a href="https://t.co/IT1vAksITr" target="_blank">pic.twitter.com/IT1vAksITr</a></p>— Timothy Samuel (@tsshekwogaza) <a href="https://twitter.com/tsshekwogaza/status/1935065344793788570?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">June 17, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<h1 class="wp-block-heading">Stay tuned </h1>
<p>JetBrains PHPverse 2026 is free, online, and open to everyone. <a href="https://lp.jetbrains.com/phpverse-2026/#register-for-phpverse-2026" target="_blank" rel="noopener">Register now</a>, and we’ll send you a reminder email before the event. You can tune in for the whole day or drop in for the talks that interest you most. </p>
<p>Can’t make it on June 9? Register anyway, and you’ll receive the link with the talk recordings via email after the event.</p>
<p>In the meantime, join the <a href="https://discord.gg/uEUkSNhdd8" target="_blank" rel="noopener">event’s Discord server</a> to receive the latest updates or drop your questions for the speakers – the event hosts will make sure to ask them during the Q&A sessions.</p>
<p>PHPverse grows as its community reach grows. Spread the word among your colleagues, use the #PHPverse hashtag in your social media posts, and help us bring more people into the conversation about the present and future of PHP. </p>
<p>See you at PHPverse!</p>
PHP DateTimeImmutable::createFromFormat Reset Character - Blog entries :: mwop.nethttps://mwop.net/blog/2026-04-16-php-create-from-format-reset.html2026-04-16T15:30:00.000Z<p>I was recently building something that was taking date input from an HTML form field, and casting it to a PHP <code>DateTimeImmutable</code>. I was then comparing that to another date, and got thrown off during testing when I compared the resulting instance to <code>new DateTimeImmutable('today')</code>; the instances were not considered equal.</p>
<p>To recreate the conditions, you can try the following:</p>
<pre><code class="language-php hljs php" data-lang="php">$date = <span class="hljs-string">'2016-06-16'</span>;
$fromForm = DateTimeImmutable::createFromFormat(<span class="hljs-string">'Y-m-d'</span>, $date);
$today = <span class="hljs-keyword">new</span> DateTimeImmutable(<span class="hljs-string">'today'</span>);
<span class="hljs-keyword">echo</span> $fromForm == $today ? <span class="hljs-string">'Equal'</span> : <span class="hljs-string">'Not equal'</span>; <span class="hljs-comment">// outputs "Not equal"</span>
</code></pre>
<p>What's happening? Well, if you were to echo the results of each of <code>$fromForm->format('c')</code> and <code>$today->format('c')</code>, the difference is clear: the <code>$fromForm</code> value includes the <em>time</em> when the instance was created, while <code>$today</code> has the time set to midnight.</p>
<p>So, how do you zero out the time when using <code>createFromFormat()</code>?</p>
<p>It turns out that one of the format characters you can use is the <code>|</code> operator. When you include this at the end of your format string, any fields not included in the format are zero'ed out:</p>
<pre><code class="language-php hljs php" data-lang="php">$fromForm = DateTimeImmutable::createFromFormat(<span class="hljs-string">'Y-m-d|'</span>);
</code></pre>
<hr />
<h4>Reference</h4>
<ul>
<li><a href="https://www.php.net/manual/en/datetimeimmutable.createfromformat.php#datetimeimmutable.createfromformat.parameters">DateTimeImmutable::createFromFormat() Parameters</a></li>
</ul>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-04-16-php-create-from-format-reset.html">PHP DateTimeImmutable::createFromFormat Reset Character</a> was originally
published <time class="dt-published" datetime="2026-04-16T10:30:00-05:00">16 April 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
SQL ENUM Modification - Blog entries :: mwop.nethttps://mwop.net/blog/2026-04-08-sql-enum-modification.html2026-04-08T20:34:00.000Z<p>I'm doing a little DB work recently, and needing to choose how to represent certain data in the database. For a few fields, ENUM would be the correct choice, but there's a possibility I would need to expand the ENUM later to add values.</p>
<p>My question: is this safe?</p>
<p>The short answer, in my research, is "yes", but with caveats.</p>
<p>For Postgres, it's trivial; you can easily add values to ENUM types:</p>
<pre><code class="language-sql hljs sql" data-lang="sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TYPE</span> some_previously_defined_enum <span class="hljs-keyword">ADD</span> <span class="hljs-keyword">VALUE</span> <span class="hljs-string">'new-value'</span>;
</code></pre>
<p>For MySQL, it's a bit more complex. ENUMs are defined within the table schema, and to change them, you use an <code>ALTER TABLE</code> statement:</p>
<pre><code class="language-sql hljs sql" data-lang="sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> some_table
<span class="hljs-keyword">MODIFY</span> some_previously_defined_enum ENUM(<span class="hljs-string">'value-1'</span>,<span class="hljs-string">'value-2'</span>);
</code></pre>
<p>Essentially, you're <em>replacing</em> the definition. This is fine... so long as you don't change the order, or remove any previously defined value in the ENUM. In other words, <em>append</em> to the existing list if you want to safely change it.</p>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-04-08-sql-enum-modification.html">SQL ENUM Modification</a> was originally
published <time class="dt-published" datetime="2026-04-08T15:34:00-05:00">8 April 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
CSS Grid Lanes - Blog entries :: mwop.nethttps://mwop.net/blog/2026-04-07-css-grid-lanes.html2026-04-07T15:38:00.000Z<p>I've been using the experimental "<code>display: masonry</code>" CSS for my gallery and a few other areas of my website for over a year (with a fallback to standard grid columns). However, I noticed in the last few months that my browser was no longer honoring it, and finally researched what happened.</p>
<p>It turns out it's been renamed to "<code>display: grid-lanes</code>" in the <a href="https://drafts.csswg.org/css-grid-3/#grid-lanes-layout">CSS Grid Level 3 specification</a>. Otherwise, everything else remains the same; continue using <code>grid-template-columns</code> and <code>grid-template-rows</code> as you did with the the masonry display.</p>
<p>Safari has it in preview already, while Firefox and Chrome-based browsers have it behind a flag. (On Chrome-based browsers, visit <code>chrome://flags</code>, and enable the "css-grid-lanes-layout" flag.)</p>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-04-07-css-grid-lanes.html">CSS Grid Lanes</a> was originally
published <time class="dt-published" datetime="2026-04-07T10:38:00-05:00">7 April 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
PhpStorm 2026.1 is Now Out - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=phpstorm&p=6876302026-03-26T13:58:03.000Z
<p>Welcome to PhpStorm 2026.1! This release brings new PhpStorm MCP tools, new third-party agents inside your IDE, support for Git worktrees, and lots of other productivity-enhancing features for PHP and Laravel developers.</p>
<p class="has-text-align-center"><a class="jb-download-button" href="https://www.jetbrains.com/phpstorm/download/" target="_blank" rel="noopener">Download PhpStorm 2026.1</a></p>
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" fetchpriority="high" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/PS-releases-BlogFeatured-1280x720-1.png" alt="" class="wp-image-688069"/></figure>
<h2 class="wp-block-heading">PhpStorm MCP tools</h2>
<p>In PhpStorm 2025.2, we added an <a href="https://plugins.jetbrains.com/plugin/26071-mcp-server" target="_blank" rel="noopener">integrated MCP server</a> for third-party coding agents like Claude Code, Windsurf, or Codex to access and use your IDE’s tools. </p>
<p>In 2026.1, we are extending the MCP server toolset with more PhpStorm features, including:</p>
<ul>
<li><strong>Inspections and quick-fixes </strong>that enable agents to leverage PhpStorm’s powerful static analysis engine.</li>
<li><strong>IDE search</strong> <strong>capabilities</strong>, including PhpStorm’s structural search and semantic search for code patterns.</li>
<li><strong>Access to IDE actions</strong> so that you can delegate setup and customization of your IDE to your coding agent.</li>
</ul>
<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/claude_code_plugin.png" alt="" class="wp-image-687633" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/claude_code_plugin2.png" alt="" class="wp-image-687644" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<p>Furthermore, the <a href="https://github.com/JetBrains/phpstorm-claude-marketplace" target="_blank" rel="noopener">PhpStorm plugin for Claude Code</a> provides Claude Code with context and instructions for using PhpStorm MCP server tools. To add the plugin’s skills and hooks to your project, go to PhpStorm’s <em>Settings</em> | <em>Tools</em> | <em>PHP Claude Skills</em>.</p>
<p><strong><em>Note: </em></strong>PhpStorm’s MCP server is disabled by default. To enable the server and configure integration with your coding agent, go to <em>Settings</em> | <em>Tools</em> | <em>MCP Server</em>.</p>
<h2 class="wp-block-heading">AI</h2>
<h3 class="wp-block-heading">Third-party agents in PhpStorm</h3>
<p>PhpStorm is evolving as an open platform that allows you to bring the AI tools of your choice into your professional development workflows.</p>
<p>In addition to Junie, Claude Agent, and most recently <a href="https://blog.jetbrains.com/ai/2026/01/codex-in-jetbrains-ides/" data-type="link" data-id="https://blog.jetbrains.com/ai/2026/01/codex-in-jetbrains-ides/">Codex</a>, PhpStorm now lets you work with more AI agents directly in the AI chat. You can choose from agents such as GitHub Copilot, <a href="https://blog.jetbrains.com/ai/2026/03/cursor-joined-the-acp-registry-and-is-now-live-in-your-jetbrains-ide/" data-type="link" data-id="https://blog.jetbrains.com/ai/2026/03/cursor-joined-the-acp-registry-and-is-now-live-in-your-jetbrains-ide/">Cursor</a>, and many others supported through the <a href="https://www.jetbrains.com/acp/" data-type="link" data-id="https://www.jetbrains.com/acp/" target="_blank" rel="noopener">Agent Client Protocol</a>.</p>
<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/03/ACP_Registry_phpstorm.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/ACP_REGISTRY_phpstorm.mp4"></video></figure>
<h3 class="wp-block-heading">Next edit suggestions</h3>
<p><strong>Next edit suggestions </strong>are now available without consuming AI quota of your JetBrains AI Pro, Ultimate, and Enterprise subscriptions.<strong> </strong>These suggestions go beyond traditional code completion for PHP. Instead of updating only what’s at your cursor, they intelligently apply related changes across the entire file, helping you keep your code consistent and up to date with minimal effort.</p>
<p>This natural evolution of code completion delivers a seamless <em>Tab Tab</em> experience that keeps you in the flow.</p>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/next_edit_suggestions_php-1.gif" alt="" class="wp-image-689064" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<h3 class="wp-block-heading">Junie CLI is now in Beta</h3>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/junie_cli_now_in_beta.webp" alt="" class="wp-image-687690" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<p><a href="https://junie.jetbrains.com/" target="_blank" rel="noopener">Junie CLI</a> is JetBrains’ LLM-agnostic coding agent you can use directly from the terminal, inside any IDE, in CI/CD, and on GitHub or GitLab. Junie CLI comes with:</p>
<ul>
<li><strong>Bring Your Own Key (<strong>BYOK</strong>)</strong> pricing, allowing you to use your own keys from model providers without additional charges.</li>
<li><strong>One-click migration</strong> from other agents such as Claude Code or Codex.</li>
<li><strong>Flexible customization</strong> through guidelines, custom agents and agent skills, commands, MCP, and more.</li>
</ul>
<p></p>
<p>Read the full announcement <a href="https://blog.jetbrains.com/junie/2026/03/junie-cli-the-llm-agnostic-coding-agent-is-now-in-beta/">in our blog post</a>.</p>
<h2 class="wp-block-heading">Project indexing optimization</h2>
<p></p>
<p>PhpStorm now automatically detects framework-specific directories that contain frequently changing generated, cached, or user-uploaded content and excludes such directories from project indexing. </p>
<p>The IDE skips excluded folders during search, parsing, and other operations. Reducing indexing overhead helps optimize the CPU usage and performance of your IDE. </p>
<p>If you want to re-enable indexing for any of the automatically excluded folders, you can do so in <em>Settings</em> | <em>Directories</em> by clicking <em>Exclude</em> and unselecting the checkboxes next to the directories you want to be indexed.</p>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/project_indexing_optimization.png" alt="" class="wp-image-687679" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<p></p>
<h2 class="wp-block-heading">Generics support</h2>
<p>The new release brings a number of improvements and bug fixes for PhpStorm’s type inference engine, including: </p>
<ul>
<li><strong>Improved type inference for callable generic types.</strong> Now the IDE can infer both the input parameter type from a <code>callable(T)</code> annotation and the callable template return type.<br><br><img decoding="async" loading="lazy" class="wp-image-687714" style="width: 600px;; width:100% !important; height:auto !important; max-width:100% !important;" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/callables-type-inference2-1.png" alt=""><br></li>
<li><strong>Improved display for nested parameterized template types.</strong> PhpStorm 2026.1 displays parameter type (<em>Ctrl</em> + <em>Shift</em>+<em>P</em>) and quick documentation (<em>F1</em>) info with multiple layers of wrapping, such as <code>Wrapper<Wrapper<Wrapper<stdClass>>></code>.<br><br><img decoding="async" loading="lazy" class="wp-image-687725" style="width: 600px;; width:100% !important; height:auto !important; max-width:100% !important;" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/callables-type-inference3.png" alt=""><br></li>
</ul>
<h2 class="wp-block-heading">More quality-of-life improvements</h2>
<h3 class="wp-block-heading">Debugging non-PHP files</h3>
<p>You can now set breakpoints in non-PHP files as soon as the file name pattern is <a href="https://www.jetbrains.com/help/phpstorm/creating-and-registering-file-types.html#change-extension" target="_blank" rel="noopener">associated with the PHP file type</a> in the IDE settings. Together with native path mapping between templates and compiled PHP files <a href="https://xdebug.org/funding/001-native-path-mapping" target="_blank" rel="noopener">introduced in Xdebug 3.5</a>, this feature allows you to debug source template files of any format, including niche extensions like <code>.ezt</code>.</p>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/non-php-breakpoints2.png" alt="" class="wp-image-687747" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<h3 class="wp-block-heading">Improved <em>Go to test</em> navigation</h3>
<p>In PhpStorm 2026.1, we’ve improved <em>Go to Test</em> navigation for PHPUnit and Pest tests with the following enhancements: </p>
<ul>
<li>Navigation between PHPUnit tests that use a <code>#[UsesClass]</code> or <code>#[UsesMethod]</code> attribute and the related class/method.</li>
<li>For Pest tests, you can now navigate from the <em>Test Runner</em> tab to the source test nested inside Pest describe blocks. </li>
</ul>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/image-20.png" alt="" class="wp-image-687758" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<h3 class="wp-block-heading"><em>Convert to pipe operator</em> quick-fix</h3>
<p>PhpStorm now detects code elements where the PHP 8.5 pipe operator syntax can be used and suggests a quick-fix to convert such code into easier-to-read pipe operator chains.</p>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/image-21.png" alt="" class="wp-image-687769" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<h2 class="wp-block-heading">Laravel</h2>
<ul>
<li><strong>Framework support:</strong> support for Laravel 13 and new versions of Livewire and Filament. Support for the new @hasStack and @includeIsolated Blade directives.</li>
<li><strong>New package support</strong>: Laravel Wayfinder, PHP Native, staudenmeir/laravel-cte and staudenmeir/laravel-adjacency-list packages.</li>
<li><strong>Eloquent enhancements: </strong>advanced #[Scope] methods support, optimized and more accurate <em>Find Usages</em> for scope, attribute and relation methods.</li>
<li><strong>UI and navigation:</strong> Blade view usages UI, better controller inlays, new Route Search UI, and routes to the <em>Endpoints </em>tool window.</li>
<li><strong>Productivity tweaks:</strong> a new <em>Add Application Database </em>action. Run Artisan commands in the <em>Terminal</em> tool window or via PHP interpreter.</li>
<li><strong>Laravel Idea MCP server</strong> shipped with the PhpStorm MCP server.<br></li>
</ul>
<div class="wp-block-columns is-layout-flex wp-container-3 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/laravel-1-1.png" alt="" class="wp-image-689707"/></figure>
</div>
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/laravel-2-1.png" alt="" class="wp-image-689718"/></figure>
</div>
</div>
<div class="wp-block-columns is-layout-flex wp-container-6 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/laravel-3-1.png" alt="" class="wp-image-689729"/></figure>
</div>
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/laravel-4-1.png" alt="" class="wp-image-689740"/></figure>
</div>
</div>
<p>For the full list of updates, see <a href="https://laravel-idea.com/docs/changelog" target="_blank" rel="noopener">Laravel Idea’s changelog</a>.</p>
<h2 class="wp-block-heading">Frontend</h2>
<p>PhpStorm’s TypeScript support now uses the service-powered type engine (built on the TypeScript language service) by default, delivering more accurate type inference and lower CPU usage in large projects. The TypeScript support is further improved with better auto-import handling for path aliases and project references, as well as the integration of inlay hints from the TypeScript Go-based language server. JavaScript parsing now also correctly handles string-literal <code>import / export</code> specifiers.</p>
<p>Framework and styling support have been refined across the board: </p>
<ul>
<li>The IDE now highlights React’s new <code>use memo</code> and <code>use no memo</code> directives. </li>
<li>The Vue integration uses the updated 3.1.8 version of <code>@vue/typescript-plugin</code>. </li>
<li>Astro settings accept JSON-based configuration for language server integration. </li>
<li>Modern CSS <code>color()</code> functions and additional color spaces are supported in swatches and previews. </li>
<li>Angular 21.x template syntax is supported.</li>
</ul>
<p></p>
<h2 class="wp-block-heading">Databases</h2>
<p>The AI chat integration for Codex and Claude Agent now offers full, native support for your connected databases. With that, you can now query, analyze, and modify your database state using natural language right from the IDE.</p>
<p>The same functionality is available for external agents via an <a href="https://www.jetbrains.com/help/ai-assistant/mcp.html" target="_blank" rel="noopener">MCP server</a>.</p>
<p>Data source settings can now be stored in your <a href="https://sales.jetbrains.com/hc/en-gb/articles/208459005-What-is-JetBrains-Account" target="_blank" rel="noopener">JetBrains Account</a> via data source templates. Especially nifty for All Products Pack users or anyone who uses multiple instances of JetBrains IDEs, this upgrade allows you to access data source templates and settings in every JetBrains IDE with database functionality.</p>
<h2 class="wp-block-heading">Productivity-enhancing features</h2>
<h3 class="wp-block-heading">Editor caret and selection updates</h3>
<p>We’re continuing to modernize our IDEs, and in this update, we’ve refreshed something you interact with constantly – the editor. Smooth caret animation and updated selection behavior provide improved comfort, a cleaner look, and a more enjoyable coding experience. </p>
<p><a href="https://blog.jetbrains.com/platform/2026/02/editor-improvements-smooth-caret-animation-and-new-selection-behavior/">Read more</a></p>
<h3 class="wp-block-heading">Work on multiple branches at once with Git Worktrees</h3>
<p>With the evolution of AI agents, running multiple tasks in parallel has become a major time-saver, and this is precisely where Git worktrees are extremely handy. To support cutting-edge workflows for AI-boosted software development, PhpStorm now provides first-class support for Git worktrees. Create a separate worktree for an urgent hotfix, hand off another one to an AI agent, and keep working in your main branch – all at the same time, without interruption.</p>
<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/several_worktrees_dark.png" alt="" class="wp-image-689752" style="width:706px; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>
<p>Even if you don’t use agents, worktrees will save you time on branch switching, especially in big projects.</p>
<h3 class="wp-block-heading">Native Wayland support</h3>
<p>IntelliJ-based IDEs now run natively on Wayland by default. This transition provides Linux professionals with ultimate comfort through sharper HiDPI and better input handling, and it paves the way for future enhancements like Vulkan support.</p>
<p>While Wayland provides benefits and serves as a foundation for future improvements, we prioritize reliability: The IDE will automatically fall back to X11 in unsupported environments to keep your workflow uninterrupted. <a href="https://blog.jetbrains.com/platform/2026/02/wayland-by-default-in-2026-1-eap/">Learn more</a>.</p>
<h3 class="wp-block-heading">Terminal completion</h3>
<p>Stop memorizing commands. Start discovering them. In-terminal completion helps you instantly explore available subcommands and parameters as you type. Whether you’re working with complex CLI tools like Git, Docker, or kubectl or using your own custom scripts, this feature intelligently suggests valid options in real time.</p>
<h2 class="wp-block-heading">Code With Me sunset</h2>
<p>As we continue to evolve our IDEs and focus on the areas that deliver the most value to developers, we’ve decided to sunset Code With Me, our collaborative coding and pair programming service. Demand for this type of functionality has declined in recent years, and we’re prioritizing more modern workflows tailored to professional software development.</p>
<p>As of version 2026.1, Code With Me will be unbundled from all JetBrains IDEs. Instead, it will be available on JetBrains Marketplace as a separate plugin. 2026.1 will be the last IDE version to officially support Code With Me, as we gradually sunset the service.</p>
<p>Read the full announcement and sunset timeline in <a href="https://blog.jetbrains.com/platform/2026/03/sunsetting-code-with-me/">our blog post</a>. </p>
Create an HTML version of an OpenAPI spec - Rob Allenhttps://akrabat.com/?p=75572026-03-17T11:00:00.000Z<p>I have a new project where we will be integrating with a third party API that is currently being written. Due to Conway's Law, we are being sent new versions of the OpenAPI spec as a set of JSON files via email.</p>
<p>I quite like seeing the HTML rendering of an OpenAPI spec when reading it and understanding it, so I knocked up a simple shell script that takes an OpenAPI spec file and outputs an HTML doc. This is a trivial task thanks to <a href="https://scalar.com">Scalar</a>!</p>
<p>This is the script:</p>
<div><code>~/bin/create-openapi-spec-doc.sh:</code></div>
<pre lang="bash">
#!/usr/bin/env bash
set -eo pipefail
if [[ $# -eq 0 ]]; then
echo "Usage: $(basename "$0") <spec-file> [spec-file ...]"
echo "Generates an HTML API reference document for each OpenAPI spec file provided."
exit 1
fi
for spec_file in "$@"; do
base="${spec_file%.*}"
spec_name="$(basename "$base")"
{
cat <<EOF
<!doctype html>
<html>
<head>
<title>${spec_name} API</title>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1" />
</head>
<body>
<div id="app"></div>
<script
id="api-reference"
type="application/yaml">
EOF
cat "$spec_file"
cat <<'EOF'
</script>
<!-- Load the Script -->
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
</body>
</html>
EOF
} > "$base".html
echo "Generated: $base.html"
done
</pre
Its very easy to use:
<pre lang="bash">
$ create-openapi-spec-doc.sh *.json
Generated: provided_svc.html
Generated: required_svc.html
</pre>
<p>and now I have nicely formatted HTML files!</p>
PHPStan custom rules - Rob Allenhttps://akrabat.com/?p=75522026-03-03T11:00:00.000Z<p>Recently I discovered that this code passed our PHPStan level 10 checks:</p>
<pre>
use http\Exception\InvalidArgumentException;
// ...
throw new InvalidArgumentException;
</pre>
<p>I was surprised as <tt>http\Exception\InvalidArgumentException</tt> is not a class in our system. While cooling, I discovered that there's an http PHP extension and it appears that PHPStan has a stub for this which means that it accepts it as existing even if it doesn't.</p>
<p>What we think happened is that I wrote <tt>throw new InvalidArgumentException;</tt> and selected the wrong class from the dropdown in PHPStorm as I wanted to import the base <tt>InvalidArgumentExtension</tt></p>
<p>I want PHPStan to fail in this case, so I wrote a PHPStan extension that calls <tt>class_exists()</tt> to ensure that the class really is available:</p>
<pre>
<?php
declare(strict_types=1);
namespace Laminar\PHPStan\Rules;
use PhpParser\Node;
use PhpParser\Node\Stmt\Use_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\ShouldNotHappenException;
/**
* Flags imported classes that PHPStan knows about via bundled extension stubs
* but cannot be loaded in the current runtime environment.
*
* This rule checks using the xxx_exists() functions, so is only useful if run within
* a context that matches deployment.
*
* @implements Rule<Use_>
*/
class ImportedClassExistsRule implements Rule
{
public function __construct(private readonly ReflectionProvider $reflectionProvider)
{
}
public function getNodeType(): string
{
return Use_::class;
}
/**
* @return list<RuleError>
* @throws ShouldNotHappenException
*/
public function processNode(Node $node, Scope $scope): array
{
if ($node->type !== Use_::TYPE_NORMAL) {
return [];
}
$errors = [];
foreach ($node->uses as $use) {
$className = $use->name->toString();
if (! $this->reflectionProvider->hasClass($className)) {
continue;
}
if (
class_exists($className)
|| interface_exists($className)
|| trait_exists($className)
|| enum_exists($className)
) {
continue;
}
$errors[] = RuleErrorBuilder::message(
sprintf(
'Imported class %s does not exist at runtime. The required PHP extension may not be installed.',
$className,
),
)->identifier('akrabat.importedClassExists')
->line($use->getLine())
->build();
}
return $errors;
}
}
</pre>
<p>The only important thing you need to know about writing a custom PHPStan rule is that <tt>processNode()</tt> returns an array of errors and if that is empty, then the rule succeeded.</p>
<p>This one isn't particularly complicated, but it solves the problem!</p>
<p>As an aside, to prevent PhpStorm from providing autocomplete for extensions that don't exist in your application, go to Settings→PHP and select the PHP Runtime tab. You can then select the extensions you use and deselect those that you don't. There's even a "Sync Extensions with Interpreter" button which can be handy if you build your dev container from your prod one.</p>
Feelings - Rob Allenhttps://akrabat.com/?p=75492026-02-27T22:16:58.000Z<p>Today has been a struggle entirely due to my own internal negative thoughts and feelings about impacting events that are outside my control. </p>
<p>Navigating this to come out stronger rather than letting it consume my self-belief and confidence isn’t easy, especially at the time. I’m not worse at my job and my abilities haven’t diminished, but sometimes it’s hard to remember this. </p>
<p>I need to give myself space to remember who I am and internalise that my emotions are valid, but not the whole truth. Introspection and understanding of the whole is important. </p>
<p>Onwards and upwards.</p>
Headless boot for Beelink EQ14 - Blog entries :: mwop.nethttps://mwop.net/blog/2026-02-24-headless-boot-beelink-eq14.html2026-02-24T16:09:08.000Z<p>A few months back, I purchased a Beelink EQ14 mini server for my homelab. One thing that has frustrated me has been that rebooting or even powering on... has required I have either my keyboard or my monitor plugged in (I haven't been able to determine exactly which one yet). This has made me reluctant to reboot, as I then have to switch my keyboard from my workstation over to the server, and plug the HDMI from one of my monitors into it. I hate it.</p>
<p>In browsing a number of forums, I saw one recommendation to switch the BIOS to use FastBoot.</p>
<p>Can confirm, works!</p>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-02-24-headless-boot-beelink-eq14.html">Headless boot for Beelink EQ14</a> was originally
published <time class="dt-published" datetime="2026-02-24T10:09:08-06:00">24 February 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
Globbing files to pass to CLI command options - Blog entries :: mwop.nethttps://mwop.net/blog/2026-02-18-cli-options-with-globs.html2026-02-18T19:56:00.000Z<p>I've been using Helm recently as part of a new product offering, and as a way to deploy my various websites. Helm allows providing <em>values</em> to the templates in a Helm chart via one or more <em>values</em> files, which are provided via the option <code>-f</code>. It's often useful to break these into several files, so you can do things like cover common values, and then environment- or namespace-specific values.</p>
<p>However, the <code>-f</code> option only accepts a single value, and doesn't recognize globs.</p>
<h2>The printf solution</h2>
<p>The solution is to pass the glob to <code>printf</code>, with the format <code>'-f %s '</code>. This will print out an option per file.</p>
<p>When in a terminal, this can be done using <code>printf</code> within a subshell. Now <em>how</em> you do that depends on the shell, because the <code>-f</code> in our format string can be interpreted as an option/flag to <code>printf</code> itself depending on the shell.</p>
<p>For bash, we can do this:</p>
<pre><code class="language-bash hljs bash" data-lang="bash">helm upgrade -n qa . $(<span class="hljs-built_in">printf</span> -- <span class="hljs-string">'-f % '</span> *.values.yaml)
</code></pre>
<p>This is because <code>printf</code> in bash will emit an error for any unknown option/flag it encounters; the <code>--</code> tells the command when the end of all options/flags have been reached, so that it treats the remainder as arguments.</p>
<p>For fish, we don't need the <code>--</code>, as the <code>printf</code> implementation in fish doesn't accept arguments anyways:</p>
<pre><code class="language-bash hljs bash" data-lang="bash">helm upgrade -n qa . $(<span class="hljs-built_in">printf</span> <span class="hljs-string">'-f % '</span> *.values.yaml)
</code></pre>
<h2>Makefile</h2>
<p>Of course, subshells in a <code>Makefile</code> require a little change as well. In a <code>Makefile</code>, I write the above as:</p>
<pre><code class="language-vim hljs vim" data-lang="vim">helm upgrade -n <span class="hljs-keyword">qa</span> . $(<span class="hljs-keyword">shell</span> <span class="hljs-built_in">printf</span> -- <span class="hljs-string">'-f %'</span> *.<span class="hljs-built_in">values</span>.yaml)
</code></pre>
<p>(And since I also declare <code>SHELL=/bin/bash</code> at the top of my <code>Makefile</code>, I have to use the <code>--</code> trick here.)</p>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-02-18-cli-options-with-globs.html">Globbing files to pass to CLI command options</a> was originally
published <time class="dt-published" datetime="2026-02-18T13:56:00-06:00">18 February 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
Removing a filename containing a null byte or binary character on Linux - Blog entries :: mwop.nethttps://mwop.net/blog/2026-02-06-linux-null-byte-filename-removal.html2026-02-06T17:01:27.000Z<p>Somehow, I got a file in my tree that started with a null byte. I only discovered it because <code>git status</code> was noting it wasn't added to my branch, and wanted to know if I wanted to add it.</p>
<p>No, no, I did not. I wanted to delete it.</p>
<p>But, of course, you cannot reference such a file by name, so I had to learn a few tricks.</p>
<p>First off, you can list names with binary bytes using:</p>
<pre><code class="language-bash hljs bash" data-lang="bash">/bin/ls -lb
</code></pre>
<p>But even better, you can get the <em>inode</em> if you use:</p>
<pre><code class="language-bash hljs bash" data-lang="bash">/bin/ls -li
</code></pre>
<p>When you do, the inode is in the first column of the list for each file.</p>
<p>Once you know that, you can delete the file, using <code>find</code>:</p>
<pre><code class="language-bash hljs bash" data-lang="bash">find . -maxdepth 1 -inum <inode_id> -<span class="hljs-built_in">exec</span> rm -i -- {} +
</code></pre>
<div class="h-entry">
<img class="u-photo photo" width="50" src="https://avatars0.githubusercontent.com/u/25943?v=3&u=79dd2ea1d4d8855944715d09ee4c86215027fa80&s=140" alt="matthew">
<a class="u-url u-uid p-name" href="https://mwop.net/blog/2026-02-06-linux-null-byte-filename-removal.html">Removing a filename containing a null byte or binary character on Linux</a> was originally
published <time class="dt-published" datetime="2026-02-06T11:01:27-06:00">6 February 2026</time>
on <a href="https://mwop.net">https://mwop.net</a> by
<a rel="author" class="p-author" href="https://mwop.net">Matthew Weier O'Phinney</a>.
</div>
Dad - Rob Allenhttps://akrabat.com/?p=75382026-01-22T15:00:00.000Z<p>I don't often post personal things here, however last weekend my dad died peacefully in his sleep and it feels important to acknowledge this. </p>
<p>I have no words.</p>
<p></p>
<p><img decoding="async" src="https://akrabat.com/wp-content/uploads/2026/01/2026IMG_8398-web.jpg" alt="Keith Allen, 1932-2026" title="IMG_8398-web.jpg" border="0" style="max-width: 600px" /></p>
2025 in pictures - Rob Allenhttps://akrabat.com/?p=75312025-12-31T17:52:04.000Z<p>As we reach the end of 2025, I take this opportunity to look back over the photos that I have taken and thing about the year. This year I published 1,064 photos to Flickr with, of course, at least one photo every day as part of my <a href="https://project365.akrabat.com/2025.html">Project 365</a>. </p>
<p>The lovely thing is that my photos remind me what happened during my year and I remember many good times through them as I've seen friends and family over the months. I've done for many years now and you can see them all in my <a href="https://akrabat.com/category/year-in-pictures/">Year in pictures</a> category. </p>
<h2>January</h2>
<p>I started the year visiting the <a href="https://svr.co.uk">Severn Valley Railway</a> and took some photos of steam trains. I also visited <a href="https://phpstoke.co.uk">PHP Stoke</a> which was fun.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54245092637" title="View 'Hagley Hall' on Flickr.com"><img fetchpriority="high" decoding="async" alt="Hagley Hall." border="0" height="180" src="https://live.staticflickr.com/65535/54245092637_fbb69df220_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54271380091" title="View 'PHP Stoke user group' on Flickr.com"><img decoding="async" alt="PHP Stoke user group." border="0" height="180" src="https://live.staticflickr.com/65535/54271380091_13ef9bb76a_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">February</h2>
<p>I attended three community events in February, starting with <a href="https://fosdem.org/">FOSDEM</a> at the very start, <a href="https://www.phpconference.co.uk">PHP UK</a> mid-way through, and then <a href="https://www.meetup.com/fusion-technology-meetup-birmingham/">Fusion</a> towards the end. I really like catching up with the community and learning from them in the hallway track! I also photographed planes with Stuart!</p>
<p><a href="https://www.flickr.com/photos/akrabat/54316631185" title="View 'Stuart photographs an Avro Lincoln B2' on Flickr.com"><img decoding="async" alt="Stuart photographs an Avro Lincoln B2." border="0" height="180" src="https://live.staticflickr.com/65535/54316631185_dc8f5f659c_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54342351180" title="View 'Lorna and Ciaran at PHPUK' on Flickr.com"><img loading="lazy" decoding="async" alt="Lorna and Ciaran at PHPUK." border="0" height="180" src="https://live.staticflickr.com/65535/54342351180_608df6f181_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">March</h2>
<p>I had a quick trip to Spain this month which was very cold and wet and then spoke at <a href="https://drupalmountaincamp.ch">Drupal Mountain Camp</a>; my first time attending this conference and I loved the community vibe here. I was also enjoyed my visit to the <a href="https://kwvr.co.uk">KVWR</a> with Kevin.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54393395137" title="View 'Torchlit walk back to Davos' on Flickr.com"><img loading="lazy" decoding="async" alt="Torchlit walk back to Davos." border="0" height="180" src="https://live.staticflickr.com/65535/54393395137_8c7392e73b_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54405743399" title="View '44871' on Flickr.com"><img loading="lazy" decoding="async" alt="" border="0" height="180" src="https://live.staticflickr.com/65535/54405743399_7ff56547c1_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">April</h2>
<p>In April, I went down to London to take care of my dad while my mum visited her sister in America. I fitted in a trip to the SVR Spring Gala, and also spoke at PHP Berkshire, sharing the bill with <a href="https://www.flickr.com/photos/akrabat/54496644289">Dave Liddament</a></p>
<p><a href="https://www.flickr.com/photos/akrabat/54436035565" title="View 'Breakfast at the cafe with Dad' on Flickr.com"><img loading="lazy" decoding="async" alt="Breakfast at the cafe with Dad." border="0" height="180" src="https://live.staticflickr.com/65535/54436035565_c4c635a72e_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54465354171" title="View '75069' on Flickr.com"><img loading="lazy" decoding="async" alt="" border="0" height="180" src="https://live.staticflickr.com/65535/54465354171_34f9118734_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">May</h2>
<p>We celebrated lots of birthdays in May and visited Dudley Canal & Caverns. I spoke at <a href="https://www.phpday.it">phpday</a> in Verona and later the PHP Oxford user group. The community at both events are fantastic and I enjoyed all the great conversations. My wife and I also enjoyed a visit to <a href="https://www.nationaltrust.org.uk/visit/warwickshire/charlecote-park">Charlecote</a>. Most importantly, <a href="https://www.cpfc.co.uk/news/announcement/palaces-historic-fa-cup-triumph-voted-moment-of-the-season/">Crystal Palace won the FA cup</a> this month for the first time in their history!</p>
<p><a href="https://www.flickr.com/photos/akrabat/54542066604" title="View 'Discussions during a break' on Flickr.com"><img loading="lazy" decoding="async" alt="Discussions during a break." border="0" height="180" src="https://live.staticflickr.com/65535/54542066604_d6929e0ea1_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54542276400" title="View 'Charlecote' on Flickr.com"><img loading="lazy" decoding="async" alt="" border="0" height="180" src="https://live.staticflickr.com/65535/54542276400_1ce0118442_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">June</h2>
<p>The Nintendo Switch 2 was released this month and it's a great sequel to the original Switch. We spent most of the month on holiday in Spain, where I ate lots of ice cream.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54570731579" title="View 'New Nintendo Switch 2!' on Flickr.com"><img loading="lazy" decoding="async" alt="New Nintendo Switch 2!." border="0" height="180" src="https://live.staticflickr.com/65535/54570731579_b3a5c372f4_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54635347050" title="View 'Breakfast at Jijonenca' on Flickr.com"><img loading="lazy" decoding="async" alt="Breakfast at Jijonenca." border="0" height="180" src="https://live.staticflickr.com/65535/54635347050_b44e994cf9_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">July</h2>
<p>July was all about family and friends. My aunt and cousins from America visited, so we moved our family meet-up to July. We also had our regular lunch with friends in Crewe as that's half-way between us. We also celebrated our youngest's graduation of a first class degree in mathematics.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54654182619" title="View 'Family' on Flickr.com"><img loading="lazy" decoding="async" alt="" border="0" height="180" src="https://live.staticflickr.com/65535/54654182619_98a1aab8ee_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54676710940" title="View 'Graduation day' on Flickr.com"><img loading="lazy" decoding="async" alt="Graduation day." border="0" height="180" src="https://live.staticflickr.com/65535/54676710940_22a343d7d9_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">August</h2>
<p>There was <a href="https://www.thegreatestgathering.co.uk">a big railway event in August</a> celebrating 200 years of the modern railways. I visited mum & dad and I took dad out for breakfast at the local café which turned out to be the last time that dad and I will do that. We also visited our friend in Estonia.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54697473959" title="View 'So. Many. Trains.' on Flickr.com"><img loading="lazy" decoding="async" alt="So. Many. Trains." border="0" height="180" src="https://live.staticflickr.com/65535/54697473959_3e2d85ed2e_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54718230708" title="View 'Lunch at EuroCafé' on Flickr.com"><img loading="lazy" decoding="async" alt="Lunch at EuroCafé." border="0" height="180" src="https://live.staticflickr.com/65535/54718230708_56a8d0c5a6_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">September</h2>
<p>The big news in September is that my dad's wellbeing deteriorated far enough that mum was no longer able to care for him. He was taken to hospital and is now living in a care home. I'm pleased that the transition seems to have gone smoothly for both of them. Later that month, I attended <a href="https://www.apidays.global/events/london">apidays London</a> and then took a few days to take photos of <a href="https://www.nymr.co.uk">trains in Yorkshire</a>, while catching up with good friends in the evenings. The Moors really are a lovely place to spend time.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54798520592" title="View 'Dad' on Flickr.com"><img loading="lazy" decoding="async" alt="" border="0" height="180" src="https://live.staticflickr.com/65535/54798520592_57430deefd_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54823597257" title="View '257 Squadron on the NYMR' on Flickr.com"><img loading="lazy" decoding="async" alt="257 Squadron on the NYMR." border="0" height="180" src="https://live.staticflickr.com/65535/54823597257_2abe0f92ea_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">October</h2>
<p>In October, my aunt from America visited again which was lovely as she stayed with my mum, arriving a few days after dad had moved into a care home. I also spoke at <a href="https://nordicapis.com/events/platform-summit-2025/">Nordic APIs Platform Summit</a> in Stockholm. I was surprised to be on the main track and the conference as a whole was excellent. Finally, we celebrated another graduation as my wife graduated with a first class degree in Computing.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54865465096" title="View 'Jacob was as insightful as ever' on Flickr.com"><img loading="lazy" decoding="async" alt="Jacob was as insightful as ever." border="0" height="180" src="https://live.staticflickr.com/65535/54865465096_6d0e69268a_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54893106391" title="View 'Georgina's graduation' on Flickr.com"><img loading="lazy" decoding="async" alt="Georgina's graduation." border="0" height="180" src="https://live.staticflickr.com/65535/54893106391_8bcfa8fb49_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">November</h2>
<p>A quiet month, where I spoke at <a href="https://live.symfony.com/2025-amsterdam-con/">SymfonyCon</a> which celebrated the 20th anniversary of the framework.</p>
<p><a href="https://www.flickr.com/photos/akrabat/54955642911" title="View 'Lots of people in my talk' on Flickr.com"><img loading="lazy" decoding="async" alt="Lots of people in my talk." border="0" height="180" src="https://live.staticflickr.com/65535/54955642911_c454bbe7c4_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/54955643966" title="View 'Core Team Q&A' on Flickr.com"><img loading="lazy" decoding="async" alt="Core Team Q&A." border="0" height="180" src="https://live.staticflickr.com/65535/54955643966_e48b24a36d_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<h2 style="clear: both; margin-top: 20px; padding-top: 20px;">December</h2>
<p>I finished the year attending <a href="https://www.apidays.global/events/paris">apidays Paris</a>, my first visit to this very large conference, where I met some amazing people and learned things. We had a lovely Christmas at home where lots of cake and mince pies were consumed. Then, right at the end of the month, I visited the SVR for the final time this year to take photos of heritage diesel locomotives. I also bought a new camera for next year!</p>
<p><a href="https://www.flickr.com/photos/akrabat/54992440556" title="View 'At the API standards booth' on Flickr.com"><img loading="lazy" decoding="async" alt="At the API standards booth." border="0" height="180" src="https://live.staticflickr.com/65535/54992440556_7b81b055b0_n.jpg" style="float:left;" width="320" /></a><a href="https://www.flickr.com/photos/akrabat/55012341009" title="View '50 033 passes Trimpley Reservoir' on Flickr.com"><img loading="lazy" decoding="async" alt="50 033 passes Trimpley Reservoir." border="0" height="180" src="https://live.staticflickr.com/65535/55012341009_d4880a933c_n.jpg" style="float:left;margin-left: 3px;" width="320" /></a></p>
<p style="clear: both; margin-top: 3em; padding-top: 3em">
Looking back over 2025, it was a bittersweet year with some excellent times with family, friends and community folks, but it was tinged with my dad's transition to a care home. As always, I also very much enjoyed my railway photography and trips with Stuart.</p>
<p>Who knows what 2026 will bring, but I will continue to take photos throughout!</p>
Built-in Laravel Support: A New Era for PhpStorm Developers - PhpStorm : The IDE that empowers PHP developers | The JetBrains Bloghttps://blog.jetbrains.com/?post_type=phpstorm&p=6640372025-12-10T17:02:10.000Z
<p>For years, PhpStorm has been the go-to IDE for PHP developers – powerful and deeply integrated with the language. But there was one thing many kept asking for: Laravel support out of the box.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">It should come with built-in</p>— Amdadul Haq (@amdad121) <a href="https://twitter.com/amdad121/status/1950653324551958793?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">July 30, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Starting with <strong>PhpStorm 2025.3, Laravel support is now built in</strong>.<strong> </strong>From the moment you open your project, everything just works – no plugins, no configuration, no extra steps.</p>
<p>Discover the story behind this update from PhpStorm Team Lead <a href="https://x.com/pronskiy" target="_blank">Roman Pronskiy</a>, PhpStorm Software Developer Maria Filippova, JetBrains Product Lead <a href="https://x.com/artpestretsov" target="_blank">Artemy Pestretsov</a>, Laravel Idea plugin creator <a href="https://x.com/Adelf32" target="_blank">Adel Faizrakhmanov</a>, <a href="https://x.com/laravelphp" target="_blank">Laravel</a> creator <a href="https://x.com/taylorotwell" target="_blank">Taylor Otwell</a>, and JetBrains Developer Advocate for PHP <a href="https://x.com/brendt_gd" target="_blank">Brent Roose</a>:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Out-of-the-Box Laravel Support — Now in PhpStorm" src="https://www.youtube.com/embed/AZoOX6_mcZw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<div class="buttons">
<div class="buttons__row">
<a href="https://www.jetbrains.com/phpstorm/laravel/" class="btn" target="" rel="noopener">Start your Laravel journey</a>
</div>
</div>
<h2 class="wp-block-heading">FAQ</h2>
<h3 class="wp-block-heading"><strong>I use IntelliJ IDEA. How is Laravel support provided there</strong>?</h3>
<p>In IntelliJ IDEA, you can install the Laravel Idea plugin as usual from the main menu: <em>File | Settings | Plugins | Marketplace → “Laravel Idea”.</em></p>
<h3 class="wp-block-heading"><strong>Will the standalone Laravel Idea plugin continue to be maintained?</strong></h3>
<p>Yes. Adel and the PhpStorm team will continue collaborating to ensure the plugin – and PhpStorm’s integrated support – remain the top-tier Laravel development experience in the industry.</p>
<h3 class="wp-block-heading"><strong><strong>Is Laravel support available if I’m using PhpStorm for free?</strong></strong></h3>
<p>Yes. The built-in Laravel support is available to all PhpStorm users, including those using:</p>
<ul>
<li>The 30-day free trial.</li>
<li>Early access builds.</li>
<li>Free licenses, such as licenses for students, teachers, open-source projects, or startups.</li>
</ul>
<p>If you can run PhpStorm, you can use Laravel support – no limitations.</p>
<h3 class="wp-block-heading"><strong><strong><strong>I use PhpStorm. Can I now uninstall the Laravel Idea plugin?</strong></strong></strong></h3>
<p>In PhpStorm, the Laravel Idea plugin now comes pre-installed and enabled, so you no longer have to download or manage it manually. However, you should keep the plugin enabled; disabling or removing it will turn off all Laravel-specific features.</p>