ZF2 not in database validator (adapter problem)

Discussion in 'PHP' started by barnaki, 20 Jan 2014.

  1. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    добрый день . пытаюсь использовать not in database валидатор в zf 2.
    таким образом .( все по мануалу)
    config/autoload/global.php
    PHP:
    <?php
    return array(
        
    'db' => array(
            
    'driver' => 'Pdo',
            
    'dsn' => 'mysql:dbname=networks;host=localhost',
        ),
        
    'service_manager' => array(
            
    'factories' => array(
                
    'Zend\Db\Adapter\Adapter' => function ($serviceManager) {
                        
    $adapterFactory = new Zend\Db\Adapter\AdapterServiceFactory();
                        
    $adapter $adapterFactory->createService($serviceManager);

                        \
    Zend\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter);

                        return 
    $adapter;
                    }
            ),
        ),
    );
    и сама модель
    PHP:
    $inputFilter->add($factory->createInput(array(
                        
    'name' => 'email',
                        
    'filters' => array(
                            array(
    'name' => 'StringTrim'),
                        ),
                        
    'validators' => array(
                            array(
                                
    'name' => 'Db\NoRecordExists',
                                
    'options' => array(
                                    
    'table' => 'user',
                                    
    'field' => 'email',
                                    
    'adapter' => \Zend\Db\TableGateway\Feature\GlobalAdapterFeature::getStaticAdapter()
                                )
                                ),
                            ),
                            array(
                                
    'name' => 'EmailAddress',
                            ),
                            array(
                                
    'name' => 'StringLength',
                                
    'options' => array(
                                    
    'encoding' => 'UTF-8',
                                    
    'min' => 3,
                                    
    'max' => 90,
                                ),
                            ),
                ))); 
    получаю ошибку
    вопрос как получить адаптер базы в модели. 100 способов перепробывал ни один не сработал. подскажите кто делал
     
  2. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    получилось только так.
    config/global.php
    HTML:
    <?php
    
    if (!defined('CONFIG_DIR')) {
        define('CONFIG_DIR',__DIR__);
    }
    return array(
        'db' => array(
            'driver' => 'Pdo',
            'dsn' => 'mysql:dbname=networks;host=localhost',
        ),
        'service_manager' => array(
            'factories' => array(
                'Zend\Db\Adapter\Adapter' => function ($serviceManager) {
                        $adapterFactory = new Zend\Db\Adapter\AdapterServiceFactory();
                        $adapter = $adapterFactory->createService($serviceManager);
    
                        \Zend\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter);
    
                        return $adapter;
                    }
            ),
        ),
        'adapter' => array(
            'settings' => array(
                'driver'  => 'Mysqli',
                'database' => 'networks',
                'username' => 'root',
                'password' => 'root'
            )
    ));
    в модели добавляем метод
    HTML:
     public function getAdapter()
        {
    
            $config = new \Zend\Config\Config(include CONFIG_DIR . '/global.php');
            $adapter = new \Zend\Db\Adapter\Adapter (array(
                'driver' => $config->adapter["settings"]->driver,
                'database' => $config->adapter["settings"]->database,
                'username' => $config->adapter["settings"]->username,
                'password' => $config->adapter["settings"]->password,
            ));
            return $adapter;
    
        }
    и делаем
    HTML:
    $inputFilter->add($factory->createInput(array(
                    'name' => 'email',
                    'filters' => array(
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'Db\NoRecordExists',
                            'options' => array(
                                'table' => 'user',
                                'field' => 'email',
                                'adapter' => $this->getAdapter()
                            ))
                    ,
                        array(
                            'name' => 'EmailAddress'),
                        array(
                            'name' => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min' => 3,
                                'max' => 90,
                            )),
    
                    ))));
    я понимаю что это дикий костыль. но в сети куча костылей и похуже.
    если кто то найдет способ получше который лично у него заработает.
    ( способ из мануала не работает) дайте знать пожалуйста.
    ps модераторы. тэг
    PHP:
     удаляет слэши из неймспейсов.
     
    #2 barnaki, 20 Jan 2014
    Last edited: 20 Jan 2014
  3. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    А ты не узнавал почему способ из мана не пашет..?
    Ну то есть в коде фреймверка не смотрел.?
     
  4. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    я смотрел. в мануале написано пользоваться статическим адаптором для таких случаев. я смотрел этот метод он работает с другим который по идее должен что то возвращать. но тот метод который должен что то возвращать пустой. возможно версия не стабильна. возможно что я не так понял. я день на это потратил. в принципе в гугле все пользуются разными костылями которые громоздки и работают то тут то там. так что пока что так.