1<?php
2
3/**
4 * @see       https://github.com/laminas/laminas-validator for the canonical source repository
5 * @copyright https://github.com/laminas/laminas-validator/blob/master/COPYRIGHT.md
6 * @license   https://github.com/laminas/laminas-validator/blob/master/LICENSE.md New BSD License
7 */
8
9namespace Laminas\Validator;
10
11use Interop\Container\ContainerInterface;
12use Laminas\I18n\Validator as I18nValidator;
13use Laminas\ServiceManager\AbstractPluginManager;
14use Laminas\ServiceManager\Exception\InvalidServiceException;
15use Laminas\ServiceManager\Factory\InvokableFactory;
16
17class ValidatorPluginManager extends AbstractPluginManager
18{
19    /**
20     * Default set of aliases
21     *
22     * @var array
23     */
24    protected $aliases = [
25        'alnum'                    => I18nValidator\Alnum::class,
26        'Alnum'                    => I18nValidator\Alnum::class,
27        'alpha'                    => I18nValidator\Alpha::class,
28        'Alpha'                    => I18nValidator\Alpha::class,
29        'barcode'                  => Barcode::class,
30        'Barcode'                  => Barcode::class,
31        'between'                  => Between::class,
32        'Between'                  => Between::class,
33        'bitwise'                  => Bitwise::class,
34        'Bitwise'                  => Bitwise::class,
35        'callback'                 => Callback::class,
36        'Callback'                 => Callback::class,
37        'creditcard'               => CreditCard::class,
38        'creditCard'               => CreditCard::class,
39        'CreditCard'               => CreditCard::class,
40        'csrf'                     => Csrf::class,
41        'Csrf'                     => Csrf::class,
42        'date'                     => Date::class,
43        'Date'                     => Date::class,
44        'datestep'                 => DateStep::class,
45        'dateStep'                 => DateStep::class,
46        'DateStep'                 => DateStep::class,
47        'datetime'                 => I18nValidator\DateTime::class,
48        'dateTime'                 => I18nValidator\DateTime::class,
49        'DateTime'                 => I18nValidator\DateTime::class,
50        'dbnorecordexists'         => Db\NoRecordExists::class,
51        'dbNoRecordExists'         => Db\NoRecordExists::class,
52        'DbNoRecordExists'         => Db\NoRecordExists::class,
53        'dbrecordexists'           => Db\RecordExists::class,
54        'dbRecordExists'           => Db\RecordExists::class,
55        'DbRecordExists'           => Db\RecordExists::class,
56        'digits'                   => Digits::class,
57        'Digits'                   => Digits::class,
58        'emailaddress'             => EmailAddress::class,
59        'emailAddress'             => EmailAddress::class,
60        'EmailAddress'             => EmailAddress::class,
61        'explode'                  => Explode::class,
62        'Explode'                  => Explode::class,
63        'filecount'                => File\Count::class,
64        'fileCount'                => File\Count::class,
65        'FileCount'                => File\Count::class,
66        'filecrc32'                => File\Crc32::class,
67        'fileCrc32'                => File\Crc32::class,
68        'FileCrc32'                => File\Crc32::class,
69        'fileexcludeextension'     => File\ExcludeExtension::class,
70        'fileExcludeExtension'     => File\ExcludeExtension::class,
71        'FileExcludeExtension'     => File\ExcludeExtension::class,
72        'fileexcludemimetype'      => File\ExcludeMimeType::class,
73        'fileExcludeMimeType'      => File\ExcludeMimeType::class,
74        'FileExcludeMimeType'      => File\ExcludeMimeType::class,
75        'fileexists'               => File\Exists::class,
76        'fileExists'               => File\Exists::class,
77        'FileExists'               => File\Exists::class,
78        'fileextension'            => File\Extension::class,
79        'fileExtension'            => File\Extension::class,
80        'FileExtension'            => File\Extension::class,
81        'filefilessize'            => File\FilesSize::class,
82        'fileFilesSize'            => File\FilesSize::class,
83        'FileFilesSize'            => File\FilesSize::class,
84        'filehash'                 => File\Hash::class,
85        'fileHash'                 => File\Hash::class,
86        'FileHash'                 => File\Hash::class,
87        'fileimagesize'            => File\ImageSize::class,
88        'fileImageSize'            => File\ImageSize::class,
89        'FileImageSize'            => File\ImageSize::class,
90        'fileiscompressed'         => File\IsCompressed::class,
91        'fileIsCompressed'         => File\IsCompressed::class,
92        'FileIsCompressed'         => File\IsCompressed::class,
93        'fileisimage'              => File\IsImage::class,
94        'fileIsImage'              => File\IsImage::class,
95        'FileIsImage'              => File\IsImage::class,
96        'filemd5'                  => File\Md5::class,
97        'fileMd5'                  => File\Md5::class,
98        'FileMd5'                  => File\Md5::class,
99        'filemimetype'             => File\MimeType::class,
100        'fileMimeType'             => File\MimeType::class,
101        'FileMimeType'             => File\MimeType::class,
102        'filenotexists'            => File\NotExists::class,
103        'fileNotExists'            => File\NotExists::class,
104        'FileNotExists'            => File\NotExists::class,
105        'filesha1'                 => File\Sha1::class,
106        'fileSha1'                 => File\Sha1::class,
107        'FileSha1'                 => File\Sha1::class,
108        'filesize'                 => File\Size::class,
109        'fileSize'                 => File\Size::class,
110        'FileSize'                 => File\Size::class,
111        'fileupload'               => File\Upload::class,
112        'fileUpload'               => File\Upload::class,
113        'FileUpload'               => File\Upload::class,
114        'fileuploadfile'           => File\UploadFile::class,
115        'fileUploadFile'           => File\UploadFile::class,
116        'FileUploadFile'           => File\UploadFile::class,
117        'filewordcount'            => File\WordCount::class,
118        'fileWordCount'            => File\WordCount::class,
119        'FileWordCount'            => File\WordCount::class,
120        'float'                    => I18nValidator\IsFloat::class,
121        'Float'                    => I18nValidator\IsFloat::class,
122        'gpspoint'                 => GpsPoint::class,
123        'gpsPoint'                 => GpsPoint::class,
124        'GpsPoint'                 => GpsPoint::class,
125        'greaterthan'              => GreaterThan::class,
126        'greaterThan'              => GreaterThan::class,
127        'GreaterThan'              => GreaterThan::class,
128        'hex'                      => Hex::class,
129        'Hex'                      => Hex::class,
130        'hostname'                 => Hostname::class,
131        'Hostname'                 => Hostname::class,
132        'iban'                     => Iban::class,
133        'Iban'                     => Iban::class,
134        'identical'                => Identical::class,
135        'Identical'                => Identical::class,
136        'inarray'                  => InArray::class,
137        'inArray'                  => InArray::class,
138        'InArray'                  => InArray::class,
139        'int'                      => I18nValidator\IsInt::class,
140        'Int'                      => I18nValidator\IsInt::class,
141        'ip'                       => Ip::class,
142        'Ip'                       => Ip::class,
143        'isbn'                     => Isbn::class,
144        'Isbn'                     => Isbn::class,
145        'isfloat'                  => I18nValidator\IsFloat::class,
146        'isFloat'                  => I18nValidator\IsFloat::class,
147        'IsFloat'                  => I18nValidator\IsFloat::class,
148        'isinstanceof'             => IsInstanceOf::class,
149        'isInstanceOf'             => IsInstanceOf::class,
150        'IsInstanceOf'             => IsInstanceOf::class,
151        'isint'                    => I18nValidator\IsInt::class,
152        'isInt'                    => I18nValidator\IsInt::class,
153        'IsInt'                    => I18nValidator\IsInt::class,
154        'lessthan'                 => LessThan::class,
155        'lessThan'                 => LessThan::class,
156        'LessThan'                 => LessThan::class,
157        'notempty'                 => NotEmpty::class,
158        'notEmpty'                 => NotEmpty::class,
159        'NotEmpty'                 => NotEmpty::class,
160        'phonenumber'              => I18nValidator\PhoneNumber::class,
161        'phoneNumber'              => I18nValidator\PhoneNumber::class,
162        'PhoneNumber'              => I18nValidator\PhoneNumber::class,
163        'postcode'                 => I18nValidator\PostCode::class,
164        'postCode'                 => I18nValidator\PostCode::class,
165        'PostCode'                 => I18nValidator\PostCode::class,
166        'regex'                    => Regex::class,
167        'Regex'                    => Regex::class,
168        'sitemapchangefreq'        => Sitemap\Changefreq::class,
169        'sitemapChangefreq'        => Sitemap\Changefreq::class,
170        'SitemapChangefreq'        => Sitemap\Changefreq::class,
171        'sitemaplastmod'           => Sitemap\Lastmod::class,
172        'sitemapLastmod'           => Sitemap\Lastmod::class,
173        'SitemapLastmod'           => Sitemap\Lastmod::class,
174        'sitemaploc'               => Sitemap\Loc::class,
175        'sitemapLoc'               => Sitemap\Loc::class,
176        'SitemapLoc'               => Sitemap\Loc::class,
177        'sitemappriority'          => Sitemap\Priority::class,
178        'sitemapPriority'          => Sitemap\Priority::class,
179        'SitemapPriority'          => Sitemap\Priority::class,
180        'stringlength'             => StringLength::class,
181        'stringLength'             => StringLength::class,
182        'StringLength'             => StringLength::class,
183        'step'                     => Step::class,
184        'Step'                     => Step::class,
185        'timezone'                 => Timezone::class,
186        'Timezone'                 => Timezone::class,
187        'uri'                      => Uri::class,
188        'Uri'                      => Uri::class,
189        'uuid'                     => Uuid::class,
190        'Uuid'                     => Uuid::class,
191
192        // Legacy Zend Framework aliases
193        \Zend\I18n\Validator\Alnum::class => I18nValidator\Alnum::class,
194        \Zend\I18n\Validator\Alpha::class => I18nValidator\Alpha::class,
195        \Zend\Validator\Barcode::class => Barcode::class,
196        \Zend\Validator\Between::class => Between::class,
197        \Zend\Validator\Bitwise::class => Bitwise::class,
198        \Zend\Validator\Callback::class => Callback::class,
199        \Zend\Validator\CreditCard::class => CreditCard::class,
200        \Zend\Validator\Csrf::class => Csrf::class,
201        \Zend\Validator\DateStep::class => DateStep::class,
202        \Zend\Validator\Date::class => Date::class,
203        \Zend\I18n\Validator\DateTime::class => I18nValidator\DateTime::class,
204        \Zend\Validator\Db\NoRecordExists::class => Db\NoRecordExists::class,
205        \Zend\Validator\Db\RecordExists::class => Db\RecordExists::class,
206        \Zend\Validator\Digits::class => Digits::class,
207        \Zend\Validator\EmailAddress::class => EmailAddress::class,
208        \Zend\Validator\Explode::class => Explode::class,
209        \Zend\Validator\File\Count::class => File\Count::class,
210        \Zend\Validator\File\Crc32::class => File\Crc32::class,
211        \Zend\Validator\File\ExcludeExtension::class => File\ExcludeExtension::class,
212        \Zend\Validator\File\ExcludeMimeType::class => File\ExcludeMimeType::class,
213        \Zend\Validator\File\Exists::class => File\Exists::class,
214        \Zend\Validator\File\Extension::class => File\Extension::class,
215        \Zend\Validator\File\FilesSize::class => File\FilesSize::class,
216        \Zend\Validator\File\Hash::class => File\Hash::class,
217        \Zend\Validator\File\ImageSize::class => File\ImageSize::class,
218        \Zend\Validator\File\IsCompressed::class => File\IsCompressed::class,
219        \Zend\Validator\File\IsImage::class => File\IsImage::class,
220        \Zend\Validator\File\Md5::class => File\Md5::class,
221        \Zend\Validator\File\MimeType::class => File\MimeType::class,
222        \Zend\Validator\File\NotExists::class => File\NotExists::class,
223        \Zend\Validator\File\Sha1::class => File\Sha1::class,
224        \Zend\Validator\File\Size::class => File\Size::class,
225        \Zend\Validator\File\Upload::class => File\Upload::class,
226        \Zend\Validator\File\UploadFile::class => File\UploadFile::class,
227        \Zend\Validator\File\WordCount::class => File\WordCount::class,
228        \Zend\I18n\Validator\IsFloat::class => I18nValidator\IsFloat::class,
229        \Zend\Validator\GpsPoint::class => GpsPoint::class,
230        \Zend\Validator\GreaterThan::class => GreaterThan::class,
231        \Zend\Validator\Hex::class => Hex::class,
232        \Zend\Validator\Hostname::class => Hostname::class,
233        \Zend\Validator\Iban::class => Iban::class,
234        \Zend\Validator\Identical::class => Identical::class,
235        \Zend\Validator\InArray::class => InArray::class,
236        \Zend\I18n\Validator\IsInt::class => I18nValidator\IsInt::class,
237        \Zend\Validator\Ip::class => Ip::class,
238        \Zend\Validator\Isbn::class => Isbn::class,
239        \Zend\Validator\IsInstanceOf::class => IsInstanceOf::class,
240        \Zend\Validator\LessThan::class => LessThan::class,
241        \Zend\Validator\NotEmpty::class => NotEmpty::class,
242        \Zend\I18n\Validator\PhoneNumber::class => I18nValidator\PhoneNumber::class,
243        \Zend\I18n\Validator\PostCode::class => I18nValidator\PostCode::class,
244        \Zend\Validator\Regex::class => Regex::class,
245        \Zend\Validator\Sitemap\Changefreq::class => Sitemap\Changefreq::class,
246        \Zend\Validator\Sitemap\Lastmod::class => Sitemap\Lastmod::class,
247        \Zend\Validator\Sitemap\Loc::class => Sitemap\Loc::class,
248        \Zend\Validator\Sitemap\Priority::class => Sitemap\Priority::class,
249        \Zend\Validator\StringLength::class => StringLength::class,
250        \Zend\Validator\Step::class => Step::class,
251        \Zend\Validator\Timezone::class => Timezone::class,
252        \Zend\Validator\Uri::class => Uri::class,
253        \Zend\Validator\Uuid::class => Uuid::class,
254
255        // v2 normalized FQCNs
256        'zendvalidatorbarcode' => Barcode::class,
257        'zendvalidatorbetween' => Between::class,
258        'zendvalidatorbitwise' => Bitwise::class,
259        'zendvalidatorcallback' => Callback::class,
260        'zendvalidatorcreditcard' => CreditCard::class,
261        'zendvalidatorcsrf' => Csrf::class,
262        'zendvalidatordatestep' => DateStep::class,
263        'zendvalidatordate' => Date::class,
264        'zendvalidatordbnorecordexists' => Db\NoRecordExists::class,
265        'zendvalidatordbrecordexists' => Db\RecordExists::class,
266        'zendvalidatordigits' => Digits::class,
267        'zendvalidatoremailaddress' => EmailAddress::class,
268        'zendvalidatorexplode' => Explode::class,
269        'zendvalidatorfilecount' => File\Count::class,
270        'zendvalidatorfilecrc32' => File\Crc32::class,
271        'zendvalidatorfileexcludeextension' => File\ExcludeExtension::class,
272        'zendvalidatorfileexcludemimetype' => File\ExcludeMimeType::class,
273        'zendvalidatorfileexists' => File\Exists::class,
274        'zendvalidatorfileextension' => File\Extension::class,
275        'zendvalidatorfilefilessize' => File\FilesSize::class,
276        'zendvalidatorfilehash' => File\Hash::class,
277        'zendvalidatorfileimagesize' => File\ImageSize::class,
278        'zendvalidatorfileiscompressed' => File\IsCompressed::class,
279        'zendvalidatorfileisimage' => File\IsImage::class,
280        'zendvalidatorfilemd5' => File\Md5::class,
281        'zendvalidatorfilemimetype' => File\MimeType::class,
282        'zendvalidatorfilenotexists' => File\NotExists::class,
283        'zendvalidatorfilesha1' => File\Sha1::class,
284        'zendvalidatorfilesize' => File\Size::class,
285        'zendvalidatorfileupload' => File\Upload::class,
286        'zendvalidatorfileuploadfile' => File\UploadFile::class,
287        'zendvalidatorfilewordcount' => File\WordCount::class,
288        'zendvalidatorgpspoint' => GpsPoint::class,
289        'zendvalidatorgreaterthan' => GreaterThan::class,
290        'zendvalidatorhex' => Hex::class,
291        'zendvalidatorhostname' => Hostname::class,
292        'zendi18nvalidatoralnum' => I18nValidator\Alnum::class,
293        'zendi18nvalidatoralpha' => I18nValidator\Alpha::class,
294        'zendi18nvalidatordatetime' => I18nValidator\DateTime::class,
295        'zendi18nvalidatorisfloat' => I18nValidator\IsFloat::class,
296        'zendi18nvalidatorisint' => I18nValidator\IsInt::class,
297        'zendi18nvalidatorphonenumber' => I18nValidator\PhoneNumber::class,
298        'zendi18nvalidatorpostcode' => I18nValidator\PostCode::class,
299        'zendvalidatoriban' => Iban::class,
300        'zendvalidatoridentical' => Identical::class,
301        'zendvalidatorinarray' => InArray::class,
302        'zendvalidatorip' => Ip::class,
303        'zendvalidatorisbn' => Isbn::class,
304        'zendvalidatorisinstanceof' => IsInstanceOf::class,
305        'zendvalidatorlessthan' => LessThan::class,
306        'zendvalidatornotempty' => NotEmpty::class,
307        'zendvalidatorregex' => Regex::class,
308        'zendvalidatorsitemapchangefreq' => Sitemap\Changefreq::class,
309        'zendvalidatorsitemaplastmod' => Sitemap\Lastmod::class,
310        'zendvalidatorsitemaploc' => Sitemap\Loc::class,
311        'zendvalidatorsitemappriority' => Sitemap\Priority::class,
312        'zendvalidatorstringlength' => StringLength::class,
313        'zendvalidatorstep' => Step::class,
314        'zendvalidatortimezone' => Timezone::class,
315        'zendvalidatoruri' => Uri::class,
316        'zendvalidatoruuid' => Uuid::class,
317    ];
318
319    /**
320     * Default set of factories
321     *
322     * @var array
323     */
324    protected $factories = [
325        I18nValidator\Alnum::class             => InvokableFactory::class,
326        I18nValidator\Alpha::class             => InvokableFactory::class,
327        Barcode::class                         => InvokableFactory::class,
328        Between::class                         => InvokableFactory::class,
329        Bitwise::class                         => InvokableFactory::class,
330        Callback::class                        => InvokableFactory::class,
331        CreditCard::class                      => InvokableFactory::class,
332        Csrf::class                            => InvokableFactory::class,
333        DateStep::class                        => InvokableFactory::class,
334        Date::class                            => InvokableFactory::class,
335        I18nValidator\DateTime::class          => InvokableFactory::class,
336        Db\NoRecordExists::class               => InvokableFactory::class,
337        Db\RecordExists::class                 => InvokableFactory::class,
338        Digits::class                          => InvokableFactory::class,
339        EmailAddress::class                    => InvokableFactory::class,
340        Explode::class                         => InvokableFactory::class,
341        File\Count::class                      => InvokableFactory::class,
342        File\Crc32::class                      => InvokableFactory::class,
343        File\ExcludeExtension::class           => InvokableFactory::class,
344        File\ExcludeMimeType::class            => InvokableFactory::class,
345        File\Exists::class                     => InvokableFactory::class,
346        File\Extension::class                  => InvokableFactory::class,
347        File\FilesSize::class                  => InvokableFactory::class,
348        File\Hash::class                       => InvokableFactory::class,
349        File\ImageSize::class                  => InvokableFactory::class,
350        File\IsCompressed::class               => InvokableFactory::class,
351        File\IsImage::class                    => InvokableFactory::class,
352        File\Md5::class                        => InvokableFactory::class,
353        File\MimeType::class                   => InvokableFactory::class,
354        File\NotExists::class                  => InvokableFactory::class,
355        File\Sha1::class                       => InvokableFactory::class,
356        File\Size::class                       => InvokableFactory::class,
357        File\Upload::class                     => InvokableFactory::class,
358        File\UploadFile::class                 => InvokableFactory::class,
359        File\WordCount::class                  => InvokableFactory::class,
360        I18nValidator\IsFloat::class           => InvokableFactory::class,
361        GpsPoint::class                        => InvokableFactory::class,
362        GreaterThan::class                     => InvokableFactory::class,
363        Hex::class                             => InvokableFactory::class,
364        Hostname::class                        => InvokableFactory::class,
365        Iban::class                            => InvokableFactory::class,
366        Identical::class                       => InvokableFactory::class,
367        InArray::class                         => InvokableFactory::class,
368        I18nValidator\IsInt::class             => InvokableFactory::class,
369        Ip::class                              => InvokableFactory::class,
370        Isbn::class                            => InvokableFactory::class,
371        I18nValidator\IsFloat::class           => InvokableFactory::class,
372        IsInstanceOf::class                    => InvokableFactory::class,
373        I18nValidator\IsInt::class             => InvokableFactory::class,
374        LessThan::class                        => InvokableFactory::class,
375        NotEmpty::class                        => InvokableFactory::class,
376        I18nValidator\PhoneNumber::class       => InvokableFactory::class,
377        I18nValidator\PostCode::class          => InvokableFactory::class,
378        Regex::class                           => InvokableFactory::class,
379        Sitemap\Changefreq::class              => InvokableFactory::class,
380        Sitemap\Lastmod::class                 => InvokableFactory::class,
381        Sitemap\Loc::class                     => InvokableFactory::class,
382        Sitemap\Priority::class                => InvokableFactory::class,
383        StringLength::class                    => InvokableFactory::class,
384        Step::class                            => InvokableFactory::class,
385        Timezone::class                        => InvokableFactory::class,
386        Uri::class                             => InvokableFactory::class,
387        Uuid::class                            => InvokableFactory::class,
388
389        // v2 canonical FQCNs
390
391        'laminasvalidatorbarcodecode25interleaved' => InvokableFactory::class,
392        'laminasvalidatorbarcodecode25'            => InvokableFactory::class,
393        'laminasvalidatorbarcodecode39ext'         => InvokableFactory::class,
394        'laminasvalidatorbarcodecode39'            => InvokableFactory::class,
395        'laminasvalidatorbarcodecode93ext'         => InvokableFactory::class,
396        'laminasvalidatorbarcodecode93'            => InvokableFactory::class,
397        'laminasvalidatorbarcodeean12'             => InvokableFactory::class,
398        'laminasvalidatorbarcodeean13'             => InvokableFactory::class,
399        'laminasvalidatorbarcodeean14'             => InvokableFactory::class,
400        'laminasvalidatorbarcodeean18'             => InvokableFactory::class,
401        'laminasvalidatorbarcodeean2'              => InvokableFactory::class,
402        'laminasvalidatorbarcodeean5'              => InvokableFactory::class,
403        'laminasvalidatorbarcodeean8'              => InvokableFactory::class,
404        'laminasvalidatorbarcodegtin12'            => InvokableFactory::class,
405        'laminasvalidatorbarcodegtin13'            => InvokableFactory::class,
406        'laminasvalidatorbarcodegtin14'            => InvokableFactory::class,
407        'laminasvalidatorbarcodeidentcode'         => InvokableFactory::class,
408        'laminasvalidatorbarcodeintelligentmail'   => InvokableFactory::class,
409        'laminasvalidatorbarcodeissn'              => InvokableFactory::class,
410        'laminasvalidatorbarcodeitf14'             => InvokableFactory::class,
411        'laminasvalidatorbarcodeleitcode'          => InvokableFactory::class,
412        'laminasvalidatorbarcodeplanet'            => InvokableFactory::class,
413        'laminasvalidatorbarcodepostnet'           => InvokableFactory::class,
414        'laminasvalidatorbarcoderoyalmail'         => InvokableFactory::class,
415        'laminasvalidatorbarcodesscc'              => InvokableFactory::class,
416        'laminasvalidatorbarcodeupca'              => InvokableFactory::class,
417        'laminasvalidatorbarcodeupce'              => InvokableFactory::class,
418        'laminasvalidatorbarcode'                  => InvokableFactory::class,
419        'laminasvalidatorbetween'                  => InvokableFactory::class,
420        'laminasvalidatorbitwise'                  => InvokableFactory::class,
421        'laminasvalidatorcallback'                 => InvokableFactory::class,
422        'laminasvalidatorcreditcard'               => InvokableFactory::class,
423        'laminasvalidatorcsrf'                     => InvokableFactory::class,
424        'laminasvalidatordatestep'                 => InvokableFactory::class,
425        'laminasvalidatordate'                     => InvokableFactory::class,
426        'laminasvalidatordbnorecordexists'         => InvokableFactory::class,
427        'laminasvalidatordbrecordexists'           => InvokableFactory::class,
428        'laminasvalidatordigits'                   => InvokableFactory::class,
429        'laminasvalidatoremailaddress'             => InvokableFactory::class,
430        'laminasvalidatorexplode'                  => InvokableFactory::class,
431        'laminasvalidatorfilecount'                => InvokableFactory::class,
432        'laminasvalidatorfilecrc32'                => InvokableFactory::class,
433        'laminasvalidatorfileexcludeextension'     => InvokableFactory::class,
434        'laminasvalidatorfileexcludemimetype'      => InvokableFactory::class,
435        'laminasvalidatorfileexists'               => InvokableFactory::class,
436        'laminasvalidatorfileextension'            => InvokableFactory::class,
437        'laminasvalidatorfilefilessize'            => InvokableFactory::class,
438        'laminasvalidatorfilehash'                 => InvokableFactory::class,
439        'laminasvalidatorfileimagesize'            => InvokableFactory::class,
440        'laminasvalidatorfileiscompressed'         => InvokableFactory::class,
441        'laminasvalidatorfileisimage'              => InvokableFactory::class,
442        'laminasvalidatorfilemd5'                  => InvokableFactory::class,
443        'laminasvalidatorfilemimetype'             => InvokableFactory::class,
444        'laminasvalidatorfilenotexists'            => InvokableFactory::class,
445        'laminasvalidatorfilesha1'                 => InvokableFactory::class,
446        'laminasvalidatorfilesize'                 => InvokableFactory::class,
447        'laminasvalidatorfileupload'               => InvokableFactory::class,
448        'laminasvalidatorfileuploadfile'           => InvokableFactory::class,
449        'laminasvalidatorfilewordcount'            => InvokableFactory::class,
450        'laminasvalidatorgpspoint'                 => InvokableFactory::class,
451        'laminasvalidatorgreaterthan'              => InvokableFactory::class,
452        'laminasvalidatorhex'                      => InvokableFactory::class,
453        'laminasvalidatorhostname'                 => InvokableFactory::class,
454        'laminasi18nvalidatoralnum'                => InvokableFactory::class,
455        'laminasi18nvalidatoralpha'                => InvokableFactory::class,
456        'laminasi18nvalidatordatetime'             => InvokableFactory::class,
457        'laminasi18nvalidatorisfloat'              => InvokableFactory::class,
458        'laminasi18nvalidatorisint'                => InvokableFactory::class,
459        'laminasi18nvalidatorphonenumber'          => InvokableFactory::class,
460        'laminasi18nvalidatorpostcode'             => InvokableFactory::class,
461        'laminasvalidatoriban'                     => InvokableFactory::class,
462        'laminasvalidatoridentical'                => InvokableFactory::class,
463        'laminasvalidatorinarray'                  => InvokableFactory::class,
464        'laminasvalidatorip'                       => InvokableFactory::class,
465        'laminasvalidatorisbn'                     => InvokableFactory::class,
466        'laminasvalidatorisinstanceof'             => InvokableFactory::class,
467        'laminasvalidatorlessthan'                 => InvokableFactory::class,
468        'laminasvalidatornotempty'                 => InvokableFactory::class,
469        'laminasvalidatorregex'                    => InvokableFactory::class,
470        'laminasvalidatorsitemapchangefreq'        => InvokableFactory::class,
471        'laminasvalidatorsitemaplastmod'           => InvokableFactory::class,
472        'laminasvalidatorsitemaploc'               => InvokableFactory::class,
473        'laminasvalidatorsitemappriority'          => InvokableFactory::class,
474        'laminasvalidatorstringlength'             => InvokableFactory::class,
475        'laminasvalidatorstep'                     => InvokableFactory::class,
476        'laminasvalidatortimezone'                 => InvokableFactory::class,
477        'laminasvalidatoruri'                      => InvokableFactory::class,
478        'laminasvalidatoruuid'                     => InvokableFactory::class,
479    ];
480
481    /**
482     * Whether or not to share by default; default to false (v2)
483     *
484     * @var bool
485     */
486    protected $shareByDefault = false;
487
488    /**
489     * Whether or not to share by default; default to false (v3)
490     *
491     * @var bool
492     */
493    protected $sharedByDefault = false;
494
495    /**
496     * Default instance type
497     *
498     * @var string
499     */
500    protected $instanceOf = ValidatorInterface::class;
501
502    /**
503     * Constructor
504     *
505     * After invoking parent constructor, add an initializer to inject the
506     * attached translator, if any, to the currently requested helper.
507     *
508     * {@inheritDoc}
509     */
510    public function __construct($configOrContainerInstance = null, array $v3config = [])
511    {
512        parent::__construct($configOrContainerInstance, $v3config);
513
514        $this->addInitializer([$this, 'injectTranslator']);
515        $this->addInitializer([$this, 'injectValidatorPluginManager']);
516    }
517
518    /**
519     * Validate plugin instance
520     *
521     * {@inheritDoc}
522     */
523    public function validate($plugin)
524    {
525        if (! $plugin instanceof $this->instanceOf) {
526            throw new InvalidServiceException(sprintf(
527                '%s expects only to create instances of %s; %s is invalid',
528                get_class($this),
529                $this->instanceOf,
530                is_object($plugin) ? get_class($plugin) : gettype($plugin)
531            ));
532        }
533    }
534
535    /**
536     * For v2 compatibility: validate plugin instance.
537     *
538     * Proxies to `validate()`.
539     *
540     * @param mixed $plugin
541     * @throws Exception\RuntimeException
542     */
543    public function validatePlugin($plugin)
544    {
545        try {
546            $this->validate($plugin);
547        } catch (InvalidServiceException $e) {
548            throw new Exception\RuntimeException(sprintf(
549                'Plugin of type %s is invalid; must implement %s',
550                is_object($plugin) ? get_class($plugin) : gettype($plugin),
551                ValidatorInterface::class
552            ), $e->getCode(), $e);
553        }
554    }
555
556    /**
557     * Inject a validator instance with the registered translator
558     *
559     * @param  ContainerInterface|object $first
560     * @param  ContainerInterface|object $second
561     * @return void
562     */
563    public function injectTranslator($first, $second)
564    {
565        if ($first instanceof ContainerInterface) {
566            $container = $first;
567            $validator = $second;
568        } else {
569            $container = $second;
570            $validator = $first;
571        }
572
573        // V2 means we pull it from the parent container
574        if ($container === $this && method_exists($container, 'getServiceLocator') && $container->getServiceLocator()) {
575            $container = $container->getServiceLocator();
576        }
577
578        if ($validator instanceof Translator\TranslatorAwareInterface) {
579            if ($container && $container->has('MvcTranslator')) {
580                $validator->setTranslator($container->get('MvcTranslator'));
581            }
582        }
583    }
584
585    /**
586     * Inject a validator plugin manager
587     *
588     * @param  ContainerInterface|object $first
589     * @param  ContainerInterface|object $second
590     * @return void
591     */
592    public function injectValidatorPluginManager($first, $second)
593    {
594        if ($first instanceof ContainerInterface) {
595            $container = $first;
596            $validator = $second;
597        } else {
598            $container = $second;
599            $validator = $first;
600        }
601        if ($validator instanceof ValidatorPluginManagerAwareInterface) {
602            $validator->setValidatorPluginManager($this);
603        }
604    }
605}
606