2017-02-17 1 views
1

Ich suche nach der Konfiguration für einen Validator, den ich auf einem Formular einstelle. Normalerweise könnte ich dies beim Service Manager anfordern, aber ich . ist unklar, wie dies einen Validator in Seite von tief zu tun, die dann auf einem Formular verwendet werden werdenVerwenden des Service Managers in einem benutzerdefinierten Validator mit Zend Framework 2, um Konfigurationen zu erhalten

Die Art Skelett Code, den ich bis jetzt habe, ist:

<?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 return 


     return true; 
    } 


} 

Antwort

1

Ihr Validator hängt Auf einem konfigurierten LDAP-Adapter: Erstellen Sie eine Factory für Ihren Validierer, der den erforderlichen Adapter entweder durch Anforderung beim Service-Manager oder durch Erstellung des entsprechenden Adapters abruft selbst.

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; 
    } 
} 

In diesem Fall verwendet das Werk einen Setter, um einen konfigurierten LDAP-Adapter zu injizieren. Erstellen Sie diesen Setter innerhalb Ihrer Validator-Klasse, die den Zeiger auf den Adapter innerhalb eines Attributs zur späteren Verwendung innerhalb der isValid-Methode speichert.

Vergessen Sie nicht, um die Fabrik zu Ihrem Modul Config hinzuzufügen:.

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

Achten Sie darauf, den Validator vom Service-Manager abrufen für die Fabrik zu treten, wenn creating a form via factory, von factory-backed form extension, es usw. Tut das für dich.

Weiterführende Literatur: Konzept der Dependency Injection, Service Manager

+0

Wenn ich in dem 'öffentlichen Funktion Createbreakpoint (ServiceLocatorInterface $ Servicelocator)' Es wird nie genannt und der $ LDAPAdapter ist null als Ergebnis. Ich denke, ich vermassele etwas mit der module.config.php/im Grunde nicht zu verstehen, wie ZF2 auf dieser Ebene funktioniert. – user49438

Verwandte Themen