Validation ZF3 DBAdapter未进入表单验证

Validation ZF3 DBAdapter未进入表单验证,validation,zend-framework,adapter,zend-framework3,Validation,Zend Framework,Adapter,Zend Framework3,我已经按照以下配置了DBAdapter 在config/autoload/global.php中添加了以下代码 use Zend\Session\Storage\SessionArrayStorage; use Zend\Session\Validator\RemoteAddr; use Zend\Session\Validator\HttpUserAgent; use Zend\Db\Adapter; use Zend\ServiceManager\Factory\Inv

我已经按照以下配置了DBAdapter

在config/autoload/global.php中添加了以下代码

  use Zend\Session\Storage\SessionArrayStorage;
  use Zend\Session\Validator\RemoteAddr;
  use Zend\Session\Validator\HttpUserAgent;

  use Zend\Db\Adapter;
  use Zend\ServiceManager\Factory\InvokableFactory;


   return [
// Session configuration.
'session_config' => [
    'cookie_lifetime' => 60 * 60 * 1, // Session cookie will expire in 1 hour.
    'gc_maxlifetime' => 60 * 60 * 24 * 30, // How long to store session data on server (for 1 month).        
],
// Session manager configuration.
'session_manager' => [
    // Session validators (used for security).
    'validators' => [
        RemoteAddr::class,
        HttpUserAgent::class,
    ]
],
// Session storage configuration.
'session_storage' => [
    'type' => SessionArrayStorage::class
],

'service_manager' => [
    'abstract_factories' => [
        Adapter\AdapterAbstractServiceFactory::class,
    ],
    'factories' => [
        Adapter\AdapterInterface::class => Adapter\AdapterServiceFactory::class,
    ],
    'aliases' => [
        Adapter\Adapter::class => Adapter\AdapterInterface::class,
    ],  
],

];
之后,我在config/autoload/development.local.php中添加了以下代码

return [
'view_manager' => [
    'display_exceptions' => true,
],

'doctrine' => [
    'connection' => [
        'orm_default' => [
            'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'params' => [
                'host' => 'host',
                'user' => 'root',
                'password' => 'root',
                'dbname' => 'dbname',
            ]
        ],
    ],
],

'db' => [
    'adapters' => [
        'db' => [
            'driver' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
            'dsn' => 'mysql:dbname=dbname;host=host',
            'driver_options' => [
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
            ],
            'username' => 'root',
            'password' => 'root',
        ],
    ],
],
];
如何在控制器和窗体中获取DBAdapter

我想在表单筛选器中使用NoRecordExists验证。 像


分享您的想法或给我建议,在ZF3中全局配置DBAdapter。

您需要使用工厂将适配器注入表单中。我不确定是否支持使用条令的表单验证,因此我的示例将使用常规的zend db

简言之: 设置一个简单的工厂,并使用依赖项注入将适配器提供给表单

形式 表单需要接受依赖项,因此向构造函数添加一个参数:

/**
 * @var \Zend\Db\Adapter\Adapter
 */
private $dbAdapter;

/**
 * @param \Zend\Db\Adapter\Adapter $adapter
 */
public function __construct(\Zend\Db\Adapter\Adapter $adapter)
{
    $this->dbAdapter = $adapter;
}
工厂 最后: 在module.config.php中,您需要告诉应用程序调用工厂来设置表单:

'service_manager_' => [
    'factories' => [
        Form\MyForm::class => Factory\Form\MyFormFactory::class
    ]
],

如前所述,您可能会从尝试本主题的解释中获益。

您是否尝试过遵循zend文档?你是想用条令还是zend db?
namespace MyModule\Factory\Form;

use Zend\ServiceManager\Factory\FactoryInterface;

/**
 * Class MyFormFactory
 * @package MyModule\Factory\Form
 */
class MyFormFactory implements FactoryInterface
{
    /**
     * Create an object
     *
     * @param  ContainerInterface $container
     * @param  string             $requestedName
     * @param  null|array         $options
     *
     * @return object
     * @throws ServiceNotFoundException if unable to resolve the service.
     * @throws ServiceNotCreatedException if an exception is raised when
     *     creating a service.
     * @throws ContainerException if any other error occurs
     */
    public function __invoke(
        ContainerInterface $container,
        $requestedName,
        array $options = null
    ) {
        /** @var \Zend\Db\Adapter\AdapterInterface $adapter */
        $adapter  = $container->get(AdapterInterface::class);

        return new MyForm($adapter);
    }
}
'service_manager_' => [
    'factories' => [
        Form\MyForm::class => Factory\Form\MyFormFactory::class
    ]
],