Viewing file: Request.php (23.26 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace Illuminate\Http;
use Closure; use ArrayAccess; use SplFileInfo; use RuntimeException; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Illuminate\Support\Traits\Macroable; use Illuminate\Contracts\Support\Arrayable; use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
class Request extends SymfonyRequest implements Arrayable, ArrayAccess { use Macroable;
/** * The decoded JSON content for the request. * * @var string */ protected $json;
/** * All of the converted files for the request. * * @var array */ protected $convertedFiles;
/** * The user resolver callback. * * @var \Closure */ protected $userResolver;
/** * The route resolver callback. * * @var \Closure */ protected $routeResolver;
/** * Create a new Illuminate HTTP request from server variables. * * @return static */ public static function capture() { static::enableHttpMethodParameterOverride();
return static::createFromBase(SymfonyRequest::createFromGlobals()); }
/** * Return the Request instance. * * @return $this */ public function instance() { return $this; }
/** * Get the request method. * * @return string */ public function method() { return $this->getMethod(); }
/** * Get the root URL for the application. * * @return string */ public function root() { return rtrim($this->getSchemeAndHttpHost().$this->getBaseUrl(), '/'); }
/** * Get the URL (no query string) for the request. * * @return string */ public function url() { return rtrim(preg_replace('/\?.*/', '', $this->getUri()), '/'); }
/** * Get the full URL for the request. * * @return string */ public function fullUrl() { $query = $this->getQueryString();
$question = $this->getBaseUrl().$this->getPathInfo() == '/' ? '/?' : '?';
return $query ? $this->url().$question.$query : $this->url(); }
/** * Get the full URL for the request with the added query string parameters. * * @param array $query * @return string */ public function fullUrlWithQuery(array $query) { return count($this->query()) > 0 ? $this->url().'/?'.http_build_query(array_merge($this->query(), $query)) : $this->fullUrl().'?'.http_build_query($query); }
/** * Get the current path info for the request. * * @return string */ public function path() { $pattern = trim($this->getPathInfo(), '/');
return $pattern == '' ? '/' : $pattern; }
/** * Get the current encoded path info for the request. * * @return string */ public function decodedPath() { return rawurldecode($this->path()); }
/** * Get a segment from the URI (1 based index). * * @param int $index * @param string|null $default * @return string|null */ public function segment($index, $default = null) { return Arr::get($this->segments(), $index - 1, $default); }
/** * Get all of the segments for the request path. * * @return array */ public function segments() { $segments = explode('/', $this->path());
return array_values(array_filter($segments, function ($v) { return $v != ''; })); }
/** * Determine if the current request URI matches a pattern. * * @param mixed string * @return bool */ public function is() { foreach (func_get_args() as $pattern) { if (Str::is($pattern, urldecode($this->path()))) { return true; } }
return false; }
/** * Determine if the current request URL and query string matches a pattern. * * @param mixed string * @return bool */ public function fullUrlIs() { $url = $this->fullUrl();
foreach (func_get_args() as $pattern) { if (Str::is($pattern, $url)) { return true; } }
return false; }
/** * Determine if the request is the result of an AJAX call. * * @return bool */ public function ajax() { return $this->isXmlHttpRequest(); }
/** * Determine if the request is the result of an PJAX call. * * @return bool */ public function pjax() { return $this->headers->get('X-PJAX') == true; }
/** * Determine if the request is over HTTPS. * * @return bool */ public function secure() { return $this->isSecure(); }
/** * Returns the client IP address. * * @return string */ public function ip() { return $this->getClientIp(); }
/** * Returns the client IP addresses. * * @return array */ public function ips() { return $this->getClientIps(); }
/** * Determine if the request contains a given input item key. * * @param string|array $key * @return bool */ public function exists($key) { $keys = is_array($key) ? $key : func_get_args();
$input = $this->all();
foreach ($keys as $value) { if (! array_key_exists($value, $input)) { return false; } }
return true; }
/** * Determine if the request contains a non-empty value for an input item. * * @param string|array $key * @return bool */ public function has($key) { $keys = is_array($key) ? $key : func_get_args();
foreach ($keys as $value) { if ($this->isEmptyString($value)) { return false; } }
return true; }
/** * Determine if the given input key is an empty string for "has". * * @param string $key * @return bool */ protected function isEmptyString($key) { $value = $this->input($key);
$boolOrArray = is_bool($value) || is_array($value);
return ! $boolOrArray && trim((string) $value) === ''; }
/** * Get all of the input and files for the request. * * @return array */ public function all() { return array_replace_recursive($this->input(), $this->allFiles()); }
/** * Retrieve an input item from the request. * * @param string $key * @param string|array|null $default * @return string|array */ public function input($key = null, $default = null) { $input = $this->getInputSource()->all() + $this->query->all();
return data_get($input, $key, $default); }
/** * Get a subset of the items from the input data. * * @param array|mixed $keys * @return array */ public function only($keys) { $keys = is_array($keys) ? $keys : func_get_args();
$results = [];
$input = $this->all();
foreach ($keys as $key) { Arr::set($results, $key, data_get($input, $key)); }
return $results; }
/** * Get all of the input except for a specified array of items. * * @param array|mixed $keys * @return array */ public function except($keys) { $keys = is_array($keys) ? $keys : func_get_args();
$results = $this->all();
Arr::forget($results, $keys);
return $results; }
/** * Intersect an array of items with the input data. * * @param array|mixed $keys * @return array */ public function intersect($keys) { return array_filter($this->only(is_array($keys) ? $keys : func_get_args())); }
/** * Retrieve a query string item from the request. * * @param string $key * @param string|array|null $default * @return string|array */ public function query($key = null, $default = null) { return $this->retrieveItem('query', $key, $default); }
/** * Determine if a cookie is set on the request. * * @param string $key * @return bool */ public function hasCookie($key) { return ! is_null($this->cookie($key)); }
/** * Retrieve a cookie from the request. * * @param string $key * @param string|array|null $default * @return string|array */ public function cookie($key = null, $default = null) { return $this->retrieveItem('cookies', $key, $default); }
/** * Get an array of all of the files on the request. * * @return array */ public function allFiles() { $files = $this->files->all();
return $this->convertedFiles ? $this->convertedFiles : $this->convertedFiles = $this->convertUploadedFiles($files); }
/** * Convert the given array of Symfony UploadedFiles to custom Laravel UploadedFiles. * * @param array $files * @return array */ protected function convertUploadedFiles(array $files) { return array_map(function ($file) { if (is_null($file) || (is_array($file) && empty(array_filter($file)))) { return $file; }
return is_array($file) ? $this->convertUploadedFiles($file) : UploadedFile::createFromBase($file); }, $files); }
/** * Retrieve a file from the request. * * @param string $key * @param mixed $default * @return \Symfony\Component\HttpFoundation\File\UploadedFile|array|null */ public function file($key = null, $default = null) { return data_get($this->allFiles(), $key, $default); }
/** * Determine if the uploaded data contains a file. * * @param string $key * @return bool */ public function hasFile($key) { if (! is_array($files = $this->file($key))) { $files = [$files]; }
foreach ($files as $file) { if ($this->isValidFile($file)) { return true; } }
return false; }
/** * Check that the given file is a valid file instance. * * @param mixed $file * @return bool */ protected function isValidFile($file) { return $file instanceof SplFileInfo && $file->getPath() != ''; }
/** * Determine if a header is set on the request. * * @param string $key * @return bool */ public function hasHeader($key) { return ! is_null($this->header($key)); }
/** * Retrieve a header from the request. * * @param string $key * @param string|array|null $default * @return string|array */ public function header($key = null, $default = null) { return $this->retrieveItem('headers', $key, $default); }
/** * Retrieve a server variable from the request. * * @param string $key * @param string|array|null $default * @return string|array */ public function server($key = null, $default = null) { return $this->retrieveItem('server', $key, $default); }
/** * Retrieve an old input item. * * @param string $key * @param string|array|null $default * @return string|array */ public function old($key = null, $default = null) { return $this->session()->getOldInput($key, $default); }
/** * Flash the input for the current request to the session. * * @param string $filter * @param array $keys * @return void */ public function flash($filter = null, $keys = []) { $flash = (! is_null($filter)) ? $this->$filter($keys) : $this->input();
$this->session()->flashInput($flash); }
/** * Flash only some of the input to the session. * * @param array|mixed $keys * @return void */ public function flashOnly($keys) { $keys = is_array($keys) ? $keys : func_get_args();
return $this->flash('only', $keys); }
/** * Flash only some of the input to the session. * * @param array|mixed $keys * @return void */ public function flashExcept($keys) { $keys = is_array($keys) ? $keys : func_get_args();
return $this->flash('except', $keys); }
/** * Flush all of the old input from the session. * * @return void */ public function flush() { $this->session()->flashInput([]); }
/** * Retrieve a parameter item from a given source. * * @param string $source * @param string $key * @param string|array|null $default * @return string|array */ protected function retrieveItem($source, $key, $default) { if (is_null($key)) { return $this->$source->all(); }
return $this->$source->get($key, $default); }
/** * Merge new input into the current request's input array. * * @param array $input * @return void */ public function merge(array $input) { $this->getInputSource()->add($input); }
/** * Replace the input for the current request. * * @param array $input * @return void */ public function replace(array $input) { $this->getInputSource()->replace($input); }
/** * Get the JSON payload for the request. * * @param string $key * @param mixed $default * @return mixed */ public function json($key = null, $default = null) { if (! isset($this->json)) { $this->json = new ParameterBag((array) json_decode($this->getContent(), true)); }
if (is_null($key)) { return $this->json; }
return data_get($this->json->all(), $key, $default); }
/** * Get the input source for the request. * * @return \Symfony\Component\HttpFoundation\ParameterBag */ protected function getInputSource() { if ($this->isJson()) { return $this->json(); }
return $this->getMethod() == 'GET' ? $this->query : $this->request; }
/** * Determine if the given content types match. * * @param string $actual * @param string $type * @return bool */ public static function matchesType($actual, $type) { if ($actual === $type) { return true; }
$split = explode('/', $actual);
return isset($split[1]) && preg_match('#'.preg_quote($split[0], '#').'/.+\+'.preg_quote($split[1], '#').'#', $type); }
/** * Determine if the request is sending JSON. * * @return bool */ public function isJson() { return Str::contains($this->header('CONTENT_TYPE'), ['/json', '+json']); }
/** * Determine if the current request is asking for JSON in return. * * @return bool */ public function wantsJson() { $acceptable = $this->getAcceptableContentTypes();
return isset($acceptable[0]) && Str::contains($acceptable[0], ['/json', '+json']); }
/** * Determines whether the current requests accepts a given content type. * * @param string|array $contentTypes * @return bool */ public function accepts($contentTypes) { $accepts = $this->getAcceptableContentTypes();
if (count($accepts) === 0) { return true; }
$types = (array) $contentTypes;
foreach ($accepts as $accept) { if ($accept === '*/*' || $accept === '*') { return true; }
foreach ($types as $type) { if ($this->matchesType($accept, $type) || $accept === strtok($type, '/').'/*') { return true; } } }
return false; }
/** * Return the most suitable content type from the given array based on content negotiation. * * @param string|array $contentTypes * @return string|null */ public function prefers($contentTypes) { $accepts = $this->getAcceptableContentTypes();
$contentTypes = (array) $contentTypes;
foreach ($accepts as $accept) { if (in_array($accept, ['*/*', '*'])) { return $contentTypes[0]; }
foreach ($contentTypes as $contentType) { $type = $contentType;
if (! is_null($mimeType = $this->getMimeType($contentType))) { $type = $mimeType; }
if ($this->matchesType($type, $accept) || $accept === strtok($type, '/').'/*') { return $contentType; } } } }
/** * Determines whether a request accepts JSON. * * @return bool */ public function acceptsJson() { return $this->accepts('application/json'); }
/** * Determines whether a request accepts HTML. * * @return bool */ public function acceptsHtml() { return $this->accepts('text/html'); }
/** * Get the data format expected in the response. * * @param string $default * @return string */ public function format($default = 'html') { foreach ($this->getAcceptableContentTypes() as $type) { if ($format = $this->getFormat($type)) { return $format; } }
return $default; }
/** * Get the bearer token from the request headers. * * @return string|null */ public function bearerToken() { $header = $this->header('Authorization', '');
if (Str::startsWith($header, 'Bearer ')) { return Str::substr($header, 7); } }
/** * Create an Illuminate request from a Symfony instance. * * @param \Symfony\Component\HttpFoundation\Request $request * @return \Illuminate\Http\Request */ public static function createFromBase(SymfonyRequest $request) { if ($request instanceof static) { return $request; }
$content = $request->content;
$request = (new static)->duplicate(
$request->query->all(), $request->request->all(), $request->attributes->all(),
$request->cookies->all(), $request->files->all(), $request->server->all() );
$request->content = $content;
$request->request = $request->getInputSource();
return $request; }
/** * {@inheritdoc} */ public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) { return parent::duplicate($query, $request, $attributes, $cookies, array_filter((array) $files), $server); }
/** * Get the session associated with the request. * * @return \Illuminate\Session\Store * * @throws \RuntimeException */ public function session() { if (! $this->hasSession()) { throw new RuntimeException('Session store not set on request.'); }
return $this->getSession(); }
/** * Get the user making the request. * * @param string|null $guard * @return mixed */ public function user($guard = null) { return call_user_func($this->getUserResolver(), $guard); }
/** * Get the route handling the request. * * @param string|null $param * * @return \Illuminate\Routing\Route|object|string */ public function route($param = null) { $route = call_user_func($this->getRouteResolver());
if (is_null($route) || is_null($param)) { return $route; } else { return $route->parameter($param); } }
/** * Get a unique fingerprint for the request / route / IP address. * * @return string * * @throws \RuntimeException */ public function fingerprint() { if (! $this->route()) { throw new RuntimeException('Unable to generate fingerprint. Route unavailable.'); }
return sha1( implode('|', $this->route()->methods()). '|'.$this->route()->domain(). '|'.$this->route()->uri(). '|'.$this->ip() ); }
/** * Get the user resolver callback. * * @return \Closure */ public function getUserResolver() { return $this->userResolver ?: function () { // }; }
/** * Set the user resolver callback. * * @param \Closure $callback * @return $this */ public function setUserResolver(Closure $callback) { $this->userResolver = $callback;
return $this; }
/** * Get the route resolver callback. * * @return \Closure */ public function getRouteResolver() { return $this->routeResolver ?: function () { // }; }
/** * Set the route resolver callback. * * @param \Closure $callback * @return $this */ public function setRouteResolver(Closure $callback) { $this->routeResolver = $callback;
return $this; }
/** * Get all of the input and files for the request. * * @return array */ public function toArray() { return $this->all(); }
/** * Determine if the given offset exists. * * @param string $offset * @return bool */ public function offsetExists($offset) { return array_key_exists($offset, $this->all()); }
/** * Get the value at the given offset. * * @param string $offset * @return mixed */ public function offsetGet($offset) { return data_get($this->all(), $offset); }
/** * Set the value at the given offset. * * @param string $offset * @param mixed $value * @return void */ public function offsetSet($offset, $value) { return $this->getInputSource()->set($offset, $value); }
/** * Remove the value at the given offset. * * @param string $offset * @return void */ public function offsetUnset($offset) { return $this->getInputSource()->remove($offset); }
/** * Check if an input element is set on the request. * * @param string $key * @return bool */ public function __isset($key) { return ! is_null($this->__get($key)); }
/** * Get an input element from the request. * * @param string $key * @return mixed */ public function __get($key) { $all = $this->all();
if (array_key_exists($key, $all)) { return $all[$key]; } else { return $this->route($key); } } }
|