Request Environment

Every HTTP request (usually originated by a browser) contains additional information regarding the request such as header data, files, variables, etc. A web based application needs to parse that information so as to provide the correct response back to the requester. Phalcon\Http\Request encapsulates the information of the request, allowing you to access it in an object-oriented way.

  1. <?php
  2. use Phalcon\Http\Request;
  3. // Getting a request instance
  4. $request = new Request();
  5. // Check whether the request was made with method POST
  6. if ($request->isPost()) {
  7. // Check whether the request was made with Ajax
  8. if ($request->isAjax()) {
  9. echo 'Request was made using POST and AJAX';
  10. }
  11. }

Getting Values

PHP automatically fills the superglobal arrays $_GET and $_POST depending on the type of the request. These arrays contain the values present in forms submitted or the parameters sent via the URL. The variables in the arrays are never sanitized and can contain illegal characters or even malicious code, which can lead to SQL injection or Cross Site Scripting (XSS) attacks.

Phalcon\Http\Request allows you to access the values stored in the $_REQUEST, $_GET and $_POST arrays and sanitize or filter them with the filter service, (by default Phalcon\Filter). The following examples offer the same behavior:

  1. <?php
  2. use Phalcon\Filter;
  3. $filter = new Filter();
  4. // Manually applying the filter
  5. $email = $filter->sanitize($_POST['user_email'], 'email');
  6. // Manually applying the filter to the value
  7. $email = $filter->sanitize($request->getPost('user_email'), 'email');
  8. // Automatically applying the filter
  9. $email = $request->getPost('user_email', 'email');
  10. // Setting a default value if the param is null
  11. $email = $request->getPost('user_email', 'email', '[email protected]');
  12. // Setting a default value if the param is null without filtering
  13. $email = $request->getPost('user_email', null, '[email protected]');

Accessing the Request from Controllers

The most common place to access the request environment is in an action of a controller. To access the Phalcon\Http\Request object from a controller you will need to use the $this->request public property of the controller:

  1. <?php
  2. use Phalcon\Mvc\Controller;
  3. class PostsController extends Controller
  4. {
  5. public function indexAction()
  6. {
  7. }
  8. public function saveAction()
  9. {
  10. // Check if request has made with POST
  11. if ($this->request->isPost()) {
  12. // Access POST data
  13. $customerName = $this->request->getPost('name');
  14. $customerBorn = $this->request->getPost('born');
  15. }
  16. }
  17. }

Uploading Files

Another common task is file uploading. Phalcon\Http\Request offers an object-oriented way to achieve this task:

  1. <?php
  2. use Phalcon\Mvc\Controller;
  3. class PostsController extends Controller
  4. {
  5. public function uploadAction()
  6. {
  7. // Check if the user has uploaded files
  8. if ($this->request->hasFiles()) {
  9. $files = $this->request->getUploadedFiles();
  10. // Print the real file names and sizes
  11. foreach ($files as $file) {
  12. // Print file details
  13. echo $file->getName(), ' ', $file->getSize(), '\n';
  14. // Move the file into the application
  15. $file->moveTo(
  16. 'files/' . $file->getName()
  17. );
  18. }
  19. }
  20. }
  21. }

Each object returned by Phalcon\Http\Request::getUploadedFiles() is an instance of the Phalcon\Http\Request\File class. Using the $_FILES superglobal array offers the same behavior. Phalcon\Http\Request\File> encapsulates only the information related to each file uploaded with the request.

Working with Headers

As mentioned above, request headers contain useful information that allow us to send the proper response back to the user. The following examples show usages of that information:

  1. <?php
  2. // Get the Http-X-Requested-With header
  3. $requestedWith = $request->getHeader('HTTP_X_REQUESTED_WITH');
  4. if ($requestedWith === 'XMLHttpRequest') {
  5. echo 'The request was made with Ajax';
  6. }
  7. // Same as above
  8. if ($request->isAjax()) {
  9. echo 'The request was made with Ajax';
  10. }
  11. // Check the request layer
  12. if ($request->isSecure()) {
  13. echo 'The request was made using a secure layer';
  14. }
  15. // Get the servers's IP address. ie. 192.168.0.100
  16. $ipAddress = $request->getServerAddress();
  17. // Get the client's IP address ie. 201.245.53.51
  18. $ipAddress = $request->getClientAddress();
  19. // Get the User Agent (HTTP_USER_AGENT)
  20. $userAgent = $request->getUserAgent();
  21. // Get the best acceptable content by the browser. ie text/xml
  22. $contentType = $request->getAcceptableContent();
  23. // Get the best charset accepted by the browser. ie. utf-8
  24. $charset = $request->getBestCharset();
  25. // Get the best language accepted configured in the browser. ie. en-us
  26. $language = $request->getBestLanguage();
  27. // Check if a header exists
  28. if ($request->hasHeader('my-header')) {
  29. echo "Mary had a little lamb";
  30. }

Events

When using HTTP authorization, the Authorization header has the following format:

  1. Authorization: <type> <credentials>

where <type> is an authentication type. A common type is Basic. Additional authentication types are described in IANA registry of Authentication schemes and Authentication for AWS servers (AWS4-HMAC-SHA256). In 99.99% use cases the authentication type is:

  • AWS4-HMAC-SHA256
  • Basic
  • Bearer
  • Digest
  • HOBA
  • Mutual
  • Negotiate
  • OAuth
  • SCRAM-SHA-1
  • SCRAM-SHA-256
  • vapid
    You can use the request:beforeAuthorizationResolve and request:afterAuthorizationResolve events to perform additional operations before or after the authorization resolves. A custom authorization resolver is required.

Example without using custom authorization resolver:

  1. <?php
  2. use Phalcon\Http\Request;
  3. $_SERVER['HTTP_AUTHORIZATION'] = 'Enigma Secret';
  4. $request = new Request();
  5. print_r($request->getHeaders());

Result:

  1. Array
  2. (
  3. [Authorization] => Enigma Secret
  4. )
  5. Type: Enigma
  6. Credentials: Secret

Example using custom authorization resolver:

  1. <?php
  2. use Phalcon\Di;
  3. use Phalcon\Events\Event;
  4. use Phalcon\Http\Request;
  5. use Phalcon\Events\Manager;
  6. class NegotiateAuthorizationListener
  7. {
  8. public function afterAuthorizationResolve(Event $event, Request $request, array $data)
  9. {
  10. if (empty($data['server']['CUSTOM_KERBEROS_AUTH'])) {
  11. return false;
  12. }
  13. list($type,) = explode(' ', $data['server']['CUSTOM_KERBEROS_AUTH'], 2);
  14. if (!$type || stripos($type, 'negotiate') !== 0) {
  15. return false;
  16. }
  17. return [
  18. 'Authorization'=> $data['server']['CUSTOM_KERBEROS_AUTH'],
  19. ];
  20. }
  21. }
  22. $_SERVER['CUSTOM_KERBEROS_AUTH'] = 'Negotiate a87421000492aa874209af8bc028';
  23. $di = new Di();
  24. $di->set('eventsManager', function () {
  25. $manager = new Manager();
  26. $manager->attach('request', new NegotiateAuthorizationListener());
  27. return $manager;
  28. });
  29. $request = new Request();
  30. $request->setDI($di);
  31. print_r($request->getHeaders());

Result:

  1. Array
  2. (
  3. [Authorization] => Negotiate a87421000492aa874209af8bc028
  4. )
  5. Type: Negotiate
  6. Credentials: a87421000492aa874209af8bc028