Как я могу использовать serviceLocator вне контроллера

0

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

В конце я хотел бы получить доступ к функциям в "классе 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');
Теги:
zend-framework
zend-framework2

1 ответ

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 здесь

  • 0
    Я получаю нулевое значение, когда я вар менеджера службы дампа. Я разместил свой код выше. Есть ли дополнительный шаг, который я пропускаю?
  • 0
    Как вы называете Calendar ? Если вы напишите только new Calendar() , то да, $this->serviceLocator будет нулевым. Вам нужно добавить свой Calendar в конфигурацию ServiceManager, например, 'invokables' => array('Calendar' => 'Application\Service\Calendar') , тогда это волшебство сработает. Проверьте этот ответ для более подробной информации
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню