Completed
Push — master ( 34ccd6...bd6c18 )
by Stefano
02:43
created

Request::input()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 3
rs 9.2
cc 4
eloc 2
nc 8
nop 2
1
<?php
2
3
/**
4
 * Request
5
 *
6
 * Handles the HTTP request for the current execution.
7
 *
8
 * @package core
9
 * @author [email protected]
10
 * @copyright Caffeina srl - 2015 - http://caffeina.it
11
 */
12
13
class Request {
14
  use Module;
15
16
  protected static $body,
17
                   $accepts;
18
19
  /**
20
   * Handle Content Negotiation requests
21
   *
22
   * @param  string $key The name of the negotiation subject
23
   * @param  string $choices A query string for the negotiation choices (See RFC 7231)
24
   *
25
   * @return Object The preferred content if $choices is empty else return best match
26
   */
27
  public static function accept($key='type',$choices=''){
28
    if (null === static::$accepts) static::$accepts = [
29
      'type'     => new Negotiation(isset($_SERVER['HTTP_ACCEPT'])          ? $_SERVER['HTTP_ACCEPT']          : ''),
30
      'language' => new Negotiation(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : ''),
31
      'encoding' => new Negotiation(isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : ''),
32
      'charset'  => new Negotiation(isset($_SERVER['HTTP_ACCEPT_CHARSET'])  ? $_SERVER['HTTP_ACCEPT_CHARSET']  : ''),
33
    ];
34
    return empty(static::$accepts[$key])
35
      ? false
36
      : ( empty($choices)
37
           ? static::$accepts[$key]->preferred()
38
           : static::$accepts[$key]->best($choices)
39
      );
40
  }
41
42
  /**
43
   * Retrive a value from generic input (from the $_REQUEST array)
44
   * Returns all elements if you pass `null` as $key
45
   *
46
   * @param  string $key The name of the input value
47
   *
48
   * @return Object The returned value or $default.
49
   */
50
  public static function input($key=null,$default=null){
51
    return $key ? (isset($_REQUEST[$key]) ? new Object($_REQUEST[$key]) : (is_callable($default)?call_user_func($default):$default))  : new Object($_REQUEST[$key]);
52
  }
53
54
  /**
55
   * Retrive a value from environment (from the $_ENV array)
56
   * Returns all elements if you pass `null` as $key
57
   *
58
   * @param  string $key The name of the input value
59
   *
60
   * @return Object The returned value or $default.
61
   */
62
  public static function env($key=null,$default=null){
63
    return $key ? (filter_input(INPUT_ENV,$key) ?: (is_callable($default)?call_user_func($default):$default))  : $_ENV;
64
  }
65
66
  /**
67
   * Retrive a value from generic input (from the $_POST array)
68
   * Returns all elements if you pass `null` as $key
69
   *
70
   * @param  string $key The name of the input value
71
   *
72
   * @return Object The returned value or $default.
73
   */
74
  public static function post($key=null,$default=null){
75
    return $key ? (filter_input(INPUT_POST,$key) ?: (is_callable($default)?call_user_func($default):$default))  : $_POST;
76
  }
77
78
  /**
79
   * Retrive a value from generic input (from the $_GET array)
80
   * Returns all elements if you pass `null` as $key
81
   *
82
   * @param  string $key The name of the input value
83
   *
84
   * @return Object The returned value or $default.
85
   */
86
  public static function get($key=null,$default=null){
87
    return $key ? (filter_input(INPUT_GET,$key) ?: (is_callable($default)?call_user_func($default):$default))  : $_GET;
88
  }
89
90
  /**
91
   * Retrive uploaded file (from the $_FILES array)
92
   * Returns all uploaded files if you pass `null` as $key
93
   *
94
   * @param  string $key The name of the input value
95
   *
96
   * @return Object The returned value or $default.
97
   */
98
  public static function files($key=null,$default=null){
99
    return $key ? (isset($_FILES[$key]) ? $_FILES[$key] : (is_callable($default)?call_user_func($default):$default))  : $_FILES;
100
  }
101
102
  /**
103
   * Retrive cookie (from the $_COOKIE array)
104
   * Returns all cookies if you pass `null` as $key
105
   *
106
   * @param  string $key The name of the input value
107
   *
108
   * @return Object The returned value or $default.
109
   */
110
  public static function cookie($key=null,$default=null){
111
    return $key ? (filter_input(INPUT_COOKIE,$key) ?: (is_callable($default)?call_user_func($default):$default))  : $_COOKIE;
112
  }
113
114
  /**
115
   * Returns the current host, complete with protocol (pass `false` to omit).
116
   *
117
   * @return string
118
   */
119
  public static function host($protocol=true){
120
    $host = filter_input(INPUT_SERVER,'HOSTNAME') ?: (
121
          filter_input(INPUT_SERVER,'SERVER_NAME') ?:
122
          filter_input(INPUT_SERVER,'HTTP_HOST')
123
    );
124
    return ($protocol ? 'http' . (filter_input(INPUT_SERVER,'HTTPS')?'s':'') . '://' : '') . Filter::with('core.request.host',$host);
125
  }
126
127
  /**
128
   * Returns the current request URL, complete with host and protocol.
129
   *
130
   * @return string
131
   */
132
  public static function URL(){
133
    return static::host(true) . static::URI(false);
134
  }
135
136
  /**
137
   * Retrive header
138
   * Returns all headers if you pass `null` as $key
139
   *
140
   * @param  string $key The name of the input value
141
   *
142
   * @return Object The returned value or null.
143
   */
144
  public static function header($key=null,$default=null){
145
    $key = 'HTTP_'.strtr(strtoupper($key),'-','_');
146
    return $key ? (filter_input(INPUT_SERVER,$key) ?: (is_callable($default)?call_user_func($default):$default)) : $_SERVER;
147
  }
148
149
  /**
150
   * Returns the current request URI.
151
   *
152
   * @param  boolean $relative If true, trim the URI relative to the application index.php script.
153
   *
154
   * @return string
155
   */
156
  public static function URI($relative=true){
157
    // On some web server configurations PHP_SELF is not populated.
158
    $self = filter_input(INPUT_SERVER,'SCRIPT_NAME') ?: filter_input(INPUT_SERVER,'PHP_SELF');
159
    // Search REQUEST_URI in $_SERVER
160
    $serv_uri = filter_input(INPUT_SERVER,'PATH_INFO') ?: (
161
          filter_input(INPUT_SERVER,'ORIG_PATH_INFO') ?:
162
          filter_input(INPUT_SERVER,'REQUEST_URI')
163
    );
164
    $uri = strtok($serv_uri,'?');
165
    $uri = ($uri == $self) ? '/' : $uri;
166
167
    // Add a filter here, for URL rewriting
168
    $uri = Filter::with('core.request.URI',$uri);
169
170
    $uri = rtrim($uri,'/');
171
172
    if ($relative){
173
      $base = rtrim(dirname($self),'/');
174
      $uri = str_replace($base,'',$uri);
175
    }
176
177
    return $uri ?: '/';
178
  }
179
180
  /**
181
   * Returns the current base URI (The front-controller directory)
182
   *
183
   * @return string
184
   */
185
  public static function baseURI(){
186
    // On some web server configurations PHP_SELF is not populated.
187
    $uri = dirname(filter_input(INPUT_SERVER,'SCRIPT_NAME') ?: filter_input(INPUT_SERVER,'PHP_SELF'));
188
    return $uri ?: '/';
189
  }
190
191
  /**
192
   * Returns the HTTP Method
193
   *
194
   * @return string
195
   */
196
  public static function method(){
197
   return Filter::with('core.request.method',strtolower(filter_input(INPUT_SERVER,'REQUEST_METHOD')?:'get'));
198
  }
199
200
  /**
201
   * Returns the remote IP
202
   *
203
   * @return string
204
   */
205
  public static function IP(){
206
   return Filter::with('core.request.IP',strtolower(filter_input(INPUT_SERVER,'REMOTE_ADDR')?:''));
207
  }
208
209
  /**
210
   * Returns the remote UserAgent
211
   *
212
   * @return string
213
   */
214
  public static function UA(){
215
   return Filter::with('core.request.UA',strtolower(filter_input(INPUT_SERVER,'HTTP_USER_AGENT')?:''));
216
  }
217
218
219
  /**
220
   * Returns request body data, convert to object if content type is JSON
221
   * Gives you all request data if you pass `null` as $key
222
   *
223
   * @param  string $key The name of the key requested
224
   *
225
   * @return mixed The request body data
226
   */
227
  public static function data($key=null,$default=null){
228
    if (null===static::$body){
229
      $json = (false !== stripos(filter_input(INPUT_SERVER,'HTTP_CONTENT_TYPE'),'json'))
230
           || (false !== stripos(filter_input(INPUT_SERVER,'CONTENT_TYPE'),'json'));
231
      if ($json) {
232
        static::$body = json_decode(file_get_contents("php://input"));
233
      } else {
234
       if (empty($_POST)) {
235
          static::$body = file_get_contents("php://input");
236
        } else {
237
          static::$body = (object)$_POST;
238
        }
239
      }
240
    }
241
    return $key ? (isset(static::$body->$key) ? static::$body->$key : (is_callable($default)?call_user_func($default):$default))  : static::$body;
242
  }
243
244
}
245