Как использовать 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');
Если вы хотите использовать 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 здесь
Calendar
? Если вы напишите только new Calendar()
, то да, $this->serviceLocator
будет нулевым. Вам нужно добавить свой Calendar
в конфигурацию ServiceManager, например, 'invokables' => array('Calendar' => 'Application\Service\Calendar')
, тогда это волшебство сработает. Проверьте этот ответ для более подробной информации