Christophe Dubois
Christophe Dubois

Reputation: 343

Visual Studio Code PHP Intelephense gets errors which aren't

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

Answers (4)

Pablo C&#226;mara
Pablo C&#226;mara

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

user3539970
user3539970

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

Christophe Dubois
Christophe Dubois

Reputation: 343

Solved by uninstalling and reinstalling Visual Studio Code extensions.

Upvotes: 1

Lajos Arpad
Lajos Arpad

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

Related Questions