REST API: Refactor `WP_REST_Server::dispatch()` to make internal logic reusable.
#50244 aims to introduce batch processing in the REST API. An important feature is the ability to enforce that all requests have valid data before executing the route callbacks in "pre-validate" mode. This necessitates splitting `WP_REST_Server::dispatch()` into two methods so the batch controller can determine the request handler to perform pre-validation and then respond to the requests. The two new methods, `match_request_to_handler` and `respond_to_request`, have a public visibility, but are marked as `@access private`. This is to allow for iteration on the batch controller to happen in the Gutenberg repository. Developers should not rely upon these methods, their visibility may change in the future. See #50244. Props andraganescu, zieladam, TimothyBlynJacobs. Built from https://develop.svn.wordpress.org/trunk@48947 git-svn-id: http://core.svn.wordpress.org/trunk@48709 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
93b8183327
commit
a63708debf
|
@ -911,6 +911,48 @@ class WP_REST_Server {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$error = null;
|
||||||
|
$matched = $this->match_request_to_handler( $request );
|
||||||
|
|
||||||
|
if ( is_wp_error( $matched ) ) {
|
||||||
|
return $this->error_to_response( $matched );
|
||||||
|
}
|
||||||
|
|
||||||
|
list( $route, $handler ) = $matched;
|
||||||
|
|
||||||
|
if ( ! is_callable( $handler['callback'] ) ) {
|
||||||
|
$error = new WP_Error(
|
||||||
|
'rest_invalid_handler',
|
||||||
|
__( 'The handler for the route is invalid' ),
|
||||||
|
array( 'status' => 500 )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_wp_error( $error ) ) {
|
||||||
|
$check_required = $request->has_valid_params();
|
||||||
|
if ( is_wp_error( $check_required ) ) {
|
||||||
|
$error = $check_required;
|
||||||
|
} else {
|
||||||
|
$check_sanitized = $request->sanitize_params();
|
||||||
|
if ( is_wp_error( $check_sanitized ) ) {
|
||||||
|
$error = $check_sanitized;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->respond_to_request( $request, $route, $handler, $error );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches a request object to it's handler.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @since 5.6.0
|
||||||
|
*
|
||||||
|
* @param WP_REST_Request $request The request object.
|
||||||
|
* @return array|WP_Error The route and request handler on success or a WP_Error instance if no handler was found.
|
||||||
|
*/
|
||||||
|
public function match_request_to_handler( $request ) {
|
||||||
$method = $request->get_method();
|
$method = $request->get_method();
|
||||||
$path = $request->get_route();
|
$path = $request->get_route();
|
||||||
|
|
||||||
|
@ -957,17 +999,9 @@ class WP_REST_Server {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! is_callable( $callback ) ) {
|
if ( ! is_callable( $callback ) ) {
|
||||||
$response = new WP_Error(
|
return array( $route, $handler );
|
||||||
'rest_invalid_handler',
|
|
||||||
__( 'The handler for the route is invalid' ),
|
|
||||||
array( 'status' => 500 )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! is_wp_error( $response ) ) {
|
|
||||||
// Remove the redundant preg_match argument.
|
|
||||||
unset( $args[0] );
|
|
||||||
|
|
||||||
$request->set_url_params( $args );
|
$request->set_url_params( $args );
|
||||||
$request->set_attributes( $handler );
|
$request->set_attributes( $handler );
|
||||||
|
|
||||||
|
@ -981,17 +1015,31 @@ class WP_REST_Server {
|
||||||
|
|
||||||
$request->set_default_params( $defaults );
|
$request->set_default_params( $defaults );
|
||||||
|
|
||||||
$check_required = $request->has_valid_params();
|
return array( $route, $handler );
|
||||||
if ( is_wp_error( $check_required ) ) {
|
|
||||||
$response = $check_required;
|
|
||||||
} else {
|
|
||||||
$check_sanitized = $request->sanitize_params();
|
|
||||||
if ( is_wp_error( $check_sanitized ) ) {
|
|
||||||
$response = $check_sanitized;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new WP_Error(
|
||||||
|
'rest_no_route',
|
||||||
|
__( 'No route was found matching the URL and request method' ),
|
||||||
|
array( 'status' => 404 )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatches the request to the callback handler.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @since 5.6.0
|
||||||
|
*
|
||||||
|
* @param WP_REST_Request $request The request object.
|
||||||
|
* @param array $handler The matched route handler.
|
||||||
|
* @param string $route The matched route regex.
|
||||||
|
* @param WP_Error|null $response The current error object if any.
|
||||||
|
*
|
||||||
|
* @return WP_REST_Response
|
||||||
|
*/
|
||||||
|
public function respond_to_request( $request, $route, $handler, $response ) {
|
||||||
/**
|
/**
|
||||||
* Filters the response before executing any REST API callbacks.
|
* Filters the response before executing any REST API callbacks.
|
||||||
*
|
*
|
||||||
|
@ -1010,9 +1058,8 @@ class WP_REST_Server {
|
||||||
*/
|
*/
|
||||||
$response = apply_filters( 'rest_request_before_callbacks', $response, $handler, $request );
|
$response = apply_filters( 'rest_request_before_callbacks', $response, $handler, $request );
|
||||||
|
|
||||||
if ( ! is_wp_error( $response ) ) {
|
|
||||||
// Check permission specified on the route.
|
// Check permission specified on the route.
|
||||||
if ( ! empty( $handler['permission_callback'] ) ) {
|
if ( ! is_wp_error( $response ) && ! empty( $handler['permission_callback'] ) ) {
|
||||||
$permission = call_user_func( $handler['permission_callback'], $request );
|
$permission = call_user_func( $handler['permission_callback'], $request );
|
||||||
|
|
||||||
if ( is_wp_error( $permission ) ) {
|
if ( is_wp_error( $permission ) ) {
|
||||||
|
@ -1025,7 +1072,6 @@ class WP_REST_Server {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! is_wp_error( $response ) ) {
|
if ( ! is_wp_error( $response ) ) {
|
||||||
/**
|
/**
|
||||||
|
@ -1047,7 +1093,7 @@ class WP_REST_Server {
|
||||||
if ( null !== $dispatch_result ) {
|
if ( null !== $dispatch_result ) {
|
||||||
$response = $dispatch_result;
|
$response = $dispatch_result;
|
||||||
} else {
|
} else {
|
||||||
$response = call_user_func( $callback, $request );
|
$response = call_user_func( $handler['callback'], $request );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1084,16 +1130,6 @@ class WP_REST_Server {
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return $this->error_to_response(
|
|
||||||
new WP_Error(
|
|
||||||
'rest_no_route',
|
|
||||||
__( 'No route was found matching the URL and request method' ),
|
|
||||||
array( 'status' => 404 )
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns if an error occurred during most recent JSON encode/decode.
|
* Returns if an error occurred during most recent JSON encode/decode.
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
*
|
*
|
||||||
* @global string $wp_version
|
* @global string $wp_version
|
||||||
*/
|
*/
|
||||||
$wp_version = '5.6-alpha-48946';
|
$wp_version = '5.6-alpha-48947';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||||
|
|
Loading…
Reference in New Issue