尝试创建自定义验证器,我需要使用其
isValid
方法中的服务。
如何注入该服务?
作为替代方案,我可以尝试从验证器方法中实例化服务,但服务构造函数需要一个控制器对象,而我当时没有。
这是验证器:
class OrderNumber extends AbstractValidator
{
const EXIST = 'exist';
/**
* @var array
*
*/
protected $messageTemplates = array();
/**
* @var element name
*
*/
private $element = null;
/**
* Options for this validator
*
* @var array
*/
protected $options = array(
'manager' => null, // set entity manager to find if value already exist
);
/**
* Constructor
*
* @param array|Traversable|int $options OPTIONAL
*/
public function __construct($options)
{
$this->messageTemplates = array(
self::INVALID => \Application\Util\Translator::translate("This value is required"),
);
if (!isset($options['element']) || empty($options['element'])) {
throw new \Exception('Element name is not defined');
}
$this->element = $options['element'];
parent::__construct();
}
/**
* Returns true if and only if no record where found in Autoself for the value.
*
* @param string $value
* @return bool
*/
public function isValid($value, array $context = null) {
$isAvailable = $vehiculeService->orderNumberIsAvailable($value);
if ($vehiculeService->orderNumberIsAvailable($value)) {
return true;
} else {
return false;
}
}
}
我需要通过我的一个项目的验证器中的服务经理。 遇到与您相同的问题,我决定将服务管理器作为选项数组中的参数传递。 这是可能的代码:
public function __construct(array $options)
{
$this->db_manager = $options['db_manager'];
parent::__construct($options);
}
这里,db_manager 是一个服务管理器,仅包含我需要的内容。原则上,我从来没有得到全面的服务经理。
然后在表单中使用该验证器。为此,在表单的类中,我定义了一个方法 getInputFilterSpecification ,其中包含以下数组:
'recordSource' => [
'name' => 'recordSource',
'required' => true,
'filters' => [
[
'name' => 'StripTags'
],
[
'name' => 'StringTrim'
],
[
'name' => 'SbmPdf\Model\Filter\NomTable',
'options' => [
'db_manager' => $this->db_manager
]
]
],
'validators' => [
[
'name' => 'SbmPdf\Model\Validator\RecordSource',
'options' => [
'db_manager' => $this->db_manager,
'auth_userId' => $this->auth_userId
]
]
]
],
表格本身由工厂建造:
class DocumentPdfFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$db_manager = $serviceLocator->get('Sbm\DbManager');
$pdf = $serviceLocator->get(Tcpdf::class);
return new DocumentPdf($db_manager, ...);
}