Reputation: 343
I'm working on a Symfony 4 project using Visual Studio Code with Intelephense.
Intelephense gets errors which aren't. There are some examples:
Undefined method 'uasort'.
This error corresponding to this code:
// Collection creation of seasons used in the periods
$seasons = new ArrayCollection();
$sortedSeasons = new ArrayCollection();
//Search seasons used by periods
foreach ($advert->getPeriods() as $period)
{
$season = $period->getSeason();
if (! $seasons->contains($season))
{
$seasons->add($season);
}
}
// Sort seasons by ascending cost
$iterator = $seasons->getIterator();
$iterator->uasort(function ($a, $b) {
return $a->getCost() <=> $b->getCost();
});
An other example:
Undefined method 'getAdvertMinPrice'.
$minPrices = $this->getDoctrine()->getRepository(Price::class)->getAdvertMinPrice($advert);
However, the method exists in the PriceRepository:
<?php
namespace App\Repository\advert;
use App\Entity\advert\Price;
use Symfony\Bridge\Doctrine\RegistryInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
/**
* @method Price|null find($id, $lockMode = null, $lockVersion = null)
* @method Price|null findOneBy(array $criteria, array $orderBy = null)
* @method Price[] findAll()
* @method Price[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PriceRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, Price::class);
}
/**
* Get the minimum price from an advert
*
* @param [type] $advert
* @return Price[]
*/
public function getAdvertMinPrice($advert): array
{
return $this->createQueryBuilder('p')
->andWhere('p.price = (
SELECT MIN(p2.price)
FROM ' . $this->_entityName . ' p2
WHERE p2.advert = :val
)'
)
->setParameter('val', $advert)
->getQuery()
->getResult()
;
}
}
There is the Price name space:
<?php
namespace App\Entity\advert;
use App\Entity\advert\Advert;
use App\Entity\advert\Period;
use App\Entity\backend\Season;
use App\Entity\backend\Duration;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\advert\PriceRepository")
*
* @UniqueEntity(
* fields={"duration", "season"},
* message="A price already exists for this season and this duration."
* )
*/
class Price
{
And the use command in the file where I have the problem:
<?php
namespace App\Controller\advert;
use App\Entity\backend\VAT;
use App\Entity\advert\Price;
I don't understand where is the problem. I have searched for days without result.
Somebody would have an idea about this problem origin?
Upvotes: 22
Views: 41328
Reputation: 149
I have found a solution for this:
Here is some code from a project of mine:
/** @var ActivityRepository */
$activityRepo = $this->getDoctrine()->getRepository(Activity::class);
return $this->json($activityRepo->search($searchData['text']));
My "->search" was giving me error, then added the PHPDoc comment above my variable:
/** @var ActivityRepository */
and now it works!
Also check this out:
How to declare the type for local variables using PHPDoc notation?
Upvotes: 14
Reputation: 535
Simply reloading the window (VSCode) often solves the problem. No need to reinstall the extension then.
To reload vscode open the command palette (F1
) and select Developer: Reload Window
. This is equal to restarting the editor.
Upvotes: 41
Reputation: 343
Solved by uninstalling and reinstalling Visual Studio Code extensions.
Upvotes: 1
Reputation: 76787
The first error seems to be that $iterator
is not an ArrayIterator. You will need to check its type and if it's not ArrayIterator
(or a class
inherited from it), then that's the reason of the first error. On a subjective note, your situation seems to be some general problem with your dev environment.
Since PriceRepository
has the method which your second error complains about, this seems to be the case that different Price
and PriceRepository
classes might be implemented in different namespaces and the wrong being in use. However, to determine whether this is true you will need to edit your question and provide the full definition of PriceRepository
, Price and the use commands in the file where you have the problem.
Upvotes: 0