我正在尝试创建一个可以访问ZF2服务定位器的模型。
我有一个如下所示的模型类:
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class testDelete implements ServiceLocatorAwareInterface
{
protected $services;
/**
* construct function
*/
public function __construct ()
{
$router = $this->getServiceLocator()->get('Router');
}
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->services = $serviceLocator;
}
public function getServiceLocator()
{
return $this->services;
}
}
在阅读教程和博客时,这应该给我一个服务定位器的实例,然后我可以使用它来调用类。但是当我打电话给它时,我收到了一条消息
致命错误:在非对象上调用成员函数get()...
有谁知道为什么会这样?
我是否需要进行某种设置才能使服务定位器界面正常工作?
答案 0 :(得分:0)
看起来您需要在Modules Module.php文件的getServiceConfig()方法中设置“Router”服务:
public function getServiceConfig()
{
return array
(
'factories' => array
(
'Router' => function($serviceManager)
{
... your logic ...
return $Router
},
),
);
}
您的Module.php文件将如下所示:
namespace ModuleName;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ServiceProviderInterface;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
/**
* Tables (& Databases) Used in this Module
*/
use Your\Model\ModelName;
use Your\Mapper\ModelMapperName;
class Module implements AutoloaderProviderInterface
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$serviceManager = $e->getApplication()->getServiceManager();
$sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
/**
* Additional logic for Setting up Logging, Pre-Initializations, Exceptions etc
*/
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function getAutoloaderConfig()
{
return array
(
'Zend\Loader\ClassMapAutoloader' => array
(
include __DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array
(
'namespaces' => array
(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getServiceConfig()
{
return array
(
'factories' => array
(
'Router' => function($serviceManager)
{
... your logic ...
return $Router
},
),
);
}
}
答案 1 :(得分:0)
因为您的类实现了ServiceLocatorAware
,所以服务管理器会自动将服务定位器注入其中。但是,如果服务管理器是实例化testDelete
类的东西,它只能这样做。因此,您需要为testDelete
设置服务。
完成后,您仍然无法从$this->getServiceLocator()
调用__construct()
,因为依赖项尚未注入课程。
如果您只想让路由器进入testDelete
类,只需为testDelete
创建一个服务,并将路由器作为依赖项传递。这比你目前要做的要容易得多。