平常如果是自己写的话,一般javascript会携带一个callback参数传给服务器端php,而php响应jsonp的话一般是如下格式: echo $callback.'('.$data.');'; 在laravel中,withCallback方法它里面只有一行,参数也就是客户端callback名,是一个字符串而已,也就是你看到的$request->input('callback'): return $this->setCallback($callback); 而setCallback方法如下: public function setCallback($callback = null) { if (null !== $callback) { // partially taken from http://www.geekality.net/2011/08/03/valid-javascript-identifier/ // partially taken from https://github.com/willdurand/JsonpCallbackValidator // JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details. // (c) William Durand <william.durand1@gmail.com> $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u'; $reserved = array( 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while', 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super', 'const', 'export', 'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false', ); $parts = explode('.', $callback); foreach ($parts as $part) { if (!preg_match($pattern, $part) || in_array($part, $reserved, true)) { throw new \InvalidArgumentException('The callback name is not valid.'); } } } $this->callback = $callback; return $this->update(); } 显然,他帮我们做了callback参数的合法性过滤, 最后的update会做相关的响应头设置,其实和平常一样的,并不神秘。如果不明白我在说什么,可以去了解下jsonp,以及php该如何响应jsonp请求,相信会有不错的收获。
平常如果是自己写的话,一般javascript会携带一个callback参数传给服务器端php,而php响应jsonp的话一般是如下格式:
在laravel中,
withCallback
方法它里面只有一行,参数也就是客户端callback名,是一个字符串而已,也就是你看到的$request->input('callback')
:而
setCallback
方法如下:显然,他帮我们做了callback参数的合法性过滤, 最后的update会做相关的响应头设置,其实和平常一样的,并不神秘。如果不明白我在说什么,可以去了解下jsonp,以及php该如何响应jsonp请求,相信会有不错的收获。