3
votes

Visual Studio Code PHP Intelephense obtient des erreurs qui ne le sont pas

Je travaille sur un projet Symfony 4 utilisant Visual Studio Code avec Intelephense.

Intelephense reçoit des erreurs qui ne le sont pas. Il y a quelques exemples:

Méthode non définie 'uasort'.

Cette erreur correspondant à ce code:

<?php

namespace App\Controller\advert;

use App\Entity\backend\VAT;
use App\Entity\advert\Price;

Un autre exemple:

Méthode non définie 'getAdvertMinPrice'.

<?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
{

Cependant, la méthode existe dans le 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()
            ;
        }
    }

Il y a l'espace de nom Price:

$minPrices = $this->getDoctrine()->getRepository(Price::class)->getAdvertMinPrice($advert);

Et la commande use dans le fichier où j'ai le problème:

// 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();
});

Je ne comprends pas où est le problème. J'ai cherché pendant des jours sans résultat.

Quelqu'un aurait une idée de l'origine de ce problème?


2 commentaires

Donc, VSCode signale ces erreurs, mais pas votre serveur Web actuel?


@Jeto En effet, les erreurs ne proviennent que de VSCode, pas du serveur.


4 Réponses :


0
votes

La première erreur semble être que $iterator n'est pas un ArrayIterator . Vous devrez vérifier son type et si ce n'est pas ArrayIterator (ou une class héritée de celui-ci), alors c'est la raison de la première erreur. Sur une note subjective, votre situation semble être un problème général avec votre environnement de développement.

Étant donné que PriceRepository a la méthode dont se plaint votre deuxième erreur, cela semble être le cas que différentes classes Price et PriceRepository pourraient être implémentées dans différents espaces de noms et une mauvaise utilisation. Cependant, pour déterminer si cela est vrai, vous devrez modifier votre question et fournir la définition complète de PriceRepository , Price et les commandes d'utilisation dans le fichier où vous rencontrez le problème.


7 commentaires

Merci beaucoup pour votre aide. J'ai ajouté le code demandé à mon message.


@ChristopheDubois merci. Pouvez-vous également ajouter la classe PriceRepository?


@ChristopheDubois no. Vous en avez une seule ligne et à partir de là, nous ne pouvons pas déterminer si le bon prix est utilisé.


J'ai à nouveau formaté l'article pour mieux voir le code PriceRepository. Dois-je ajouter autre chose?


@ChristopheDubois non, nous pouvons maintenant voir que App\Repository\advert est l'espace de noms utilisé. Que se passe-t-il si vous exécutez composer l'installation ou composer la mise à jour?


@Larjos Arpad Désolé, je n'ai pas vu votre message. J'ai exécuté la mise à jour du compositeur et j'ai cette erreur: Impossible de télécharger automatiquement le service "App \ Repository \ address \ AddressRepository": l'argument "$ registry" de la méthode "__construct ()" référence l'interface "Symfony \ Bridge \ Doctrine \ RegistryInterface" mais aucun service de ce type existe. Essayez à la place de changer l'indicateur de type en "Doctrine \ Persistence \ ManagerRegistry".


@Larjos Arpad Dans chaque référentiel, j'ai changé Use Symfony \ Bridge \ Doctrine \ RegistryInterface; par utilisation, utilisez Doctrine \ Persistence \ ManagerRegistry; et la fonction publique __construct (RegistryInterface $ registry) par la fonction publique __construct (ManagerRegistry $ registry). Je n'ai plus d'erreurs de serveur mais j'ai toujours l'erreur Intelephense concernant la fonction getAdvertMinPrice qui n'existe pas.



0
votes

Résolu en désinstallant et en réinstallant les extensions Visual Studio Code.


0 commentaires

1
votes

Le simple fait de recharger la fenêtre (VSCode) résout souvent le problème. Pas besoin de réinstaller l'extension alors.

Pour recharger vscode, ouvrez la palette de commandes ( F1 ) et sélectionnez Developer: Reload Window . Cela équivaut à redémarrer l'éditeur.


3 commentaires

Veuillez indiquer comment et éventuellement pourquoi cela résout le problème.


Comment? Vous allez fermer vscode et rouvrir l'éditeur?


F1 > Developer: Reload Window a le même effet que la fermeture et l'ouverture à nouveau du vscode



1
votes

J'ai trouvé une solution pour cela:

Voici le code d'un de mes projets:

/** @var ActivityRepository */
$activityRepo = $this->getDoctrine()->getRepository(Activity::class);
return $this->json($activityRepo->search($searchData['text']));

Ma "-> recherche" me donnait une erreur, puis a ajouté le commentaire PHPDoc au-dessus de ma variable:

/ ** @var ActivityRepository * /

et maintenant ça marche!

Vérifiez également ceci:

Comment déclarer le type des variables locales en utilisant la notation PHPDoc?


0 commentaires