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?
4 Réponses :
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.
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.
Résolu en désinstallant et en réinstallant les extensions Visual Studio Code.
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.
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
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?
Donc, VSCode signale ces erreurs, mais pas votre serveur Web actuel?
@Jeto En effet, les erreurs ne proviennent que de VSCode, pas du serveur.