PHPStorm 对属性的引用似乎是错误的

PHPStorm References to properties seems wrong

更新了问题标题 对不起,如果这个问题的标题有点不对劲,我真的不知道该如何表达。

我正在尝试创建一项服务,该服务将从 json 提要中提取数据并通过学说 persist/flush 将其添加到我的数据库中。

经过多次 searching/reading/trial 和错误后,我设法注册了我的服务:

services:
    fantasyapi:
        class:        FantasyDataAPI\Client
        arguments:    ["%fantasyapi.key%"]
    data_manager:
      class: FantasyPro\DataBundle\DataManager\StadiumParser
      arguments: ['@doctrine.orm.entity_manager', '@fantasyapi', ::DataBundle.Entity.Stadium]

我正在使用带有 symfony2 插件的 php 风暴。

如果我使用:

$repo = $this->em->getRepository('DataBundle:Stadium');

PHP storm 将其报告为未定义函数。

但是如果我使用

$repo = $this->em->em->getRepository('DataBundle:Stadium');

php storm 没有将其报告为未定义。

我觉得我做错了什么,因为使用 ->em->em->getRepository 感觉不对。

我是否正确实例化了服务?如果是,为什么我必须复制对函数的引用?

这是我的服务的完整代码:

<?php

namespace FantasyPro\DataBundle\DataManager;

use Doctrine\ORM\EntityManager;
use FantasyDataAPI\Client;
use FantasyPro\DataBundle\Entity\Stadium;

class StadiumParser {

    private $em;
    private $client;
    private $stadium;
    /**
     * @param EntityManager $em
     * @param Client        $client
     * @param Stadium       $stadium
     */
    public function __constuct(EntityManager $em, Client $client, Stadium $stadium ) {
        $this->em = $em;
        $this->client = $client;
        $this->stadium = $stadium;
    }

    /**
     * @return array
     */
    public Function parseData(){

        $stadiumData = $this->client->client->Stadiums();

        //get the entity manager

        $repo = $this->em->em->getRepository('DataBundle:Stadium');

        $log = array();

        foreach ($stadiumData as $stadium) {
            // Get the current stadium in the list
            $criteria = array( 'stadiumID' => $stadium['StadiumID'] );
            $currentStadium = $repo-->FindOneBy( $criteria );

            if ( ! $currentStadium) {
                $currentStadium = new Stadium(); //no stadium with the StadiumID exists so create a new stadium

                $logData = [
                    'action'   => 'Added Stadium',
                    'itemID'   => $stadium['StadiumID'],
                    'itemName' => $stadium['Name']
                ];
                $log[] = $logData;
            } else {
                $logData = [
                    'action'   => 'Updated '.$logTitle,
                    'itemID'   => $stadium['PlayerID'],
                    'itemName' => $stadium['Name']
                ];
                $log[] = $logData;
            }
            $currentStadium->setStadiumID( $stadium['StadiumID'] );
            $currentStadium->setName( $stadium['Name'] );
            $currentStadium->setCity( $stadium['City'] );
            $currentStadium->setState( $stadium['State'] );
            $currentStadium->setCountry( $stadium['Country'] );
            $currentStadium->setCapacity( $stadium['Capacity'] );
            $currentStadium->setPlayingSurface( $stadium['PlayingSurface'] );
            $this->em->em->persist( $currentStadium );
        }
        $this->em->em->flush();
        return $log;
    }
}

您可以记录每个成员的类型 class:

<?php

namespace FantasyPro\DataBundle\DataManager;

use Doctrine\ORM\EntityManager;
use FantasyDataAPI\Client;
use FantasyPro\DataBundle\Entity\Stadium;

class StadiumParser
{ 
    /** @var EntityManager em */
    private $em;
    /** @var Client client */
    private $client;
    /** @var Stadium stadium */
    private $stadium;
    /* ... */

出于某种原因,当我只使用 class 名称时,PHPStorm 无法识别 classes,所以我不得不输入完整的命名空间,例如:

    /* ... */
    /** @var \Doctrine\ORM\EntityManager em */
    private $em;
    /* ... */