mirror of
https://github.com/rectorphp/rector.git
synced 2025-02-24 11:44:14 +01:00
Merge pull request #2821 from vladyslavstartsev/setParameters-to-ArrayCollection
rector for doctrine setParameters method
This commit is contained in:
commit
6d944620b4
@ -1,4 +1,4 @@
|
|||||||
# All 447 Rectors Overview
|
# All 448 Rectors Overview
|
||||||
|
|
||||||
- [Projects](#projects)
|
- [Projects](#projects)
|
||||||
- [General](#general)
|
- [General](#general)
|
||||||
@ -3134,6 +3134,40 @@ Remove temporary *Uuid relation properties
|
|||||||
|
|
||||||
## DoctrineCodeQuality
|
## DoctrineCodeQuality
|
||||||
|
|
||||||
|
### `ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionRector`
|
||||||
|
|
||||||
|
- class: `Rector\DoctrineCodeQuality\Rector\Class_\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionRector`
|
||||||
|
|
||||||
|
Change array to ArrayCollection in setParameters method of query builder
|
||||||
|
|
||||||
|
```diff
|
||||||
|
|
||||||
|
-use Doctrine\ORM\EntityRepository;
|
||||||
|
+use Doctrine\Common\Collections\ArrayCollection;use Doctrine\ORM\EntityRepository;use Doctrine\ORM\Query\Parameter;
|
||||||
|
|
||||||
|
class SomeRepository extends EntityRepository
|
||||||
|
{
|
||||||
|
public function getSomething()
|
||||||
|
{
|
||||||
|
return $this
|
||||||
|
->createQueryBuilder('sm')
|
||||||
|
->select('sm')
|
||||||
|
->where('sm.foo = :bar')
|
||||||
|
- ->setParameters([
|
||||||
|
- 'bar' => 'baz'
|
||||||
|
- ])
|
||||||
|
+ ->setParameters(new ArrayCollection([
|
||||||
|
+ new Parameter('bar', 'baz'),
|
||||||
|
+ ]))
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
### `InitializeDefaultEntityCollectionRector`
|
### `InitializeDefaultEntityCollectionRector`
|
||||||
|
|
||||||
- class: `Rector\DoctrineCodeQuality\Rector\Class_\InitializeDefaultEntityCollectionRector`
|
- class: `Rector\DoctrineCodeQuality\Rector\Class_\InitializeDefaultEntityCollectionRector`
|
||||||
|
@ -0,0 +1,150 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Rector\DoctrineCodeQuality\Rector\Class_;
|
||||||
|
|
||||||
|
use PhpParser\Node;
|
||||||
|
use PhpParser\Node\Arg;
|
||||||
|
use PhpParser\Node\Expr\Array_;
|
||||||
|
use PhpParser\Node\Expr\ArrayItem;
|
||||||
|
use PhpParser\Node\Expr\MethodCall;
|
||||||
|
use PhpParser\Node\Expr\New_;
|
||||||
|
use PhpParser\Node\Name\FullyQualified;
|
||||||
|
use PhpParser\Node\Scalar\String_;
|
||||||
|
use Rector\Core\Exception\ShouldNotHappenException;
|
||||||
|
use Rector\Core\Rector\AbstractRector;
|
||||||
|
use Rector\Core\RectorDefinition\CodeSample;
|
||||||
|
use Rector\Core\RectorDefinition\RectorDefinition;
|
||||||
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see https://github.com/doctrine/orm/blob/2.7/UPGRADE.md#query-querybuilder-and-nativequery-parameters-bc-break
|
||||||
|
*
|
||||||
|
* @see \Rector\DoctrineCodeQuality\Tests\Rector\Class_\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollection\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionTest
|
||||||
|
*/
|
||||||
|
class ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionRector extends AbstractRector
|
||||||
|
{
|
||||||
|
public function getNodeTypes(): array
|
||||||
|
{
|
||||||
|
return [MethodCall::class];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param MethodCall $node
|
||||||
|
*/
|
||||||
|
public function refactor(Node $node): ?Node
|
||||||
|
{
|
||||||
|
if ($this->needToSkip($node)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$methodArguments = $node->args;
|
||||||
|
if (count($methodArguments) !== 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$firstArgument = $methodArguments[0];
|
||||||
|
if (! $this->isArrayType($firstArgument->value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($node->args);
|
||||||
|
|
||||||
|
$arrayCollection = $this->getNewArrayCollectionFromSetParametersArgument($firstArgument);
|
||||||
|
|
||||||
|
$node->args = [new Arg($arrayCollection)];
|
||||||
|
return $node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDefinition(): RectorDefinition
|
||||||
|
{
|
||||||
|
return new RectorDefinition('Change array to ArrayCollection in setParameters method of query builder', [
|
||||||
|
new CodeSample(
|
||||||
|
<<<'PHP'
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
|
||||||
|
class SomeRepository extends EntityRepository
|
||||||
|
{
|
||||||
|
public function getSomething()
|
||||||
|
{
|
||||||
|
return $this
|
||||||
|
->createQueryBuilder('sm')
|
||||||
|
->select('sm')
|
||||||
|
->where('sm.foo = :bar')
|
||||||
|
->setParameters([
|
||||||
|
'bar' => 'baz'
|
||||||
|
])
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PHP
|
||||||
|
,
|
||||||
|
<<<'PHP'
|
||||||
|
|
||||||
|
use Doctrine\Common\Collections\ArrayCollection;use Doctrine\ORM\EntityRepository;use Doctrine\ORM\Query\Parameter;
|
||||||
|
|
||||||
|
class SomeRepository extends EntityRepository
|
||||||
|
{
|
||||||
|
public function getSomething()
|
||||||
|
{
|
||||||
|
return $this
|
||||||
|
->createQueryBuilder('sm')
|
||||||
|
->select('sm')
|
||||||
|
->where('sm.foo = :bar')
|
||||||
|
->setParameters(new ArrayCollection([
|
||||||
|
new Parameter('bar', 'baz'),
|
||||||
|
]))
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PHP
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function needToSkip(Node $node): bool
|
||||||
|
{
|
||||||
|
$classNode = $node->getAttribute(AttributeKey::CLASS_NODE);
|
||||||
|
if ($classNode === null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//one of the cases when we are in the repo and it's extended from EntityRepository
|
||||||
|
if (! $this->isObjectType($classNode, 'Doctrine\ORM\EntityRepository')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (! $this->isObjectType($node->var, 'Doctrine\ORM\EntityRepository')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ! $this->isName($node->name, 'setParameters');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getNewArrayCollectionFromSetParametersArgument(Arg $arg): New_
|
||||||
|
{
|
||||||
|
/** @var Array_ $arrayExpression */
|
||||||
|
$arrayExpression = $arg->value;
|
||||||
|
/** @var ArrayItem[] $firstArgumentArrayItems */
|
||||||
|
$firstArgumentArrayItems = $arrayExpression->items;
|
||||||
|
$arrayCollectionArrayArguments = [];
|
||||||
|
foreach ($firstArgumentArrayItems as $firstArgumentArrayItem) {
|
||||||
|
if (! $firstArgumentArrayItem->key instanceof String_ || ! $firstArgumentArrayItem->value instanceof String_) {
|
||||||
|
throw new ShouldNotHappenException();
|
||||||
|
}
|
||||||
|
$queryParameter = new New_(new FullyQualified('Doctrine\ORM\Query\Parameter'));
|
||||||
|
$queryParameter->args = [new Arg($firstArgumentArrayItem->key), new Arg($firstArgumentArrayItem->value)];
|
||||||
|
$arrayCollectionArrayArguments[] = new ArrayItem($queryParameter);
|
||||||
|
}
|
||||||
|
|
||||||
|
$arrayCollection = new New_(new FullyQualified('Doctrine\Common\Collections\ArrayCollection'));
|
||||||
|
|
||||||
|
$arrayCollection->args = [new Arg(new Array_($arrayCollectionArrayArguments))];
|
||||||
|
|
||||||
|
return $arrayCollection;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Rector\DoctrineCodeQuality\Tests\Rector\Class_\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollection;
|
||||||
|
|
||||||
|
use Iterator;
|
||||||
|
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
|
||||||
|
use Rector\DoctrineCodeQuality\Rector\Class_\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionRector;
|
||||||
|
|
||||||
|
final class ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionTest extends AbstractRectorTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @dataProvider provideData()
|
||||||
|
*/
|
||||||
|
public function test(string $file): void
|
||||||
|
{
|
||||||
|
$this->doTestFile($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideData(): Iterator
|
||||||
|
{
|
||||||
|
return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getRectorClass(): string
|
||||||
|
{
|
||||||
|
return ChangeQuerySetParametersMethodParameterFromArrayToArrayCollectionRector::class;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Rector\DoctrineCodeQuality\Tests\Rector\Class_\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollection\Fixture;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
|
||||||
|
class SomeRepository extends EntityRepository
|
||||||
|
{
|
||||||
|
public function getSomething()
|
||||||
|
{
|
||||||
|
return $this
|
||||||
|
->createQueryBuilder('sm')
|
||||||
|
->select('sm')
|
||||||
|
->where('sm.foo = :bar')
|
||||||
|
->setParameters([
|
||||||
|
'bar' => 'baz',
|
||||||
|
])
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
-----
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Rector\DoctrineCodeQuality\Tests\Rector\Class_\ChangeQuerySetParametersMethodParameterFromArrayToArrayCollection\Fixture;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
|
||||||
|
class SomeRepository extends EntityRepository
|
||||||
|
{
|
||||||
|
public function getSomething()
|
||||||
|
{
|
||||||
|
return $this
|
||||||
|
->createQueryBuilder('sm')
|
||||||
|
->select('sm')
|
||||||
|
->where('sm.foo = :bar')
|
||||||
|
->setParameters(new \Doctrine\Common\Collections\ArrayCollection([new \Doctrine\ORM\Query\Parameter('bar', 'baz')]))
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
Loading…
x
Reference in New Issue
Block a user