Top 40 PHP Libraries of 2020 Every Developer Should Know

Top 40 PHP Libraries of 2020 Every Developer Should Know


PHP is a powerful backend language used in more than 80% of the global web applications. The simplicity of PHP makes it one of the top programming languages, as it uses an easy to understand programming structure and developer-friendly web functionalities. It gives ease to the developers to build dynamic applications integrated with desired features.
But, writing PHP code often becomes a tedious job. Because, in many cases, PHP requires coding from scratch for every single function. This becomes a bit of a hassle for the developers and is a time-consuming process.
To ease this out, built in PHP libraries got introduced in the market to effectively reduce developers’ load while coding the project. Using these libraries, several developmental functions can be configured in the project easily, allowing developers to focus more on the other complex operations.
So, hereby we have compiled top 30 PHP libraries which every developer should know. Using these, developers can lessen up their functional work as they come preconfigured with several functions. Let’s take a look at some of the top PHP libraries of 2020 below:

Best PHP Libraries To Integrate in Web Apps

Symfony Console Component

Command line interface (CLI) is one of the core elements of major PHP frameworks including Laravel, Symfony, CodeIgniter and others. This library provides easy to understand command line interface in Symfony. Its integration in the application is also quite simple and is precisely made to build testable command line interfaces.
Composer Command: composer require symfony/console

Implementation

First you need to create a PHP script and define console like this:
  1. <?php
  2. // application.php
  3. require __DIR__.'/vendor/autoload.php';
  4. use Symfony\Component\Console\Application;
  5. $application = new Application();
  6. $application->run();
Now you need to register the commands using add() functions.
  1. $application->add(new GenerateAdminCommand());

Symfony Finder Component

Developers often find difficulties while locating desired files and folders within the project. Using this Finder component, developers can easily find files and directories within the project. It provides different attributes (name, file size, modification time, extension etc.) to find the related files or directories. Moreover, it has an intuitive interface which helps users to find the desired resources.
Composer Command: composer require symfony/finder

Implementation

Let’s suppose you need to find all files and folders in the root directory. You can do it as:
You can also find files in FTP and user defined streams

Psr/log

If you want to find all the interfaces, classes, traits etc. related to PS-3, this PHP logging library helps you finding all those resources with just a few clicks. The library isn’t a logger itself, but is an interface that forms a logging system. This PHP logging library comes up with full documentation, so that developers can easily work with it.
Composer Command: composer require psr/log

Implementation

You can use the logger for logging like below code snippet:
  1. <?php
  2. use Psr\Log\LoggerInterface;
  3. class Foo
  4. {
  5. private $logger;
  6. public function __construct(LoggerInterface $logger = null)
  7. {
  8. $this->logger = $logger;
  9. }
  10. public function doSomething()
  11. {
  12. if ($this->logger) {
  13. $this->logger->info('Doing work');
  14. }
  15. // do something useful
  16. }
  17. }

Monolog

It is necessary to save the logs to particular files or folders. Saving them at a certain place often seems to be a difficult job, but using this PHP logging library you can easily save your logs to the defined locations. Monolog helps you to send you logs to defined files, sockets, inboxes, databases and other web services. It uses a PSR-3 interface which allows you to type-hint logs against your own libraries in order to keep maximum interoperability.
Composer Command: composer require monolog/monolog

Implementation

The basic usage to log error and warning with PSR log can be defined as:
  1. <?php
  2. use Monolog\Logger;
  3. use Monolog\Handler\StreamHandler;
  4. // create a log channel
  5. $log = new Logger('name');
  6. $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
  7. // add records to the log
  8. $log->warning('Foo');
  9. $log->error('Bar');

Guzzle

