2015-03-24 4 views
0

Как использовать Zend Framework Locator в модели? У меня есть класс, в котором я хотел бы использовать модель Table Gateway. Я последовал примеру альбома и хотел бы получить доступ к таблице за пределами контроллера. Однако, если я копирую и вставляю код из контроллера в класс, в котором я нуждаюсь, я получаю сообщение об ошибке (неопределенный метод: getServiceLocator()). Как использовать этот «класс» вне контроллера?Как использовать serviceLocator вне контроллера

В конце я хотел бы получить доступ к функциям в «классе 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'); 
+0

[Возможный дубликат] (http://stackoverflow.com/questions/12770966/service-locator-in-zend-framework-2) – AlexP

ответ

4

Если вы хотите использовать в любом поиска сервиса класса, просто реализовать 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

+0

я получаю нулевое значение, когда я Var свалку Менеджер по обслуживанию. Я разместил свой код выше. Есть ли еще один шаг, который мне не хватает? – Matt

+0

Как вы называете «Календарь»? Если вы пишете только «новый календарь()», то да, '$ this-> serviceLocator' будет пустым. Вам нужно добавить конфигурацию 'Calendar' в ServiceManager, например' 'invokables '=> array (' Calendar '=>' Application \ Service \ Calendar ')', тогда эта магия будет работать. Проверьте [этот ответ] (http://stackoverflow.com/a/12793595/1129939) для получения более подробной информации. –

+0

Входит ли этот массив в этот массив? К этому моменту я использовал module.conig только для маршрутизации и контроллера. 'controllers' => array ( 'invokables' => array ('Pro \ Model \ GoogleCalendar \ Calendar' => 'Pro \ Model \ GoogleCalendar \ Calendar') – Matt

Смежные вопросы