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> />