MediaWiki master
StringDef.php
Go to the documentation of this file.
1<?php
2
4
9
24class StringDef extends TypeDef {
25
34 public const PARAM_MAX_BYTES = 'param-max-bytes';
35
46 public const PARAM_MAX_CHARS = 'param-max-chars';
47
48 protected $allowEmptyWhenRequired = false;
49
56 public function __construct( Callbacks $callbacks, array $options = [] ) {
57 parent::__construct( $callbacks );
58
59 $this->allowEmptyWhenRequired = !empty( $options['allowEmptyWhenRequired'] );
60 }
61
62 public function validate( $name, $value, array $settings, array $options ) {
63 if ( !$this->allowEmptyWhenRequired && $value === '' &&
64 !empty( $settings[ParamValidator::PARAM_REQUIRED] )
65 ) {
66 $this->failure( 'missingparam', $name, $value, $settings, $options );
67 }
68
69 $len = strlen( $value );
70 if ( isset( $settings[self::PARAM_MAX_BYTES] ) && $len > $settings[self::PARAM_MAX_BYTES] ) {
71 $this->failure(
72 $this->failureMessage( 'maxbytes', [
73 'maxbytes' => $settings[self::PARAM_MAX_BYTES] ?? null,
74 'maxchars' => $settings[self::PARAM_MAX_CHARS] ?? null,
75 ] )->numParams( $settings[self::PARAM_MAX_BYTES], $len ),
76 $name, $value, $settings, $options
77 );
78 }
79 $len = mb_strlen( $value, 'UTF-8' );
80 if ( isset( $settings[self::PARAM_MAX_CHARS] ) && $len > $settings[self::PARAM_MAX_CHARS] ) {
81 $this->failure(
82 $this->failureMessage( 'maxchars', [
83 'maxbytes' => $settings[self::PARAM_MAX_BYTES] ?? null,
84 'maxchars' => $settings[self::PARAM_MAX_CHARS] ?? null,
85 ] )->numParams( $settings[self::PARAM_MAX_CHARS], $len ),
86 $name, $value, $settings, $options
87 );
88 }
89
90 return $value;
91 }
92
93 public function checkSettings( string $name, $settings, array $options, array $ret ): array {
94 $ret = parent::checkSettings( $name, $settings, $options, $ret );
95
96 $ret['allowedKeys'] = array_merge( $ret['allowedKeys'], [
97 self::PARAM_MAX_BYTES, self::PARAM_MAX_CHARS,
98 ] );
99
100 $maxb = $settings[self::PARAM_MAX_BYTES] ?? PHP_INT_MAX;
101 if ( !is_int( $maxb ) ) {
102 $ret['issues'][self::PARAM_MAX_BYTES] = 'PARAM_MAX_BYTES must be an integer, got '
103 . gettype( $maxb );
104 } elseif ( $maxb < 0 ) {
105 $ret['issues'][self::PARAM_MAX_BYTES] = 'PARAM_MAX_BYTES must be greater than or equal to 0';
106 }
107
108 $maxc = $settings[self::PARAM_MAX_CHARS] ?? PHP_INT_MAX;
109 if ( !is_int( $maxc ) ) {
110 $ret['issues'][self::PARAM_MAX_CHARS] = 'PARAM_MAX_CHARS must be an integer, got '
111 . gettype( $maxc );
112 } elseif ( $maxc < 0 ) {
113 $ret['issues'][self::PARAM_MAX_CHARS] = 'PARAM_MAX_CHARS must be greater than or equal to 0';
114 }
115
116 if ( !$this->allowEmptyWhenRequired && !empty( $settings[ParamValidator::PARAM_REQUIRED] ) ) {
117 if ( $maxb === 0 ) {
118 $ret['issues'][] = 'PARAM_REQUIRED is set, allowEmptyWhenRequired is not set, and '
119 . 'PARAM_MAX_BYTES is 0. That\'s impossible to satisfy.';
120 }
121 if ( $maxc === 0 ) {
122 $ret['issues'][] = 'PARAM_REQUIRED is set, allowEmptyWhenRequired is not set, and '
123 . 'PARAM_MAX_CHARS is 0. That\'s impossible to satisfy.';
124 }
125 }
126
127 return $ret;
128 }
129
130 public function getParamInfo( $name, array $settings, array $options ) {
131 $info = parent::getParamInfo( $name, $settings, $options );
132
133 $info['maxbytes'] = $settings[self::PARAM_MAX_BYTES] ?? null;
134 $info['maxchars'] = $settings[self::PARAM_MAX_CHARS] ?? null;
135
136 return $info;
137 }
138
139 public function getHelpInfo( $name, array $settings, array $options ) {
140 $info = parent::getHelpInfo( $name, $settings, $options );
141
142 if ( isset( $settings[self::PARAM_MAX_BYTES] ) ) {
143 $info[self::PARAM_MAX_BYTES] = MessageValue::new( 'paramvalidator-help-type-string-maxbytes' )
144 ->numParams( $settings[self::PARAM_MAX_BYTES] );
145 }
146 if ( isset( $settings[self::PARAM_MAX_CHARS] ) ) {
147 $info[self::PARAM_MAX_CHARS] = MessageValue::new( 'paramvalidator-help-type-string-maxchars' )
148 ->numParams( $settings[self::PARAM_MAX_CHARS] );
149 }
150
151 return $info;
152 }
153
154}
Value object representing a message for i18n.
Service for formatting and validating API parameters.
const PARAM_REQUIRED
(bool) Indicate that the parameter is required.
Type definition for string types.
Definition StringDef.php:24
__construct(Callbacks $callbacks, array $options=[])
Definition StringDef.php:56
validate( $name, $value, array $settings, array $options)
Validate the value.
Definition StringDef.php:62
getParamInfo( $name, array $settings, array $options)
Describe parameter settings in a machine-readable format.
checkSettings(string $name, $settings, array $options, array $ret)
Validate a parameter settings array.
Definition StringDef.php:93
const PARAM_MAX_BYTES
(integer) Maximum length of a string in bytes.
Definition StringDef.php:34
getHelpInfo( $name, array $settings, array $options)
Describe parameter settings in human-readable format.
const PARAM_MAX_CHARS
(integer) Maximum length of a string in characters (Unicode codepoints).
Definition StringDef.php:46
Base definition for ParamValidator types.
Definition TypeDef.php:19
failureMessage( $code, array $data=null, $suffix=null)
Create a DataMessageValue representing a failure.
Definition TypeDef.php:96
failure( $failure, $name, $value, array $settings, array $options, $fatal=true)
Record a failure message.
Definition TypeDef.php:61
Interface defining callbacks needed by ParamValidator.
Definition Callbacks.php:21