2013-02-27 1 views
2

Используя Zend Framework 2, я пытаюсь добавить валидатор DBRecordExists в форму в контроллере. Тем не менее, я постоянно получаю исключения, которые говорят «Нет адаптера базы данных». Я попробовал ответить на this question, но он, похоже, не работал. Кто-нибудь знает, что я делаю неправильно?ZF2 - Access DB Adapter в контроллере

AuthController.php

use Zend\Db\Adapter\Adapter; 
use Zend\Db\Adapter\AdapterAwareInterface; 

class AuthController extends AbstractActionController implements AdapterAwareInterface 
{ 
    /** 
    * @var Zend\Db\Adapter\Adapter 
    */ 
    protected $adapter; 

    /** 
    * Input email address to retrieve a lost password. 
    */ 
    public function lostpasswordAction() 
    { 
     // Create form 
     $form = new UserForm(); 

     // Perform validation 
     $request = $this->getRequest(); 
     if ($request->isPost()) { 
      $user = new User(); 
      $form->setInputFilter($user->getInputFilter()); 
      $form->setData($request->getPost()); 
      $recordValidator = new RecordExists(
       array(
        'table' => 'users', 
        'field' => 'email' 
      )); 
      $form->getInputFilter()->get('email')->getValidatorChain()->addValidator($recordValidator); 

      //code  
     } 
    } 

    public function setDbAdapter(Adapter $adapter) 
    { 
     $this->adapter = $adapter; 
    } 
} 

local.config.php

<?php 
return array(
    'di' => array(
     'instance' => array(
     'Zend\Db\Adapter\Adapter' => array(
       'parameters' => array(
        'driver' => 'Zend\Db\Adapter\Driver\Pdo\Pdo', 
       ), 
      ), 
      'Zend\Db\Adapter\Driver\Pdo\Pdo' => array(
       'parameters' => array(
        'connection' => 'Zend\Db\Adapter\Driver\Pdo\Connection', 
       ), 
      ), 
      'Zend\Db\Adapter\Driver\Pdo\Connection' => array(
       'parameters' => array(
        'connectionInfo' => array(
         'dsn'   => "mysql:dbname=owp;host=localhost", 
         'username'  => 'redacted', 
         'password'  => 'redacted', 
         'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''), 
        ), 
       ), 
      ), 
     ), 
    ), 
); 

module.config.php

<?php 
return array(
    //other config code 

    'di' => array(
      'Graduate\Controller\AuthController' => array(
       'parameters' => array(
        'adapter' => 'Zend\Db\Adapter\Adapter', 
       ), 
      ), 
    ), 
); 

ответ

0

че e проблема - ваш валидатор RecordExists нуждается в доступе к адаптеру DB.

Контроллер:

$recordValidator = new RecordExists(array(
    'table' => 'users', 
    'field' => 'email' 
)); 
// Need to pass to the validator.. 
$recordValidator->setAdapter($this->adapter); 

Очевидно, было бы лучше, чтобы создать экземпляр RecrodExists валидатора с помощью DI, и автоматически вводить адаптер DB

DI Config:

'Zend\Validator\Db\RecordExists' => array(
    'parameters' => array(
      'adapter' => 'Zend\Db\Adapter\Adapter', 
    ), 
), 
+0

Я пробовал оба этих решения. В первом решении говорилось, что $ this-> adapter имеет значение NULL. Второе решение меняет ситуацию, но на этот раз оно выдает другое исключение: «array_key_exists() ожидает, что параметр 2 будет массивом, null задан», вызванный в AbstractDb на 125, который вызывается Di в 401. – Lex

3

Попробуйте эту строку получить текущий адаптер БД в контроллере:

$this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'); 

или

Обратитесь по ссылке,

https://stackoverflow.com/a/17942232/2190889

С помощью этой ссылки вы можете установить адаптер DB в Заявлении/module.php и вы можете использовать в любом месте в вашей системе.

Я надеюсь, что эта помощь.

 Смежные вопросы

  • Нет связанных вопросов^_^