WP_CLI\Dispatcher

Subcommand::validate_args()privateWP-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() WP-CLI 2.8.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 ] ) );
				} else {
					// 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++;
		} 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 ];
}