如何在控制器外部使用serviceLocator

时间:2015-03-24 02:49:37

标签: php zend-framework zend-framework2

如何在模型中使用Zend Framework Service Locator?我有一个类,我想使用表网关模型。我已经按照Album示例,并希望访问控制器外部的表。但是,如果我将代码从控制器复制并粘贴到我需要它的类中,我会收到一个错误(未定义的方法:getServiceLocator())。我如何使用这个课程'在控制器外面?

最后我想访问"中的功能。 class AlbumTable"在控制器之外的其他东西(在这种情况下是另一个类)。谢谢。

class Calendar implements ServiceLocatorAwareInterface{ 

    protected $serviceLocator;

public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
    $this->serviceLocator = $serviceLocator;
}

public function getServiceLocator()
{
    return $this->serviceLocator;
}
/*
 * Create Calendar Sync Table
 */
 public function getCalendarSyncTable()
 {
     if (!$this->calendarSyncTable) {
         $sm = $this->getServiceLocator();
         $this->calendarSyncTable = $sm->get('Pro\Model\CalendarSync\CalendarSyncTable');
     }
     return $this->calendarSyncTable;  
 }   

需要改变我在控制器中调用它的方式

$calendar = $this->getServiceLocator()>get('Pro\Model\GoogleCalendar\Calendar');

1 个答案:

答案 0 :(得分:4)

如果要在任何类中使用ServiceLocator,只需实现ServiceLocatorAwareInterface即可。例如:

class SomeClass implements ServiceLocatorAwareInterface
{
    protected $serviceLocator;

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }

ZendFramework2将自动为您的类注入ServiceLocator实例。 阅读有关ServiceManager here

的更多信息