如何在Zend Framework 2中将db adapter设置为Validator RecordExists

Mac*_*iej 3 zend-framework2

我正在尝试将验证器RecordExists添加到我的表单中,但是我收到错误'no db adapter present'.如何将db adapter设置为此验证器?我使用骨架应用程序中的示例,我正在尝试做这样的事情(是的,我知道$ dbAdapter未定义:)我正在搜索解决方案如何将此变量更改为db adapter资源):

namespace Album\Model;

use Zend\InputFilter\Factory as InputFactory;     // <-- Add this import
use Zend\InputFilter\InputFilter;                 // <-- Add this import
use Zend\InputFilter\InputFilterAwareInterface;   // <-- Add this import
use Zend\InputFilter\InputFilterInterface;        // <-- Add this import

class Album implements InputFilterAwareInterface
{
    public $id;
    public $artist;
    public $title;
    protected $inputFilter;                       // <-- Add this variable

public function exchangeArray($data)
{
    $this->id     = (isset($data['id']))     ? $data['id']     : null;
    $this->artist = (isset($data['artist'])) ? $data['artist'] : null;
    $this->title  = (isset($data['title']))  ? $data['title']  : null;
}

// Add content to this method:
public function setInputFilter(InputFilterInterface $inputFilter)
{
    throw new \Exception("Not used");
}

public function getInputFilter()
{
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();
        $factory     = new InputFactory();

        $inputFilter->add($factory->createInput(array(
            'name'     => 'id',
            'required' => true,
            'filters'  => array(
                array('name' => 'Int'),
            ),
            'validators' => array(
                array(
                    'name'    => 'Db\RecordExists',
                    'options' => array(
                        'table' => 'album',
                        'field' => 'title',
                        'adapter' => $dbAdapter
                    ),
                ),
            ),
        )));

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}
Run Code Online (Sandbox Code Playgroud)

}

kie*_*iak 7

您可以创建"相册/模型/相册"工厂并将dbAdapter注入相册模型.

'service_manager' => array(
    'factories' => array(
        'Application/Model/Album' => function($sm){
            $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
            $album = new \Application\Model\Album();
            $album->setDbAdapter($dbAdapter);
            return $album;
        },
    ),
),
Run Code Online (Sandbox Code Playgroud)

现在我们必须实现setDbAdapter和getDbAdapter方法:

namespace Application\Model;

class Album
{
    public $id;
    public $artist;
    public $title;

    private $_dbAdapter;

    public function exchangeArray($data)
    {
        $this->id     = (isset($data['id'])) ? $data['id'] : null;
        $this->artist = (isset($data['artist'])) ? $data['artist'] : null;
        $this->title  = (isset($data['title'])) ? $data['title'] : null;
    }

    public function setDbAdapter($dbAdapter) {
        $this->_dbAdapter = $dbAdapter;
    }

    public function getDbAdapter() {
        return $this->_dbAdapter;
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过调用在输入过滤器中获取dbAdapter $this->getDbAdapter();

请记住通过ServiceLocator在控制器中获取Album模型,否则dbAdapter将无法在您的模型中使用.

$album = $this->getServiceLocator()->get('Application/Model/Album');
Run Code Online (Sandbox Code Playgroud)