Guzzle works as a particular PHP client for sending HTTP requests to the web servers. Using this library, developers can easily send HTTP requests to integrate with the web services. The library provides a simple interface for building query strings, POST requests, HTTP cookies and other attributes. It also allows developers to send both synchronous and asynchronous requests from the same interface.
Composer Command: composer require guzzlehttp/guzzle
  1. <?php
  2. Class CloudwaysAPIClient
  3. {
  4. private $client = null;
  5. const API_URL = "https://api.cloudways.com/api/v1";
  6. var $auth_key;
  7. var $auth_email;
  8. var $accessToken;
  9. public function __construct($email,$key)
  10. {
  11. $this->auth_email = $email;
  12. $this->auth_key = $key;
  13. $this->client = new GuzzleHttpClient();
  14. $this->prepare_access_token();
  15. }
  16. public function prepare_access_token()
  17. {
  18. try
  19. {
  20. $url = self::API_URL . "/oauth/access_token";
  21. $data = ['email' => $this->auth_email,'api_key' => $this->auth_key];
  22. $response = $this->client->post($url, ['query' => $data]);
  23. $result = json_decode($response->getBody()->getContents());
  24. $this->accessToken = $result->access_token;
  25. }
  26. catch (RequestException $e)
  27. {
  28. $response = $this->StatusCodeHandling($e);
  29. return $response;
  30. }
  31. }

Assert

Using the Assert library, developers can easily test the input and output of the methods within minutes. It’s a simple PHP library that reduces the need of extensive coding in web applications. The integration of the library within the project is also quite easy, as it provides complete documentation for the integration. It features some built-in error messages by default, which you can later change according to custom error requirements.
Composer Command: composer require webmozart/assert

Symfony/translation

This translation package is really handy for the developers who want to build multilingual apps supported by various languages. It is the growing demand of the modern world to build a multilingual product, and using this library developers can easily create desired projects with different languages. The library comes up with complete documentation and is easy to work with.
Composer Command: composer require symfony/translation

Implementation

You need to define the locale in constructor class to translate pages automatically.
  1. use Symfony\Component\Translation\Translator;
  2. $translator = new Translator('fr_FR');

PHPUnit

PHPUnit is perhaps the best PHP library for performing unit testing in PHP web applications. It is used to test application’s code for possible errors and bugs. While performing the unit testing with PHPUnit, developers can resolve various application bugs that may arise during the run-time execution. Hence, the library is vital to assess the cores of application and fixing it timely with the required solutions.
Composer Command: composer require phpunit/phpunit

PHP-code-coverage

If you want to measure how much source code of a program is executed during a particular test, this library helps you out in measuring that degree of code. The library provides you collection and rendering functionality of the executed PHP code, so that you can get a better idea about the tested chunk of code and how to resolve the errors in it.
Composer Command: composer require phpunit/php-code-coverage

Swiftmailer

Swiftmailer is a feature-rich PHP email library primarily built to ease out mailing operation in any web application. The library provides advanced object-oriented-approach combined with multitude of mailing features to send emails over the web. The most significant feature of Swiftmailer is that it protects the mails from header injection attacks without removing the request data content, which is what makes it a very efficient mailing system.
Composer Command: composer require swiftmailer/swiftmailer

Implementation

The basic usage of swiftmailer for sending emails is:
  1. require_once '/path/to/vendor/autoload.php';
  2. // Create the Transport
  3. $transport = (new Swift_SmtpTransport('smtp.example.org', 25))
  4. ->setUsername('your username')
  5. ->setPassword('your password');
  6. // Create the Mailer using your created Transport
  7. $mailer = new Swift_Mailer($transport);
  8. // Create a message
  9. $message = (new Swift_Message('Wonderful Subject'))
  10. ->setFrom(['john@doe.com' => 'John Doe'])
  11. ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name'])
  12. ->setBody('Here is the message itself');
  13. // Send the message
  14. $result = $mailer->send($message);

Email-validator

Email-validator is a specialized PHP validation library used to validate emails via number of chosen validation features. The library provides multiple types of validation for emails including RFC Validation, NoRFCWarningsValidation, SpoofCheckValidation and others. The library also provides DNS validation feature through which you can validate and spam out emails with the DNS verification.
Composer Command: composer require egulias/email-validator

Implementation

You need to define the validation strategy or method to follow in the code. Right now you have 6 type of available validations which you can see in official documentation:
The basic usage is as follows:
  1. use Egulias\EmailValidator\EmailValidator;
  2. use Egulias\EmailValidator\Validation\RFCValidation;
  3. $validator = new EmailValidator();
  4. $validator->isValid("example@example.com", new RFCValidation()); //true

PHP dotenv

This library helps developers to export environment variables from .env to getenv(), $_ENV and $_SERVER. The library is recently upgraded to the latest version V3, which now supports multiline variables as well. The library also allows developers to choose which part of the environment they want to read and modify according to the needs of application.
Composer commands: composer require vlucas/phpdotenv

Implementation

First you need to create a .env file on the root level of your directory. Next add variable and values in it like this:
  1. S3_BUCKET="devbucket"
  2. SECRET_KEY="abc123"
Now load the .env file in application like this:
  1. $dotenv = Dotenv\Dotenv::create(__DIR__);
  2. $dotenv->load();
Now you can access the variables created in env file with these three methods. You can use any one of them.
  1. $s3_bucket = getenv('S3_BUCKET');
  2. $s3_bucket = $_ENV['S3_BUCKET'];
  3. $s3_bucket = $_SERVER['S3_BUCKET'];

Symfony Filesystem Component

This Filesystem library provides basic utilities for the filesystem. Using this library, developers can easily create directories, files and much more in just a few steps. It also allows you to change the edit rights of the file and create a symlink with it. To install the library, you just have to use composer for the installation which is a quite straight forward process.
Composer Command: composer require symfony/filesystem

Twig

Twig is a fast, efficient and secure templating engine for PHP. It compiles templates to simple PHP code which is easily understandable to the developers. This reduces the overhead of complex backend code, and gives application a boost in performance. Moreover, it is also super-customizable, as it allows you to define your own tags, filters and custom DSL according to the needs of application.
Composer Command: composer require twig/twig

Faker

Faker is a handy PHP library that allows developers to generate dummy content for the web applications. Whether you want to fill up application database with mock data, or want to create sample XML documents, Faker does the job for you with good looking testing data. It supports all PHP 5+ versions and requires easy composer installation just once.
Composer  command: composer require fzaninotto/faker

Implementation

You need to use Faker\Factory::create() to create and initialize fake generator which can generate data by accessing properties.
  1. <?php
  2. // require the Faker autoloader
  3. require_once '/path/to/Faker/src/autoload.php';
  4. // alternatively, use another PSR-4 compliant autoloader
  5. // use the factory to create a Faker\Generator instance
  6. $faker = Faker\Factory::create();
  7. // generate data by accessing properties
  8. echo $faker->name;
  9. // 'Lucy Cechtelar';
  10. echo $faker->address;
  11. // "426 Jordy Lodge
  12. // Cartwrightshire, SC 88120-6700"
  13. echo $faker->text;
  14. // Dolores sit sint laboriosam dolorem culpa et autem. Beatae nam sunt fugit
  15. // et sit et mollitia sed.
  16. // Fuga deserunt tempora facere magni omnis. Omnis quia temporibus laudantium
  17. // sit minima sint.

AWS SDK for PHP

This particular AWS library allows developers to use Amazon Web Services in PHP applications. Using this AWS SDK, you can build desired web applications associated with Amazon S3, Glacier, DynamoDB and other Amazon services. Simply install this SDK using composer or download a zip file, all the Amazon services come pre-configured in it and are ready to be deployed with your PHP application.
But, since you are on Cloudways, you won’t gonna need this library for your PHP applications. As Cloudways provides PHP website hosting on completely managed AWS services for its deployed applications combined with the integrated stack of optimized web tools.  
Composer Command: composer require aws/aws-sdk-php

Implementation

First you need to initialize the sdk by including vendor files and then you can create different use cases like may be you want to upload files. Let’s see how you can do this.
  1. <?php
  2. // Require the Composer autoloader.
  3. require 'vendor/autoload.php';
  4. use Aws\S3\S3Client;
  5. // Instantiate an Amazon S3 client.
  6. $s3 = new S3Client([
  7. 'version' => 'latest',
  8. 'region' => 'us-west-2'
  9. ]);
Now upload the file on the AWS servers like this:
  1. <?php
  2. // Upload a publicly accessible file. The file size and type are determined by the SDK.
  3. try {
  4. $s3->putObject([
  5. 'Bucket' => 'my-bucket',
  6. 'Key' => 'my-object',
  7. 'Body' => fopen('/path/to/file', 'r'),
  8. 'ACL' => 'public-read',
  9. ]);
  10. } catch (Aws\S3\Exception\S3Exception $e) {
  11. echo "There was an error uploading the file.\n";
  12. }

PHPseclib

Transferring files from one server to another always remains a risky process, because hackers can intervene in between the route and can steal confidential information. To fortify this process, PHPSeclib provides a fully secure data transmission between the servers using SFTP protocol. This PHP SFTP library is compatible with all the latest versions of PHP and is easy to integrate in web applications.
Composer Command: composer require phpseclib/phpseclib

Laravel Tinker

Laravel Tinker is a powerful Laravel package built to give users the ease to interact with Laravel applications directly from command line. It is perfect to use with Eloquent ORM to manage jobs, events and more. It is a built in artisan tool and can be easily accessed using the Tinker artisan command in composer.
Composer Command: composer require laravel/tinker

Predis

Predis is a Redis client for PHP applications. It is a very effective caching tool precisely made to reduce the overhead of caching in web applications. You can use it for clustering, master slave replication setups, transparent key prefixing and many more optimization operations.  It also supports different custom connection classes for providing different network and protocol backends.
Composer Command: composer require predis/predis

Implementation

For implementing predis in your PHP project you first need to load the library in the project.
  1. // Prepend a base path if Predis is not available in your "include_path".
  2. require 'Predis/Autoloader.php';
  3. Predis\Autoloader::register();
Now create a client connection like this:
  1. $client = new Predis\Client();
  2. $client->set('foo', 'bar');
  3. $value = $client->get('foo');

PHP AMQP Library

php-amqplib is a library purely designed for PHP. It is compatible with every framework of PHP and is fully featured for RabbitMQ client.
A number of OS are being supported by RabbitMQ, and has several official client libraries available, one of them is php-amqplib. It is a message-oriented middleware whose main features are: Queuing and Orientation.
Composer Command: composer require php-amqplib/php-amqplib

Implementation

  1. <?php
  2. Include (__DIR__ . '/config.php');
  3. use PhpAmqpLib\Connection\AMQPStreamConnection;
  4. use PhpAmqpLib\Connection\AMQPSocketConnection;
  5. use PhpAmqpLib\Connection\AMQPSSLConnection;
  6. define ('CERTS_PATH', '/git/rabbitmqinaction/av_scratchwork/openssl');
  7. $sslOptions = array (
  8. $ssl_options = array (
  9. 'cafile' => CERTS_PATH . '/rmqca/cacert.pem',
  10. 'local_cert' => CERTS_PATH . '/phpcert.pem',
  11. 'verify_peer' => true
  12. );

Laravel-Permission Library

This library is for Laravel 5.8 and for later versions. This package allows you to manage user’s role and permissions in a database.
Composer command: composer require spatie/laravel-permission

Implementation

You can manually add the service provider in your config/app.php file:
  1. 'providers' => [
  2. // ...
  3. Spatie\Permission\PermissionServiceProvider::class,
  4. ];
  5. You must publish the migration with:
  6. php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

Twill Library

Twill is an open source CMS toolkit for Laravel. It provides author to create, curate and personalize command in the digital workflows. It also allows publishers to design and take control without restricting anything. It also gives the freedom to produce a powerful admin without undermining developer’s controls with the configuration.
Composer command:
  1. composer global require yanhaoli/create-twill-app:"1.0.*"
  2. create-twill-app new blog

OAuth 2.0

OAuth is an open standard for access delegation. It gives access to user information on other websites but without revealing the password. A lightweight and powerful OAuth 2.0 library is built for the users to authenticate and authorize the client of application and protect its API.
Composer command: composer require league/oauth2-server

Implementation

The examples here demonstrate its usage with the Slim Framework. Slim is not a requirement to use this library, you just need something that generates PSR7-compatible HTTP requests and responses.
The client will redirect the user to an authorization endpoint.
  1. $app->get('/authorize', function (ServerRequestInterface $request, ResponseInterface $response) use ($server) {
  2. try {
  3. $authRequest = $server->validateAuthorizationRequest($request);
  4. $authRequest->setUser(new UserEntity()); // an instance of UserEntityInterface
  5. $authRequest->setAuthorizationApproved(true);
  6. return $server->completeAuthorizationRequest($authRequest, $response);
  7. }
  8. catch (OAuthServerException $exception)
  9. {
  10. return $exception->generateHttpResponse($response);
  11. }
  12. catch (\Exception $exception)
  13. {
  14. $body = new Stream(fopen('php://temp', 'r+'));
  15. $body->write($exception->getMessage());
  16. return $response->withStatus(500)->withBody($body);
  17. }
  18. });

Laravel Backup

This package creates a backup of your application. A zip file of backup is created containing all the files in the specified directories. Any file system is supported by the backup package, and it can also create multiple backup in different file systems at once. It also notifies you via mail, slack or other notification provider if something goes wrong.
Composer command: composer require spatie/laravel-backup

Implementation

To publish the config file to config/backup.php run:
  1. php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

PHP Rector

This package instantly upgrade and refactor the PHP code. It renames classes, namespaces & constants, and upgrades PHP 5.3 to PHP 7.4 easily. It also migrates projects from Nette to Symfony, and turns static Laravel to Dependency Injection. It is used with almost every PHP framework i.e. Laravel, Symfony, CakePHP, PHPUnit and much more.
Composer command: composer require rector/rector

Implementation

When the library is first implemented, you can execute a dry run and then permanently change your code through the following commands.
  1. #see the diff first
  2. vendor/bin/rector process src --dry-run
  3. # if it's ok, apply
  4. vendor/bin/rector process src

Lighthouse

GraphQL is a query language for the APIs. It fulfills the queries on your existing data and gives an extensive understanding of the data in APIs. It also gives the client the power to specify the needs, and evolves the API overtime.
Composer command: composer require nuwave/lighthouse

Implementation

By the following artisan command, you can get the default Lighthouse Schema:
  1. php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" --tag=schema

Laravel Admin LTE

This library provides an easy integration of AdminLTE with Laravel 5 or later versions.
Composer command: composer require jeroennoten/laravel-adminlte

Implementation

  1. <?php
  2. namespace JeroenNoten\LaravelAdminLte;
  3. use Illuminate\Contracts\Events\Dispatcher;
  4. use Illuminate\Contracts\Container\Container;
  5. use JeroenNoten\LaravelAdminLte\Menu\Builder;
  6. use JeroenNoten\LaravelAdminLte\Events\BuildingMenu;
  7. class AdminLte
  8. {
  9. protected $menu;
  10. protected $filters;
  11. protected $events;
  12. protected $container;
  13. public function __construct(
  14. array $filters,
  15. Dispatcher $events,
  16. Container $container
  17. ) {
  18. $this->filters = $filters;
  19. $this->events = $events;
  20. $this->container = $container;
  21. }
  22. public function menu()
  23. {
  24. if (! $this->menu) {
  25. $this->menu = $this->buildMenu();
  26. }
  27. return $this->menu;
  28. }
  29. protected function buildMenu()
  30. {
  31. $builder = new Builder($this->buildFilters());
  32. if (method_exists($this->events, 'dispatch')) {
  33. $this->events->dispatch(new BuildingMenu($builder));
  34. } else {
  35. $this->events->fire(new BuildingMenu($builder));
  36. }
  37. return $builder->menu;
  38. }
  39. protected function buildFilters()
  40. {
  41. return array_map([$this->container, 'make'], $this->filters);
  42. }
  43. }

Swagger PHP library

Swagger is a library that helps to generate an interactive documentation for restful API using phpdoc annotations. It is compatible with OpenAPI 3.0, as it extracts code & existing annotations using a CLI interface.
Composer command: composer require zircote/swagger-php

Implementation

  1. /**
  2. * @OA\Info(title="My First API", version="0.1")
  3. */
  4. /**
  5. * @OA\Get(
  6. * path="/api/resource.json",
  7. * @OA\Response(response="200", description="An example resource")
  8. * )
  9. */

Laravel/Passport MongoDB

It is a service provider that helps to add support for Laravel Passport and MongoDB.
Composer command: composer require jenssegers/mongodb

Best PHP Ecommerce Libraries to Integrate in Web Apps

Stripe-PHP

Stripe is a popular e-payment platform used to conduct online transactions over the web. This package is specially made for PHP ecommerce applications to interact with the Stripe API. This library provides a fast, efficient access to the Stripe API and makes end-to-end connection secure between the platforms. The library includes predefined set of API classes which are compatible with most of Stripe versions.
Composer Command: composer require stripe/stripe-php

Omnipay

This payment processing PHP library allows fast connection to Omnipay web services. It deploys a very smooth web API that is fully unit-tested, advanced and comes with full documentation to ease out the configuration process. The package itself uses the powerful PHP-HTTP library to make HTTP requests, so that all the transactions becomes secure and reliable.
Composer Command: composer require league/omnipay

Laravel Cashier

Laravel Cashier provides a simple and easy-to-use interface for Stripe’s subscription billing services. All the boilerplate billing services come pre-coded in the library, so that you don’t have to worry for the complex configuration of payment billing. Using Laravel Cashier, you can easily handle coupons, discount codes, swapping subscription, invoices and other operations.
Composer Command: composer require laravel/cashier

Sylius

If you want to integrate Sylius with your PHP application, this library will help you in building the secure web connection. It is built with strong API structure to connect web applications safely with the Sylius ecommerce platform. Just navigate to composer and install the Sylius library, all the payment settings come pre configured in it, so that developers aren’t required to do extra work.
Composer Command: composer create-project sylius/sylius

Laravel Aimeos

Aimeos is one of the most used ecommerce packages for Laravel. It provides advanced ecommerce functionalities to the existing Laravel application. It is a composer based extension having compatibility with all the Laravel 5+ versions. It integrates the core online store components into the Laravel application and provides optimized ecommerce features for the applications.
Composer Command: composer require aimeos/aimeos-laravel

Spatie Image Optimizer

Image optimization improves application’s performance and holds a great value in the sights of Google Bot. Spatie is a specialized PHP image optimization library for Laravel applications. It can easily optimize PNGs, JPGs, SVGs and GIFs according to the required needs. This PHP image library comes pre-configured with multiple image optimization tools including JpegOptim, Optipng, Pngquant2, SVGO and Gifsicle. The interface is quite simple and is easy to work with even for beginners.
Composer Command: composer require spatie/image-optimizer

Elastica

Elasticsearch is a popular full-text search system widely used by most of the PHP developers all around the world. It allows fast data searching from the records stored in its database. This package is a PHP client for Elasticsearch, it provides pre-configured settings for Elasticsearch and gives fast data indexing for applications. It is compatible with all PHP 5+ versions and comes up with detailed installation documentation.
Composer Command: composer require ruflin/elastica

Intervention/image

This is another great tool to handle image optimization in PHP applications. Using this PHP image library, you can easily customize images as you wish. It provides you an easy-to-use interface for creating, editing and composing images. To integrate with Laravel applications easily, the PHP image library includes ServiceProviders and Facades as they facilitate hassle-free package installation process.
Composer Command: composer require predis/predis

Minify

Minification is one of the most important aspects of optimizing CSS and JavaScript files. It helps reducing the overhead programming patterns of the file and optimizes it according to the standards of web performance. This library helps developers to minify their CSS and JavaScripting files.
It removes the white spaces, strip comments and other unnoticed attributes from the code, making it light and simple to execute. It combines statements, small assets in CSS files and minifies few coding structures according to best standards.
Composer Command: composer require matthiasmullie/minify

Swap

Swap is a handy PHP library for working with currency exchange rates. It allows you to retrieve those exchange rates from the popular currency platforms like Fixer, currencylayer and others. It is one of the most used libraries for working with exchange rates, as it is also integrated with other libraries and has simple configuration pattern to work with.
Composer Command: composer require florianv/swap

Tcpdf

This PHP PDF library helps you generate high quality PDF documents. It supports all standard and custom page formats, making it simple for the users to work with PDF documents. The package provides several advanced formatting features including automatic page header and footer management, annotations, links, multiple columns (if needed), text rendering and various other features. In short, it’s a fine tool to work and manage PDF documents on the go.
Composer Command: composer require tecnickcom/tcpdf

Final Words

This brings us to the end of this article. I have listed in detail all the popular PHP libraries to work with in 2020. These libraries are primarily made to ease out the developers’ work load and to make them focus more on the core functional tasks. Moreover, it helps developers to configure several operations quickly, coupled with best functionalities.
If you want to suggest some more libraries/packages to this list, or want to share your thoughts on the topic, feel free to write them in the comments section below.

Comments