Zend framework2 如何将ServiceManager注入到用户定义的类中
文档中说:“默认情况下,Zend Framework MVC注册一个初始值设定项,该初始值设定项将ServiceManager实例(Zend\ServiceManager\ServiceLocatorInterface的实现)注入实现Zend\ServiceManager\ServiceLocatorAwareInterface的任何类中。” 所以我试了一下:Zend framework2 如何将ServiceManager注入到用户定义的类中,zend-framework2,inject,service-locator,Zend Framework2,Inject,Service Locator,文档中说:“默认情况下,Zend Framework MVC注册一个初始值设定项,该初始值设定项将ServiceManager实例(Zend\ServiceManager\ServiceLocatorInterface的实现)注入实现Zend\ServiceManager\ServiceLocatorAwareInterface的任何类中。” 所以我试了一下: interface ModelResourceInterface extends ServiceLocatorAwareInterfac
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
有什么我没做的吗?你试过使用服务定位器吗 可以在\Zend\ServiceManager\serviceLocatorIt中找到它 然而,这需要PHP5.4才能工作 要使用特征,请执行以下操作
class Class1
{
use Zend\ServiceManager\ServiceLocatorAwareTrait;
}
您可以访问服务定位器,或者至少当我需要加载服务定位器时,我必须这样做。我发现了这里的问题。因为abtract类不能被初始化,所以您可以编写set和get方法以供其他子类扩展,但是您不能调用其中的serviceLocator,因为它不会被实例化。啊,好吧,至少您已经对它进行了排序!最好只注入您需要的类,而不是类的完整注册表。现在我看到的只是一个“记录器”-注入该记录器,而不是ServiceManager!