Вход Регистрация
Файл: src/vendor/laravel/framework/src/Illuminate/Http/Request.php
Строк: 803
<?php

namespace IlluminateHttp;

use 
Closure;
use 
ArrayAccess;
use 
SplFileInfo;
use 
RuntimeException;
use 
IlluminateSupportArr;
use 
IlluminateSupportStr;
use 
IlluminateSupportTraitsMacroable;
use 
IlluminateContractsSupportArrayable;
use 
SymfonyComponentHttpFoundationParameterBag;
use 
SymfonyComponentHttpFoundationRequest 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;
    }

    
/**
     * 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 SymfonyComponentHttpFoundationFileUploadedFile|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() != '';
    }

    
/**
     * 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 SymfonyComponentHttpFoundationParameterBag
     */
    
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);

        if (isset(
$split[1]) && preg_match('/'.$split[0].'/.++'.$split[1].'/', $type)) {
            return 
true;
        }

        return 
false;
    }

    
/**
     * 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  SymfonyComponentHttpFoundationRequest  $request
     * @return IlluminateHttpRequest
     */
    
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 IlluminateSessionStore
     *
     * @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 IlluminateRoutingRoute|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);
        }
    }
}
Онлайн: 2
Реклама