对端点的每个REST调用都会运行rest_api_init

时间:2019-02-25 作者:Tjeerd

我注意到,每次调用rest端点时,都会调用register\\u rest\\u route方法。我制作了以下非常简单的插件,以确保我不是罪魁祸首,但它具有相同的行为,这就是插件:

/**
 * Plugin Name: WP REST test
 * Description: Example
 * Author: Tester
 * Author URI:
 * Version: 1.0.0.
 * Plugin URI:
 * License: MIT
 */

class RestController extends WP_REST_Controller {
    public function register_routes()
    {
        register_rest_route(\'example/v1\', \'/read\', array(
            array(
                \'methods\' => WP_REST_Server::READABLE,
                \'callback\' => array($this, \'readdata\'),
                \'args\' => array(),
            )
        ));
    }
    function readdata(){
        return new WP_REST_Response(\'OK\');
    }
}
function register_rest_controller() {
    error_log("Register RestController", 0);
    $controller = new RestController();
    $controller->register_routes();
}
add_action( \'rest_api_init\', \'register_rest_controller\' ); 
正如您所看到的,它唯一的功能是在调用端点时返回字符串“OK”。当我打电话时http://localhost/wp-json/example/v1/read 它工作正常,但每次访问此url时,“Register RestController”文本都会写入日志。这意味着每次调用端点时,都会注册rest路由。然而,“注册”一词意味着这种情况只能发生一次。

这是通常的行为,还是我做错了?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

这是预期的行为。当您向REST API注册路由时,您正在为当前请求注册路由。这是WordPress的标准模式。这和register_post_type(), register_taxonomy(), register_setting(), register_nav_menu(), register_widget() 等等注册的操作和筛选器add_action()add_filter() 也已注册—和火—对于每个请求。

当然,当您考虑到这些函数都没有向数据库写入任何内容时,这是有意义的,这是这些函数只能运行一次的唯一方法。当您考虑到从数据库中读取这些函数的值只会使它们变慢时,这就更有意义了。更不用说,传递给这些函数的参数通常是类或类方法的实例,而这些是您无法保存到数据库中的。