我注意到,每次调用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路由。然而,“注册”一词意味着这种情况只能发生一次。
这是通常的行为,还是我做错了?
最合适的回答,由SO网友:Jacob Peattie 整理而成
这是预期的行为。当您向REST API注册路由时,您正在为当前请求注册路由。这是WordPress的标准模式。这和register_post_type()
, register_taxonomy()
, register_setting()
, register_nav_menu()
, register_widget()
等等注册的操作和筛选器add_action()
和add_filter()
也已注册—和火—对于每个请求。
当然,当您考虑到这些函数都没有向数据库写入任何内容时,这是有意义的,这是这些函数只能运行一次的唯一方法。当您考虑到从数据库中读取这些函数的值只会使它们变慢时,这就更有意义了。更不用说,传递给这些函数的参数通常是类或类方法的实例,而这些是您无法保存到数据库中的。