for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
declare(strict_types=1);
namespace KunicMarko\SonataAnnotationBundle\DependencyInjection\Compiler;
use KunicMarko\SonataAnnotationBundle\Reader\ChildAdminReader;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
/**
* @author Marko Kunic <[email protected]>
*/
final class AddChildrenCompilerPass implements CompilerPassInterface
{
use FindClassTrait;
public function process(ContainerBuilder $container): void
/** @var ChildAdminReader $annotationReader */
$annotationReader = $container->get('sonata.annotation.reader.child_admin');
/** @var string[] $classAdmins */
$classAdmins = [];
/** @var array[] $adminParents */
$adminParents = [];
foreach ($container->findTaggedServiceIds('sonata.admin') as $id => $tag) {
if (!($class = $this->getClass($container, $id))) {
continue;
}
$classAdmins[$class] = $id;
if ($parents = $annotationReader->getChildren(new \ReflectionClass($class))) {
$adminParents[$id] = $parents;
foreach ($adminParents as $id => $parents) {
foreach ($parents as $parent => $field) {
if (!isset($classAdmins[$parent])) {
throw new \InvalidArgumentException(sprintf(
'%s is missing Admin Class.',
$parent
));
$definition = $container->getDefinition($classAdmins[$parent]);
$definition->addMethodCall('addChild'. [$id, $field]);
array($id, $field)
array
concatenation
If this is a false-positive, you can also ignore this issue in your code via the ignore-type annotation
ignore-type
$definition->addMethodCall('addChild'. /** @scrutinizer ignore-type */ [$id, $field]);