ZF2 Получение информации о конфигурации автозагрузки в пользовательском классе

Я ломал голову сейчас на протяжении большей части двух дней. Я использую 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 () для необъекта

Я знаю, что что-то упустил, но я не могу на всю жизнь понять, что.

1

Решение

Дайте вашему классу 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',
),
),
0

Другие решения

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();

Тоже будет работать

Хорошая работа!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector