调用成员函数get()

时间:2013-01-31 10:12:55

标签: zend-framework2

我在ZF2供应商库中创建了一个排序基础模块。到目前为止,一切都按照我希望的方式运作。我确实有问题。虽然我能够扩展基本模块的控制器,但我无法访问基本服务。我使用Doctrine 2作为我的数据库层。

实现ServiceLocator后,我收到致命错误:在我的基本服务文件中的非对象上调用成员函数get()。我的BaseService文件如下所示:

namespace MyResource\Service;

use Doctrine\ORM\Mapping as ORM;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class BaseService implements ServiceLocatorAwareInterface
{
    /**
     * Entity manager instance
     *
     * @var Doctrine\ORM\EntityManager
     */
    protected $_em;

    protected $_serviceLocator;

    public function __construct()
    {
        $this->getEntityManager();
    }

    /**
     * Returns an instance of the Doctrine entity manager loaded from the service
     * locator
     *
     * @return Doctrine\ORM\EntityManager
     */
    public function getEntityManager()
    {
        if (null === $this->_em) {
            $this->_em = $this->getServiceLocator()
                 ->get('doctrine.entitymanager.orm_default');
        }
        return $this->_em;
    }

    /**
     * Set serviceManager instance
     *
     * @param  ServiceLocatorInterface $serviceLocator
     * @return void
     */
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    /**
     * Retrieve serviceManager instance
     *
     * @return ServiceLocatorInterface
     */
    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }

}

有人可以帮忙吗?

由于

3 个答案:

答案 0 :(得分:0)

1):

您的财产被称为

protected $_serviceLocator;

但您要将值分配给

protected $serviceLocator;

2)

您是通过DI还是服务经理创建服务?如果您这样做,那么应该为您自动注入ServiceLocator,如果您使用“new”关键字手动创建它,那么它将不会附加ServiceLocatior。

答案 1 :(得分:0)

  

ZF2似乎有一个小故障。如果你尝试设置属性   如下所示,问题将得到解决。试试这个

foreach ($resultSet as $row) {

        $entity = new Countrypages();
            $entity->setId($row->id);
        $entity->setName($row->name);
        $entity->setSnippet($row->snippet);
        $entity->setSortorder($row->sortorder);
        $entity->setActive($row->active);
        $entity->setCreated($row->created);
        $entity->setModified($row->modified);
        $entity->setFirstname($row->firstname);
        $entity->setCreatedby($row->createdby);
        $entities[] = $entity;
    }
  

忽略此

  foreach ($resultSet as $row) {

                    $entity = new Countrypages();
                    $entity->setId($row->id);
                    ->setName($row->name);
                    ->setSnippet($row->snippet);
                    ->setSortorder($row->sortorder);
                    ->setActive($row->active);
                    ->setCreated($row->created);
                    ->setModified($row->modified);
                    ->setFirstname($row->firstname);
                    ->setCreatedby($row->createdby);
                    $entities[] = $entity;
                }
  

我希望这可以帮助您节省时间。

答案 2 :(得分:-1)

您正在使用use use Zend\ServiceManager\ServiceManagerAwareInterface,但您正在实施ServiceLocatorAwareInterface(并且没有"使用"声明该字段)。