Symfony Plugin - Latest Features
Newest features for Symfony development in PhpStorm
2026-09-13
Reports concrete ConstraintViolationListInterface implementations without findByCodes(), deprecated in Symfony 8.1. Includes anonymous classes.
Missing method:
class CustomViolationList implements ConstraintViolationListInterface
{
// Other interface methods omitted.
// findByCodes() is missing.
}
2026-09-13
Reports YAML service options incompatible with from_callable, deprecated in Symfony 8.1.
Checks alias, parent, synthetic, file, arguments, properties, configurator, and calls.
Conflicting arguments:
services:
app.callback:
from_callable: ['App\Factory', 'create']
arguments: ['@logger'] # deprecated with from_callable
2026-09-13
Reports grouped attributes in ControllerEvent::setController(), deprecated in Symfony 8.1. Pass a flat list.
Grouped by attribute class:
$event->setController($controller, [Cache::class => [new Cache()]]);
Flat attribute list:
$event->setController($controller, [new Cache()]);
2026-09-12
Reports conflicting InputArgument and InputOption base modes deprecated in Symfony 8.1.
Conflicting modes:
new InputArgument('file', InputArgument::REQUIRED | InputArgument::OPTIONAL);
new InputOption('format', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_OPTIONAL);
Use one base mode:
new InputArgument('file', InputArgument::REQUIRED);
new InputOption('format', null, InputOption::VALUE_OPTIONAL);
2026-09-12
Reports copy_on_windows in literal mirror() options, deprecated in Symfony 8.1. Quick-fix renames it to follow_symlinks, preserving the value.
Deprecated option:
$filesystem->mirror($from, $to, options: ['copy_on_windows' => true]);
After quick-fix:
$filesystem->mirror($from, $to, options: ['follow_symlinks' => true]);
2026-09-12
Reports direct Request bag and Response header assignments deprecated in Symfony 8.1.
Deprecated assignments:
$request->attributes = new ParameterBag(['locale' => 'en']);
$response->headers = new ResponseHeaderBag(['X-Request-Id' => '123']);
Use constructor arguments:
$request = new Request(attributes: ['locale' => 'en']);
$response = new Response(headers: ['X-Request-Id' => '123']);
2026-09-12
Shows route path, methods, defaults, requirements, controller, and Twig usage count. Includes Find Usages.
Route declaration:
use Symfony\Component\Routing\Attribute\Route;
#[Route('/products/{id}', name: 'app_product_show', requirements: ['id' => '\d+'], methods: ['GET'])]
public function show(int $id): Response
{
// ...
}
Route references:
$this->generateUrl('app_product_show', ['id' => 42]);
{{ path('app_product_show', {id: 42}) }}
{{ url('app_product_show', {id: 42}) }}
2026-09-12
Reports deprecated tagged iterator and locator defaults on constructor parameters in Symfony 8.1. Set index and priority with #[AsTaggedItem].
Default priority method:
final class HandlerRegistry
{
public function __construct(
#[AutowireIterator('app.handler', defaultPriorityMethod: 'getDefaultPriority')]
private iterable $handlers,
) {}
}
final class ExampleHandler
{
public static function getDefaultPriority(): int { return 100; }
}
Use AsTaggedItem:
final class HandlerRegistry
{
public function __construct(
#[AutowireIterator('app.handler')]
private iterable $handlers,
) {}
}
#[AsTaggedItem(priority: 100)]
final class ExampleHandler {}
2026-09-12
Shows template paths, inheritance, PHP callers, and Twig usage counts. Includes Find Usages.
PHP render call:
return $this->render('product/show.html.twig', [
'product' => $product,
]);
Twig references:
{% extends 'base.html.twig' %}
{% block body %}
{% include 'product/_details.html.twig' with {product: product} %}
{% endblock %}
2026-09-09
Completion Twig Navigation
Entry completion and navigation in Vite and Reprise Twig functions.
Supported Twig functions:
{{ vite_entry_link_tags('app') }}
{{ vite_entry_script_tags('app') }}
{{ reprise_entry_script_tags('app') }}
{{ reprise_entry_link_tags(entryName: 'app') }}
{% set js = reprise_entry_js_files('app') %}
{% set css = reprise_entry_css_files('app') %}
{% if reprise_entry_exists('app') %}...{% endif %}
2026-09-07
Other PHP Form Find Usages
Find Usages on PHP properties and getters/setters includes matching form fields mapped via data_class.
Find Usages on Product::$title:
class Product {
public string $title;
}
Matching field in ProductType:
// configureOptions()
$resolver->setDefaults(['data_class' => Product::class]);
// buildForm()
$builder->add('title');
2026-08-16
Shows request, logs, events, timing, memory, Twig, Doctrine, and translation details. Use latest for the newest request.
Doctrine collector:
get_symfony_profiler_details(
hash: 'latest',
collector: 'db',
page: 1
)
2026-07-05
Shows prop type, description, and default value in Quick Documentation for Twig component attributes.
Component template:
{% props
## 'default'|'destructive' The visual style variant.
variant = 'default'
%}
{## The alert body. #}
{% block content %}{% endblock %}
Open Quick Documentation on variant:
<twig:Alert variant="destructive" />
2026-07-05
Completion Twig UX HTML Type
Completes Twig component props with types from ## documentation comments.
Component template:
{% props
## 'default'|'destructive' The visual style variant.
variant = 'default'
%}
{## The alert body. #}
{% block content %}{% endblock %}
Component usage:
<twig:Alert <caret> />
<twig:Alert :<caret> />
2026-07-05
Other Twig UX Type
Highlights ## markers and prop types in Twig documentation comments. Shows prop details on hover.
{% props
## 'default'|'destructive' The visual style variant.
variant = 'default'
%}
{## The alert body. #}
{% block content %}{% endblock %}
2026-06-19
Completion Twig PHP
Completes custom unary and binary operators from getExpressionParsers(), including aliases.
Twig extension:
public function getExpressionParsers(): array
{
return [
new BinaryOperatorExpressionParser(BitwiseAndBinary::class, 'b-and', 18),
new BinaryOperatorExpressionParser(ElvisBinary::class, '?:', 5, aliases: ['? :']),
new UnaryOperatorExpressionParser(NotUnary::class, 'expression_not', 70),
];
}
Twig expression:
{% if flags b-and mask %}
...
{% endif %}
2026-06-12
Completion PHP Completion Navigation
Provides completion and navigation for commands declared with #[AsCommand] on public methods.
use Symfony\Component\Console\Attribute\Argument;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Attribute\Option;
use Symfony\Component\Console\Command\Command;
final class UserCommands
{
#[AsCommand('app:user:create')]
public function create(
#[Argument(description: 'User name')] string $username,
#[Option(name: 'dry-run', shortcut: 'd')] bool $dryRun = false,
): int {
return Command::SUCCESS;
}
}
2026-06-08
Other PHP UX Doctrine Form Console
Decorates PHP class files with Symfony-specific icons so controllers, entities, repositories, form types, and console commands are easier to distinguish in the project tree.
The icon decoration is configurable in the Symfony plugin settings and uses the same Symfony metadata that powers navigation and inspections.
Decorated PHP class types:
#[AsCommand(name: 'app:reindex-products')]
final class ReindexProductsCommand extends Command
{
}
#[ORM\Entity(repositoryClass: ProductRepository::class)]
final class Product
{
}
final class ProductType extends AbstractType
{
}
#[Route('/products')]
final class ProductController extends AbstractController
{
}
2026-06-03
Reports Doctrine ORM mapping metadata that explicitly sets nullable on join columns where Doctrine ORM 3.6 ignores the value and Doctrine ORM 4.0 rejects it.
The inspection covers many-to-many join columns and identifier to-one join columns in PHP attributes, XML mapping files, and YAML mapping files.
Deprecated PHP attribute metadata:
#[ORM\ManyToMany(targetEntity: Group::class)]
#[ORM\JoinTable(joinColumns: [
new ORM\JoinColumn(name: 'user_id', nullable: true),
])]
private Collection $groups;
Remove the ignored nullable flag:
#[ORM\ManyToMany(targetEntity: Group::class)]
#[ORM\JoinTable(joinColumns: [
new ORM\JoinColumn(name: 'user_id'),
])]
private Collection $groups;
XML mapping is covered too:
<join-column name="group_id" referenced-column-name="id" nullable="false" />
Doctrine Criteria ordering API deprecations
DoctrineCollectionsCriteriaOrderingDeprecationInspection
2026-06-02
DoctrineCollectionsCriteriaOrderingDeprecationInspection Reports deprecated Doctrine Collections Criteria APIs around ordering and null offsets.
The inspection detects Criteria::getOrderings(), string order directions passed to orderBy(), and explicit null first-result offsets.
Deprecated Criteria calls:
$criteria->getOrderings();
$criteria->orderBy(['name' => 'ASC']);
$criteria->setFirstResult(null);
new Criteria($expr, [], null);
Use the newer API:
use Doctrine\Common\Collections\Order;
$criteria->orderings();
$criteria->orderBy(['name' => Order::Ascending]);
$criteria->setFirstResult(0);
new Criteria($expr, [], 0);