0

在文档中它说:“默认情况下,Zend Framework MVC 注册一个初始化器,它将作为 Zend\ServiceManager\ServiceLocatorInterface 的实现的 ServiceManager 实例注入到任何实现 Zend\ServiceManager\ServiceLocatorAwareInterface 的类中。”

所以我尝试了这个:

interface ModelResourceInterface extends ServiceLocatorAwareInterface
{
}

interface ServiceModelResourceInterface extends ModelResourceInterface
{
    public function fetch($uri, $method, $parameters, $options, $encodeType);
}


namespace Ssports\Model\Resource\Service\Http;

use Ssports\Model\Resource\Service\ServiceModelResourceInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Http\Client;
use Zend\Http\Request;
use Ssports\Model\Resource\Service\ConnectionException;

abstract class AbstractHttpServiceModelResource implements ServiceModelResourceInterface
{

    /**
     *
     * @var Zend\ServiceManager\ServiceLocatorInterface;
     */
    protected $serviceLocator;

    /**
     * Constructor
     */
    function __construct()
    {
        $this->init();
    }

    /**
     * Extend Constructor
     */
    public function init()
    {}

    /**
     * (non-PHPdoc)
     *
     * @see \Zend\ServiceManager\ServiceLocatorAwareInterface::setServiceLocator()
     *
     */
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    /**
     * (non-PHPdoc)
     *
     * @see \Ssports\Model\Resource\Service\ServiceModelResourceInterface::fetch()
     *
     */
    public function fetch($uri, $method, $parameters = null, $options = null, $encodeType = null)
    {
        try {
                //something raise \RuntimeException
        } catch (\RuntimeException $e) {
            $this->getServiceLocator()->get('Log\Web');
            throw new ConnectionException();
        }
    }

    /**
     * (non-PHPdoc)
     *
     * @see \Zend\ServiceManager\ServiceLocatorAwareInterface::getServiceLocator()
     *
     */
    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }
}

我用一些模型资源类扩展这个抽象类,然后运行它,然后抛出一个异常,说我正在对非对象调用 get。

似乎服务管理器没有被注入到我的抽象类中,并且 getServiceLocator 的返回为 NULL。

我错过了什么使它正确吗?

4

1 回答 1

0

您是否尝试过使用服务定位器特征?

它可以在 \Zend\ServiceManager\ServiceLocatorAwareTrait 中找到

然而,这需要 PHP 5.4 才能工作......

要使用特征,请执行以下操作

class Class1
{
  use Zend\ServiceManager\ServiceLocatorAwareTrait;
}

然后您可以访问服务定位器,或者至少当我需要加载服务定位器时我必须这样做。

于 2013-06-17T10:05:39.817 回答