This is an open source project to initialize any restful symfony project. It is like the symfony skeleton but enriched with some main libraries and functionalities needed in most restful apps. Whether you are creating an API as a backend for a mobile app or a micro-service for a single page application (SPA), this project may be a shortcut to save you time, get inspired by how things are done, or better, clone it, adapt it and start working directly on the core of your app.
- Register a user
- Login
- Login with firebase (google, facebook...)
- Logout
- Show profile
- PHP 7.4 / Symfony 5.1
- Docker / Docker compose
- Make
- JWT
- Validation
- Unit tests
- Behat tests
- Custom Normalizer
- Database migrations
- Documentation with Swagger
- PHPCs-fixer
This is a guide on how to install the project, adapt and run it.
Here are the main tools you need to have in order to install the project and get it up and running:
- Docker CE
- Docker Compose
- Openssl
If you want to run the make commands instead of running each command separately you need to install make for linux.
- Clone the project
- Change any occurrence of
symfony-rest-api-initin all files to the project name you want to be using (optional) - Create your
docker-compose.override.ymlfile
cp docker-compose.override.yml.dist docker-compose.override.ymlNotice : Check the ports used in the docker-compose.override.yml and change them if needed (ports already used)
- Build the project and run it
docker-compose build
docker-compose up -d- In order to create the public and private keys needed to manage the JWT tokens, modify the pass_phrase and token_ttl in
config/packages/lexik_jwt_authentication.yamlthen run the following command
make jwtIf you don't want to use make, run the following commands instead
mkdir -p config/jwt
php -r "require'vendor/autoload.php';file_put_contents('passphrase.txt',\Symfony\Component\Yaml\Yaml::parse(file_get_contents('config/packages/lexik_jwt_authentication.yaml'))['lexik_jwt_authentication']['pass_phrase']);"
openssl genpkey -out ./config/jwt/private.pem -aes256 -pass file:passphrase.txt -algorithm rsa -pkeyopt rsa_keygen_bits:4096
openssl pkey -in ./config/jwt/private.pem -passin file:passphrase.txt -out config/jwt/public.pem -pubout
rm -f passphrase.txt
chown -R www-data:www-data ./config/jwt- Fix the permissions by running the following
sudo chmod -R 777 ./varThe config/jwt folder should remain secured but for development purpose where you need to rebuild the project for example you can change its permission too or delete it manually
- Prepare the database, the following command will delete the database if it exists, recreate it and run the migrations
make db-resetIf you will be using firebase auth you need to uncomment the following line in config/packages/firebase.yaml
# credentials: '%kernel.project_dir%/config/firebase/service-account.json'To use the firebase authentication, you need to create a firebase project and import the configuration in this project. Check the following to know how to do it:
- Documentation
- Youtube tutorial (coming soon)
Download the service account configuration file, rename it to service-account.json and put it in config/firebase
The following files are included in the project for test purpose to allow you to get a firebase token:
- Controller/TestController.php
- templates/oauth.html.twig Once the firebase login tested successfully don't forget to remove that.
Now you need to modify templates/oauth.html.twig to your own firebase project configuration.
To do so, get the firebase configuration from your project settings and replace the existent firebaseConfig in templates/oauth.html.twig line 40
Now go to http://localhost:8080/oauth and sign in, then the firebase token will be displayed, copy and use it with the firebase login route.
make unit-testTo see the unit tests coverage report run the following command
make unit-test-coverageThe coverage report will be accessible at public/coverage/index.html
make behat-testAPI root URL : http://localhost:8080
PhpMyAdmin : http://localhost:8082
Swagger documentation URL : http://localhost:8080/api/doc/v1
Access to a container : make bash
if( $youHaveAnyQuestion || $youHaveAnySuggestion ){
$mailer->sendMessageTo('[email protected]');
}