gpt4 book ai didi

php - 可以创建一个工厂来实例化自定义表单验证器吗?

转载 作者:行者123 更新时间:2023-12-01 22:38:15 25 4
gpt4 key购买 nike

(使用 Zend Framework 2.2.4)

我的验证器工厂在验证时似乎并不“存在”。如果我尝试从包含表单的 Controller 中实例化验证器,它反过来工作正常:

这有效...

$mycustomvalidator = $this->getServiceLocator()
->get('ValidatorManager')
->get('LDP_PinAvailable');

这是代码中其他设置的方式,我似乎找不到问题,希望避免打开 ZF2 源代码来理解。从文档的角度来看,这似乎是正确的。

模块配置

public function getValidatorConfig()
{
return array(
'abstract_factories' => array(
'\LDP\Form\Validator\ValidatorAbstractFactory',
),
);
}

工厂类

namespace LDP\Form\Validator;

use Zend\ServiceManager\AbstractFactoryInterface,
Zend\ServiceManager\ServiceLocatorInterface;

class ValidatorAbstractFactory implements AbstractFactoryInterface
{
public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
return stristr($requestedName, 'LDP_PinAvailable') !== false;
}


public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
{
// baked in for sake of conversation
$validator = new \LDP\Form\Validator\PinAvailable();

if( $validator instanceof DatabaseFormValidatorInterface )
$validator->setDatabase( $locator->get('mysql_slave') );

return $validator;
}
}

自定义验证器

namespace LDP\Form\Validator;

class PinAvailable extends \Zend\Validator\AbstractValidator implements DatabaseFormValidatorInterface
{

/**
* @var \Zend\Db\Sql\Sql
*/
private $database;

public function setDatabase( \Zend\Db\Sql\Sql $db )
{
$this->database = $db;
}


public function isValid( $value )
{
$DBA = $this->database->getAdapter();
// do the mixed database stuff here
return true;
}
}

最后,数组的表单字段验证器配置部分:

'pin' => array(
'required' => true,
'filters' => array(
array('name' => 'alnum'),
array('name' => 'stringtrim'),
),
'validators' => array(
array( 'name' => 'LDP_PinAvailable' )
),
),
),

将它们拼凑在一起,加载表单,并在提交时使用以下堆栈跟踪:

2013-10-28T17:09:35-04:00 ERR (3): Exception:
1: Zend\Validator\ValidatorPluginManager::get was unable to fetch or create an instance for LDP_PinAvailable
Trace:
#0 /Users/Saeven/Documents/workspace/Application/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php(103): Zend\ServiceManager\ServiceManager->get('LDP_PinAvailabl...', true)
#1 /Users/Saeven/Documents/workspace/Application/vendor/zendframework/zendframework/library/Zend/Validator/ValidatorChain.php(82): Zend\ServiceManager\AbstractPluginManager->get('LDP_PinAvailabl...', Array)

最佳答案

ValidatorPluginManager 扩展了 Zend\ServiceManager\AbstractPluginManager。 AbstractPluginManager 有一个名为“autoAddInvokableClass”的功能,默认情况下启用。

基本上,这意味着如果请求的服务名称无法由 ValidatorPluginManager 解析,它将检查该名称是否是有效的类名。如果是这样,它会根据需要简单地将它添加为可调用类,这当然意味着它永远不会回退到您的抽象工厂。

要规避这种行为,最简单的方法是简单地让您的抽象工厂响应实际上不解析为实际类名的服务名。

参见:AbstractPluginManager.php#L98-L100

关于php - 可以创建一个工厂来实例化自定义表单验证器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com