Я ломал голову сейчас на протяжении большей части двух дней. Я использую Zend Apigility для создания приложения RESTful web API. Apigility строит свое приложение с использованием ZF2.
Я создал собственный класс, который я использую в своем API.
Я хотел бы прочитать некоторые автоматически загруженные данные конфигурации, чтобы установить соединение с сервером memcache. Файл, который загружается в диспетчер служб:
memcache.config.local.php:
return array(
'memcache' => array(
'server' => '10.70.2.86',
'port' => '11211',
),
);
Мой пользовательский класс, который вызывают мои службы REST, называется checkAuth:
checkAuth.php:
namespace equiAuth\V1\Rest\AuthTools;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class checkAuth implements ServiceLocatorAwareInterface{
protected $services;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->services = $serviceLocator;
}
public function getServiceLocator()
{
return $this->services;
}
public function userAuths() {
//** Some Code
$config = $this->getServiceLocator()->get('config');
// **
}
}
Я полагаю, что внедряю диспетчер служб в класс из моего module.config.php с помощью следующего кода:
'service_manager' => array(
'invokables' => array(
'checkAuth' => 'equiAuth\V1\Rest\AuthTools\checkAuth',
),
),
Когда я нажимаю на код, когда пытаюсь прочитать ‘config’ из метода get объекта ServiceLocator, я получаю следующую ошибку:
Неустранимая ошибка: вызов функции-члена get () для необъекта
Я знаю, что что-то упустил, но я не могу на всю жизнь понять, что.
Дайте вашему классу API, который позволит вам «настроить» конфигурацию из клиентского кода. Это может быть через конструктор или
публичный сеттер.
namespace equiAuth\V1\Rest\AuthTools;
class CheckAuth
{
protected $config;
public function __construct(array $config = array())
{
$this->setConfig($config);
}
public function setConfig(array $config)
{
$this->config = $config;
}
public function doStuff()
{
$server = $this->config['server'];
}
}
Чтобы «настроить» конфигурацию, вам также необходимо создать класс фабрики услуг. Идея фабрики состоит в том, чтобы предоставить вам область для внедрения конфигурации в сервис; с обновлениями CheckAuth
выше, теперь мы можем сделать это очень легко.
namespace equiAuth\V1\Rest\AuthTools;
use equiAuth\V1\Rest\AuthTools\CheckAuth;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
class CheckAuthFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$config = $serviceLocator->get('config');
return new CheckAuth($config['memcache']);
}
}
Наконец, измените зарегистрированный сервис с менеджером сервиса; изменение здесь является формой сервисного ключа invokables
в factories
как нам нужно зарегистрировать
над фабрикой его создать.
// module.config.php
'service_manager' => array(
'factories' => array(
'checkAuth' => 'equiAuth\V1\Rest\AuthTools\CheckAuthFactory',
),
),
ZF2 также использует Контейнер ServiceManager.
Ваш код верен вообще, но
Чтобы автоматически внедрить сервис-локатор в вашем классе, вам просто нужно использовать
$checkAuth = $this->getServiceLocator()->get('checkAuth');
тогда вы можете позвонить
$checkAuth->userAuths();
и должен работать.
Если вы попытаетесь использовать:
$checkAuth = new \equiAuth\V1\Rest\AuthTools\checkAuth();
$checkAuth->userAuths(); //error
Не будет работать, потому что то, что внедряет serviceLocator в ваш класс, это просто
ServiceManager, как только вы используете serviceManager, вам нужно быть евангелистом с ними.
Но если вы попробуете:
$checkAuth = new \equiAuth\V1\Rest\AuthTools\checkAuth();
$checkAuth->setServiceLocator($serviceLocator)
//get $serviceLocator from ServiceManager Container
$checkAuth->userAuths();
Тоже будет работать
Хорошая работа!