Package Data | |
---|---|
Maintainer Username: | not-empty |
Package Create Date: | 2020-07-25 |
Package Last Update: | 2024-11-07 |
Home Page: | |
Language: | PHP |
License: | GPL-3.0-only |
Last Refreshed: | 2024-11-09 15:10:07 |
Package Statistics | |
---|---|
Total Downloads: | 8 |
Monthly Downloads: | 0 |
Daily Downloads: | 0 |
Total Stars: | 24 |
Total Watchers: | 2 |
Total Forks: | 12 |
Total Open Issues: | 1 |
API Rest based in lumen using query builder that auto generate base code for simple crud (with automatic generated 100% unit and feature tests).
Release 6.0.0 Requires PHP 8.2
Release 5.0.0 Requires PHP 8.1
Release 4.0.0 Requires PHP 7.4
Release 3.0.0 Requires PHP 7.3
Release 2.0.0 Requires PHP 7.2
Release 1.0.0 Requires PHP 7.1
composer create-project and enter in the created folder (you can fork or clone the repository if you want to)
composer create-project not-empty/ala-microframework-php your_project_name
(optional) Stop all other containers to avoid conflict.
docker stop $(docker ps -q)
Start project with Docker using compose tool.
docker-compose up -d
Access the container
docker exec -it ala-php bash
Run Composer to install all dependencies.
composer install --prefer-dist
Ensure the folder ./storage are with all rights to save log and cache (alread set in composer install, but ...)
chmod -R 777 ./storage
To check the build for this project look at ./ops/docker/dev folder.
Copy and modify the .env file
cp .env.example .env
Include values for APP_KEY
and JWT_APP_SECRET
, we strongly recommend a 26 to 32 length random string (can be a ulid)
You can use /health/key
uri to generate this keys.
Now you can access the health-check http://localhost:8101 and get a json response like this:
{
"status": "online",
"version": "0.0.1"
}
You can find a sample of requests you can do in the file requests.http
(for the REST Client extension on VSCode) or using curl commands listed in the file requests.curl
.
Not all requests are documented yet (Work in progress)
For create your brand new domain with a complete crud use the command:
php artisan create:domain {your_domain}
This command will create a folder in app/Domains
, new files in routes
, database/migrations
and database/seeds
folder with all base code including all the units and feature tests.
If your domain name has 2 words use underline (_) to separate.
database/migrations
with all your fields and indexesapp/Domains/{your_domain}/Http/Parameters
app/Domains/{your_domain}/Http/Validators
app/Domains/{your_domain}/Businesses
bootstrap/{your_domain}_routes
folderFor primary key value, this project using Ulid value, but you can pass other pattern in insert route if you prefer.
You can use the validate reserved word ulid
in app/Domains/{your_domain}/Http/Validators
folder. Config in app/Providers/AppServiceProvider.php
For example:
/**
* get rules for this request
* @return array
*/
public function getRules(): array
{
return [
'another_id' => 'required|ulid',
];
}
In auth route this projet use JWT lib. This token will be generate if your secret, token and context is correct. This configuration is the token.php
file in app/config/
folder.
We strongly advise you to change these values, they can be either random strings, ulids or any string that you like.
We use to generate then by encrypting an ulid v4 with SHA512/256.
We recommend creating diferents tokens from diferents sources.
return [
'data' => [
'32c5a206ee876f4c6e1c483457561dbed02a531a89b380c3298bb131a844ac3c' => [ // default token
'name' => 'app-test', // default context
'secret' => 'a1c5930d778e632c6684945ca15bcf3c752d17502d4cfbd1184024be6de14540', // default secret
],
],
];
To make request between two or more services, this project use Request Service lib.
The pattern used to return all request is json and the layout is configure in your Response lib.
Follow this steps to configure a new field to accepted a filter in list route
app/Domains/{your_domain}/Http/Validators/{your_domain}ListValidator
you can change or add more filters options.For example, to add a filter to age
field just include a new entry like that
/**
* get rules for this request
* @return array
*/
public function getRules() : array
{
return [
'class' => 'string|in:"asc","desc"',
'fields' => 'string',
'order' => 'string',
'page' => 'integer|min:1',
'filter_name' => 'string|filter',
'filter_age' => 'string|filter', /* here your new filter */
];
}
After that, you need to configure your filters in app/Domains/{your_domain}/Filters
.
you can user various patterns like FILTER_EQUAL
, FILTER_NOT_EQUAL
, etc.
Check all types look at FiltersTypesConstants
class in app/Constants
.
/**
* set filter rules for this domain
*/
public $filter = [
'age' => [
'validate' => 'integer|min:18|max:99',
'permissions' => [
FiltersTypesConstants::FILTER_EQUAL,
FiltersTypesConstants::FILTER_NOT_EQUAL,
],
],
'created' => [
'validate' => 'date',
'permissions' => [
FiltersTypesConstants::FILTER_LESS_THAN,
FiltersTypesConstants::FILTER_GREATER_THAN,
FiltersTypesConstants::FILTER_GREATER_THAN_OR_EQUAL,
FiltersTypesConstants::FILTER_LESS_THAN_OR_EQUAL,
],
],
'modified' => [
'validate' => 'date',
'permissions' => [
FiltersTypesConstants::FILTER_LESS_THAN,
FiltersTypesConstants::FILTER_GREATER_THAN,
FiltersTypesConstants::FILTER_GREATER_THAN_OR_EQUAL,
FiltersTypesConstants::FILTER_LESS_THAN_OR_EQUAL,
],
],
];
After that you can send this param in url query, for example:
/{your_domain}/list?filter_name=lik,vitor
OR /{your_domain}/list?filter_name=eql,vitor
.
Use this project with MySql with no relationship keys and NOT use JOIN.
Don't forget to change APP_ENV
to production
value. This enable the op_cache PHP extension, so dont use in development environment.
The production docker is located in ops/docker/prod
and you can change the Nginx config or PHP all the way you want.
Want to contribute? Great!
Make a change and be careful with your updates! Any new code will only be accepted with all validations.
To ensure that the entire project is fine:
First install the dependences (with development ones)
composer install --dev --prefer-dist
Second run all validations
composer checkall
You can run all validations plus test coverage metrics
composer checkallcover
We create this project under stricts good pratices rules. Bellow you can see some composer commands to validate the framework code and your code as well.
We recommend you aways run the composer checkallcover
command to validate all your code, tests and coverage.
lint - check for sintax errors on PHP (PHP Lint)
composer lint
cs - check for smells in general (Code Snifer)
composer cs
mess - check for smells in a more deep way (Mess Detector)
composer mess
test - run all tests (Unit and Feature)
composer test
test-cover - run all tests with code coverage (Unit and Feature)
composer test-cover
test-unit - run all unit tests
composer test-unit
test-unit-cover - run all unit tests with code coverage
composer test-unit-cover
test-feat - run all feature tests
composer test-feat
test-feat-cover - run all feature tests with code coverage
composer test-feat-cover
ccu - check unit coverage level (100% is required)
composer ccu
ccf - check feature coverage level (100% is required)
composer ccf
check - execute lint, cs, mess and unit tests
composer check
checkcover - execute lint, cs, mess and unit tests with coverage
composer check
checkall - execute lint, cs, mess, unit and feature tests
composer check
checkall - execute lint, cs, mess, unit and feature tests with coverage
composer check
#Sonarqube
This project is also validated with Sonarqube, has a sonar-project.properties
file to support sonarqube execution.
To do that, edit the sonar-project.properties
with your sonar url (maybe something like http://192.168.0.2:9900 if you running sonar in your machine), and then execute sonar scan.
If you want to force the checkallcover
in your project before commit, you can just copy the file ops/contrib/pre-commit
to your .git/hook
. Be aware your development environment will need to have PHP with xdebug installed in order to commit.
cp ops/contrib/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
You can create an automatic seeder to generate data using you add endpoint to tests purposes (or any other purpose you like).
To do that you must create a random seeder with the command:
php artisan random:create {domain_name}
It will create a file inside app/Seeds/
with your domain name with all possibilities.
You may change to fullfill your needs (and your domain validations)
Now you may configure on .env
the SEED_URL
and SEED_PORT
environments. (if you want to run inside docker don't change at all).
And run your seed with the domain name and the amount to records to generate.
php artisan random:seed {domain_name} {number_of_records}
Then use the list endpoint, or make a select in database to see the results.
Not Empty Foundation - Free codes, full minds