将服务注入自定义验证器

时间:2017-09-28 13:32:00

标签: php validation zend-framework2

尝试创建自定义验证程序,我需要使用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 difined');
        }

        $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;
      }
    }
}

1 个答案:

答案 0 :(得分:0)

我需要在我的一个项目的验证器中传递服务管理器。 遇到与您相同的问题,我决定将服务管理器作为options数组中的参数传递。 这可能是代码:

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, ...);
}