刚刚看laravel 手册 withCallback() 方法是什么意思?有什么作用~

新手上路,请多包涵

clipboard.png
这里 的 withCallback 方法有什么作用?

阅读 2.5k
1 个回答

平常如果是自己写的话,一般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请求,相信会有不错的收获。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题