Visual Studio Code PHP Intelephense 收到错误

Chr*_*ois 7 php error-handling symfony4

我正在使用 Visual Studio Code 和 Intelephense 处理一个 Symfony 4 项目。

Intelephense 得到的错误不是。有一些例子:

未定义的方法 'uasort'。

此错误对应于此代码:

// 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();
});
Run Code Online (Sandbox Code Playgroud)

另一个例子:

未定义的方法“getAdvertMinPrice”。

$minPrices = $this->getDoctrine()->getRepository(Price::class)->getAdvertMinPrice($advert);
Run Code Online (Sandbox Code Playgroud)

但是,该方法存在于 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()
            ;
        }
    }
Run Code Online (Sandbox Code Playgroud)

有价格命名空间:

<?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
{
Run Code Online (Sandbox Code Playgroud)

以及我遇到问题的文件中的 use 命令:

<?php

namespace App\Controller\advert;

use App\Entity\backend\VAT;
use App\Entity\advert\Price;
Run Code Online (Sandbox Code Playgroud)

我不明白问题出在哪里。我已经搜索了几天没有结果。

有人会知道这个问题的起源吗?

use*_*970 17

简单地重新加载窗口(VSCode)通常可以解决问题。无需重新安装扩展程序。

要重新加载 vscode,请打开命令面板 ( F1) 并选择Developer: Reload Window. 这相当于重新启动编辑器。

  • 请说明如何以及可能为何解决该问题。 (2认同)

小智 14

我已经找到了一个解决方案:

这是我的一个项目中的一些代码:

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

我的“->搜索”给了我错误,然后在我的变量上方添加了 PHPDoc 注释:

/** @var ActivityRepository */

现在可以了!

另请检查一下:

如何使用 PHPDoc 表示法声明局部变量的类型?


Chr*_*ois 1

通过卸载并重新安装 Visual Studio Code 扩展解决。

  • 为什么这是公认的答案? (3认同)