Использование менеджера сервисов в пользовательском Validator с Zend Framework 2 для получения конфигураций

Я пытаюсь получить конфигурацию для валидатора, который я устанавливаю в форме. Как правило, я могу запросить это у менеджера сервиса, но мне неясно, как это сделать изнутри валидатора, который затем собирается для использования в форме.

Коды скелета, которые я имею до сих пор:

<?php
namespace Application\Validator;
use Zend\Validator\AbstractValidator;
use Auth\Model\LdapAdapter;class MyAccount extends AbstractValidator
{const INVALID_ACCOUNT = 'invalid_account';protected $messageTemplates = array(
self::INVALID_ACCOUNT => "'%value%' does not appear to be a valid account.");public function isValid($value)
{
$this->setValue($value);

// What I'd like to get:
$ldapConfig = $this->getServiceLocator()->get('Config')['ldap'];
$ldapAdapter = new LdapAdapter($ldapConfig['server'],
$ldapConfig['backup_server'],
$ldapConfig['bind_dn'],
$ldapConfig['bind_password'],
$ldapConfig['search_dn']);
$result = $ldapAdapter->getInfoForUser('sampleUsername');
// do something with the result and then returnreturn true;
}}

1

Решение

Ваш валидатор зависит от настроенного адаптера LDAP. Создайте фабрику для вашего валидатора, которая извлекает требуемый адаптер, либо запрашивая его у менеджера сервисов, либо создавая его самостоятельно.

namespace Application\Factory\Adapter;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Auth\Model\LdapAdapter;

class AccountValidator implements FactoryInterface
{

public function createService(ServiceLocatorInterface $serviceLocator)
{
// create configured LDAP adapter
$ldapConfig = $serviceLocator->get('Config')['ldap'];

$ldapAdapter = new LdapAdapter(
$ldapConfig['server'],
$ldapConfig['backup_server'],
$ldapConfig['bind_dn'],
$ldapConfig['bind_password'],
$ldapConfig['search_dn']
);

// create validator
$validator = new \Application\Validator\AccountValidator();

// inject LDAP adapter dependency
$validator->setLdapAdapter($ldapAdapter);

return $validator;
}
}

В этом случае фабрика использует установщик для внедрения настроенного адаптера LDAP. Создайте этот установщик внутри вашего класса валидатора, который хранит указатель на адаптер внутри атрибута для последующего использования внутри isValid метод.

Не забудьте добавить фабрику в конфигурацию вашего модуля:

[...]
'validators' => [
'factories' => [
'account' => 'Application\Factory\Adapter\AccountValidator',
],
],

Убедитесь, что вы извлекаете валидатор из сервисного менеджера для фабрики. создание формы через фабрику, от заводское расширение формы, и т.д. это делает для вас.

Дальнейшее чтение: Концепция внедрения зависимости, Сервис-менеджер

1

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

Других решений пока нет …

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