Validation ZF3 DBAdapter未进入表单验证
我已经按照以下配置了DBAdapter 在config/autoload/global.php中添加了以下代码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
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
]
],