A simple microframework for creating REST API's using symfony components
This is the general overview of how the application has been bootstrapped using Symfony components.
The entry point for all requests to this application is the public/index.php file. All requests are directed to this file by your web server ( Nginx) configuration. The index.php file doesn't contain much code. Rather, it is a starting point for loading the rest of the application.
The index.php file loads the Composer generated autoloader definition, database and then retrieves an instance of the Symfony DI container from bootstrap/container.php script.
bootstrap/container.php register other components I have written in the bootstrap directory.
Once it creates the instance of the container then I have registered the route definition for our application. After that our container instance will handle the request and will return the response accordingly.
-
The Root Directory
- The
appDirectory - The
bootstrapDirectory - The
contractsDirectory - The
databaseDirectory - The
publicDirectory - The
testsDirectory - The
vendorDirectory
- The
-
The
AppDirectory- The
ControllersDirectory - The
ExceptionDirectory - The
ModelDirectory - The
RedirectionDirectory - The
securityDirectory
- The
I have used some Symfony and laravel components to create a minimal framework for creating this application. This framework can be used for writing any RESTful API.
The app directory, as you might expect, contains the core code of the application.
It contains all the domain and business-related logic. I'll explain that code in below section.
The bootstrap directory contains the various files which bootstrap the framework.
It contains the container where all required files are registered in a DI container. It is the heart of the framework. This directory is responsible for initializing the database, controller resolver, repository resolver and handling the responses and middlewares.
The contracts directory can contain all the interfaces regarding bootstrapping of the application. Currently, it only contains the one contract regarding the middleware.
The database directory contains the migration script which can be run against any databases as it utilizes the Illuminate\Database component.
The providers directory contains the validation factory and appserviceprovider where you can specify all the controller repositories if you have injected in any controller. Once you define the dependency here framework will automatically resolve it. As I have written the RepositoryResolver component in bootstrap directory.
The public directory contains the index.php file, which is the entry point for all requests entering in our application and configures autoloading.
The tests directory contains all your automated tests. You can run your tests using the phpunit or vendor/bin/phpunit commands.
The vendor directory contains your Composer dependencies.
This is where all the application controllers are defined.
This is where all exceptions are being handled and displayed to the user.
This is where all the models have been defined. It also contains some classes related to search functionality. It contains response transformers, traits, and contracts related to business logic.
This handles the extra slashes in the URL and redirects to appropriate route.
This handles the extra slashes in the URL and redirects to appropriate route.
Used following components. First I have used all the latest Symfony components but due to an older version of PHP in docker image. So I have downgraded the components to version 3.4.
"symfony/http-foundation": "^4.0", (object-oriented layer for the HTTP specification.)
"symfony/routing": "^4.0", (For routing the request)
"symfony/dependency-injection": "^4.0", (For dependecny injection)
"symfony/http-kernel": "^4.0", (For a structured process of converting a `Request` into a `Response`
"illuminate/database": "^5.6", (For database abstraction)
"illuminate/validation": "^5.6", (Used for validation. I have written validation factory for this.)
"phpunit/phpunit": "^7.1", (For writing test cases)
Laravel also provides the separate components for building your own framework. Here is the GitHub link for this. https://github.com/illuminate