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

时间:2015-04-23 11:59:11

标签: symfony service dependency-injection

更新了问题标题 对不起,如果这个问题的标题有点偏,我真的不确定如何用它来表达。

我正在尝试创建一个服务,该服务将从json提要中提取数据并通过doctrine将其保存/刷新到我的数据库。

经过多次搜索/阅读/试错,我设法让我的服务注册了:

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

我正在使用php风暴和symfony2插件。

如果我使用:

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

PHP风暴将其报告为未定义的函数。

但是,如果我使用

$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;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以记录班级中每个成员的类型:

<?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;
    /* ... */

由于某些原因,PHPStorm在我只使用类名时没有识别出类,所以我必须放入完整的命名空间,例如:

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