WP_CLI\Dispatcher
Subcommand::validate_args │ private │ WP-CLI 1.0
Validate the supplied arguments to the command. Throws warnings or errors if arguments are missing or invalid.
Метод класса: Subcommand{}
Хуков нет.
Возвращает
Массив. list of invalid $assoc_args keys to unset
Использование
// private - только в коде основоного (родительского) класса $result = $this->validate_args( $args, $assoc_args, $extra_args );
- $args(массив) (обязательный)
- .
- $assoc_args(массив) (обязательный)
- .
- $extra_args(массив) (обязательный)
- .
Код Subcommand::validate_args() Subcommand::validate args WP-CLI 2.13.0-alpha
private function validate_args( $args, $assoc_args, $extra_args ) {
$synopsis = $this->get_synopsis();
if ( ! $synopsis ) {
return [ [], $args, $assoc_args, $extra_args ];
}
$validator = new SynopsisValidator( $synopsis );
$cmd_path = implode( ' ', get_path( $this ) );
foreach ( $validator->get_unknown() as $token ) {
\WP_CLI::warning(
sprintf(
'The `%s` command has an invalid synopsis part: %s',
$cmd_path,
$token
)
);
}
if ( ! $validator->enough_positionals( $args ) ) {
$this->show_usage();
exit( 1 );
}
$unknown_positionals = $validator->unknown_positionals( $args );
if ( ! empty( $unknown_positionals ) ) {
\WP_CLI::error(
'Too many positional arguments: ' .
implode( ' ', $unknown_positionals )
);
}
$synopsis_spec = SynopsisParser::parse( $synopsis );
$i = 0;
$errors = [
'fatal' => [],
'warning' => [],
];
$mock_doc = [ $this->get_shortdesc(), '' ];
$mock_doc = array_merge( $mock_doc, explode( "\n", $this->get_longdesc() ) );
$mock_doc = '/**' . PHP_EOL . '* ' . implode( PHP_EOL . '* ', $mock_doc ) . PHP_EOL . '*/';
$docparser = new DocParser( $mock_doc );
foreach ( $synopsis_spec as $spec ) {
if ( 'positional' === $spec['type'] ) {
$spec_args = $docparser->get_arg_args( $spec['name'] );
if ( ! isset( $args[ $i ] ) ) {
if ( isset( $spec_args['default'] ) ) {
$args[ $i ] = $spec_args['default'];
}
}
if ( isset( $spec_args['options'] ) ) {
if ( ! empty( $spec['repeating'] ) ) {
do {
// phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict -- This is a loose comparison by design.
if ( isset( $args[ $i ] ) && ! in_array( $args[ $i ], $spec_args['options'] ) ) {
\WP_CLI::error( 'Invalid value specified for positional arg.' );
}
++$i;
} while ( isset( $args[ $i ] ) );
} elseif ( isset( $args[ $i ] ) && ! in_array( $args[ $i ], $spec_args['options'] ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict -- This is a loose comparison by design.
\WP_CLI::error( 'Invalid value specified for positional arg.' );
}
}
++$i;
} elseif ( 'assoc' === $spec['type'] ) {
$spec_args = $docparser->get_param_args( $spec['name'] );
if ( ! isset( $assoc_args[ $spec['name'] ] ) && ! isset( $extra_args[ $spec['name'] ] ) ) {
if ( isset( $spec_args['default'] ) ) {
$assoc_args[ $spec['name'] ] = $spec_args['default'];
}
}
if ( isset( $assoc_args[ $spec['name'] ] ) && isset( $spec_args['options'] ) ) {
$value = $assoc_args[ $spec['name'] ];
$options = $spec_args['options'];
// phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict -- This is a loose comparison by design.
if ( ! in_array( $value, $options ) ) {
// Try whether it might be a comma-separated list of multiple values.
$values = array_map( 'trim', explode( ',', $value ) );
$count = count( $values );
if (
$count > 1
&&
count(
array_filter(
$values,
static function ( $value ) use ( $options ) {
return in_array( $value, $options, true );
}
)
) === $count
) {
continue;
}
$errors['fatal'][ $spec['name'] ] = "Invalid value specified for '{$spec['name']}'";
}
}
}
}
list( $returned_errors, $to_unset ) = $validator->validate_assoc(
array_merge( \WP_CLI::get_config(), $extra_args, $assoc_args )
);
foreach ( [ 'fatal', 'warning' ] as $error_type ) {
$errors[ $error_type ] = array_merge( $errors[ $error_type ], $returned_errors[ $error_type ] );
}
if ( 'help' !== $this->name ) {
foreach ( $validator->unknown_assoc( $assoc_args ) as $key ) {
$suggestion = Utils\get_suggestion(
$key,
$this->get_parameters( $synopsis_spec ),
$threshold = 2
);
$errors['fatal'][] = sprintf(
'unknown --%s parameter%s',
$key,
! empty( $suggestion ) ? PHP_EOL . "Did you mean '--{$suggestion}'?" : ''
);
}
}
if ( ! empty( $errors['fatal'] ) ) {
$out = 'Parameter errors:';
foreach ( $errors['fatal'] as $key => $error ) {
$out .= "\n {$error}";
$desc = $docparser->get_param_desc( $key );
if ( '' !== $desc ) {
$out .= " ({$desc})";
}
}
\WP_CLI::error( $out );
}
array_map( '\\WP_CLI::warning', $errors['warning'] );
return [ $to_unset, $args, $assoc_args, $extra_args ];
}