Logo   espend.de
Missing ConstraintViolationList findByCodes()
ConstraintViolationListFindByCodesInspection
2026-09-13
Inspection PHP Paid

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.
}
Conflicting from_callable service options
FromCallableOptionInspection
2026-09-13
Inspection Yaml Paid

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
Deprecated grouped controller attributes
HttpKernelEventArgumentInspection
2026-09-13
Inspection PHP Paid

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()]);
Conflicting Console input modes
ConsoleInputModeInspection
2026-09-12
Inspection PHP Paid

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);
Deprecated Filesystem mirror option
FilesystemMirrorCopyOnWindowsInspection
2026-09-12
Inspection PHP Paid

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]);
Deprecated Request/Response property writes
HttpFoundationPropertyWriteInspection
2026-09-12
Inspection PHP Paid

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']);
Quick Documentation for Symfony routes
RouteDocumentationTargetProvider
2026-09-12
Documentation Routing PHP Twig Find Usages

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}) }}
Deprecated tagged collection default methods
TaggedCollectionDefaultMethodInspection
2026-09-12
Inspection PHP Paid

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 {}
Quick Documentation for Twig templates
TwigTemplateDocumentationTargetProvider
2026-09-12
Documentation Twig PHP Find Usages

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 %}
Vite and Reprise entry completion
ViteGotoCompletionRegistrar
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 %}
Find Usages for Symfony form fields
FormFieldReferencesSearchExecutor
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');
Symfony Profiler request details MCP tool
ProfilerRequestDetailsMcpToolset
2026-08-16
MCP Profiler PHP

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
)
Quick Documentation for Twig component props
TwigComponentAttributeDocumentationProvider
2026-07-05
Documentation Twig UX HTML Type

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" />
Twig component prop completion with types
TwigComponentPropCompletion
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> />
Twig UX documentation comments
TwigUxToolkitAnnotator
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 %}
Custom Twig operator completion
TwigExpressionParserOperatorCompletion
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 %}
Method-based command completion and navigation
SymfonyMethodBasedCommandSupport
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;
    }
}
Symfony type icons for PHP classes
PhpClassFileIconProvider
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
{
}
Doctrine join column nullable is ignored
DoctrineJoinColumnNullableDeprecationInspection
2026-06-03
Inspection PHP XML Yaml Doctrine Paid

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
Inspection PHP Doctrine Paid

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);