Symfony Plugin - Latest Features
Newest features for Symfony development in PhpStorm
2026-08-16
Returns details for one Symfony Profiler request, including request, logs, events, timings, Twig, and Doctrine data.
Doctrine collector:
get_profiler_request_details(
hash: '18e6b8',
collector: 'db',
page: 1
)
2026-07-05
Other Twig UX HTML Type
Shows prop type, description, and default value in Quick Documentation for Twig component attributes.
Open Quick Documentation on variant:
<twig:Alert variant="destructive" />
2026-07-05
Completion Twig UX HTML Type
Completes Twig component props and displays their @prop types.
Component template:
{# @prop variant 'default'|'destructive' The visual style variant. #}
{% props variant = 'default' %}
Component usage:
<twig:Alert <caret> />
<twig:Alert :<caret> />
2026-07-05
Other Twig UX Type
Highlights UX Toolkit @prop and @block annotations and shows prop details on hover.
{# @prop variant 'default'|'destructive' The visual style variant. #}
{# @block content The alert body. #}
{% props variant = 'default' %}
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);
Doctrine current date/time string defaults are deprecated
DoctrineCurrentDateTimeDefaultExpressionInspection
2026-06-02
DoctrineCurrentDateTimeDefaultExpressionInspection Reports Doctrine date, time, and timestamp field defaults that still use SQL strings such as CURRENT_TIMESTAMP.
Doctrine ORM 3.6 deprecates these string defaults for date/time fields; use DBAL DefaultExpression value objects instead. The inspection covers PHP attributes, XML, and YAML metadata when the matching vendor support is installed.
Deprecated string default:
#[ORM\Column(
type: Types::DATETIME_IMMUTABLE,
options: ['default' => 'CURRENT_TIMESTAMP'],
)]
private \DateTimeImmutable $createdAt;
Use a DBAL DefaultExpression:
use Doctrine\DBAL\Schema\DefaultExpression\CurrentTimestamp;
#[ORM\Column(
type: Types::DATETIME_IMMUTABLE,
options: ['default' => new CurrentTimestamp()],
)]
private \DateTimeImmutable $createdAt;
2026-06-02
Reports discriminator maps where the same class is mapped to multiple discriminator values.
Doctrine ORM 3.4 deprecates duplicate class entries in a discriminator map, and Doctrine ORM 4.0 turns this into an error. The inspection covers PHP attributes, ClassMetadata::setDiscriminatorMap(), and XML mapping files.
Deprecated duplicate class mapping:
#[ORM\DiscriminatorMap([
'user' => User::class,
'legacy_user' => User::class,
])]
abstract class BaseUser
{
}
Keep one discriminator value per class:
#[ORM\DiscriminatorMap([
'user' => User::class,
])]
abstract class BaseUser
{
}
2026-06-02
Reports deprecated array access on Doctrine ORM mapping value objects that use Doctrine\ORM\Mapping\ArrayAccessImplementation.
The quick fix rewrites safe array reads to public property access when Doctrine's vendor deprecation is available in the project.
Deprecated mapping array access:
$metadata = $entityManager->getClassMetadata(Entity::class);
$fieldMapping = $metadata->getFieldMapping('fieldName');
$length = $fieldMapping['length'] ?? null;
Use property access:
$metadata = $entityManager->getClassMetadata(Entity::class);
$fieldMapping = $metadata->getFieldMapping('fieldName');
$length = $fieldMapping->length ?? null;
2026-06-02
Reports application bundles that override the deprecated Symfony Bundle::registerCommands() hook when the installed vendor method is marked deprecated since Symfony 8.1.
Use #[AsCommand] on command classes or the console.command service tag instead.
Deprecated bundle hook:
use Symfony\Component\Console\Application;
use Symfony\Component\HttpKernel\Bundle\Bundle;
final class AppBundle extends Bundle
{
public function registerCommands(Application $application): void
{
$application->add(new ReindexProductsCommand());
}
}
Attribute-based command registration:
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
#[AsCommand(name: 'app:reindex-products')]
final class ReindexProductsCommand extends Command
{
}
2026-05-28
Completion Twig Navigation Find Usages
Completes and resolves PHP constants in Twig constant() calls, including fully qualified class constants, namespaced global constants, and object-relative constants.
The same resolver is used by navigation and Find Usages, so constant references in Twig stay connected to their PHP declarations.
Class and namespaced constants:
{{ constant('App\\Enum\\Status::ACTIVE') }}
{{ constant('BugDemo\\NAMESPACED_CONST') }}
Object-relative constants:
{# @var suite \BugDemo\CardSuite #}
{{ constant('CLUBS', suite) }}