2017-02-17 76 views
1

我在尋找一個驗證器的配置,我在表單上設置,通常我可以向服務管理器請求,但我。「M如何做到這一點從深側的驗證那麼這將是一個窗體上使用不明在使用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 return 


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

在這種情況下,工廠使用setter來注入已配置的LDAP適配器。在驗證器類中創建此setter,該類將指針存儲在屬性中,以便稍後在isValid方法中使用。

不要忘了工廠添加到您的模塊配置:

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

確保您檢索服務管理器驗證爲廠家踢當creating a form via factory,通過factory-backed form extension等。爲你做到這一點。

延伸閱讀:依賴注入的概念,Service Manager

+0

如果我的'公共職能的CreateService(ServiceLocatorInterface $服務定位器)內的斷點'它永遠不會被調用和$ ldapAdapter是空的結果。我想我正在搞亂module.config.php /從根本上不理解ZF2如何在該級別工作。 – user49438

相關問題