Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/thbley/php_frameworkless
Example Micro Service REST API with PHP, frameworkless
https://github.com/thbley/php_frameworkless
clickhouse docker frameworkless javascript jwt microservices mysql openapi php php8 phpstan phpunit psalm rector redis rest-api
Last synced: 23 days ago
JSON representation
Example Micro Service REST API with PHP, frameworkless
- Host: GitHub
- URL: https://github.com/thbley/php_frameworkless
- Owner: thbley
- License: mit
- Created: 2024-02-27T20:28:39.000Z (8 months ago)
- Default Branch: master
- Last Pushed: 2024-09-12T01:29:34.000Z (about 2 months ago)
- Last Synced: 2024-10-01T08:01:22.670Z (about 1 month ago)
- Topics: clickhouse, docker, frameworkless, javascript, jwt, microservices, mysql, openapi, php, php8, phpstan, phpunit, psalm, rector, redis, rest-api
- Language: PHP
- Homepage:
- Size: 1.59 MB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
PHP Frameworkless Micro Service Example
----------------------------------------[![Actions Build Status](https://github.com/thomasbley/example_tasks_php/workflows/build/badge.svg?branch=master)](https://github.com/thomasbley/example_tasks_php/actions)
Example micro service to provide a REST API to manage customer tasks.
The backend is written in PHP without a standard framework, stores data in MySQL/MariaDB,
uses ClickHouse for analytics and Redis as event stream.The frontend is written as an SPA in Typed JavaScript using ES Modules and Alpine.js.
#### Setup
# clone repository
git clone --depth=1 [email protected]:thbley/php_frameworkless.git
cd php_frameworkless# build container
docker compose -f docker-compose-tasks-be.yml -f docker-compose-tasks-fe.yml build --pull --no-cache --parallel# setup composer
mkdir -m 0777 tasks_be/src/vendor tasks_be/tests/vendor
chmod 0666 tasks_be/composer.json tasks_be/composer.lock tasks_be/tests/composer.json tasks_be/tests/composer.lock
docker compose -f docker-compose-tasks-be.yml run -u $(id -u) --rm composer
docker compose -f docker-compose-tasks-be.yml run -u $(id -u) --rm composer_tests# setup npm
mkdir -m 0777 tasks_fe/src/node_modules tasks_fe/tests/node_modules
chmod 0666 tasks_fe/src/package.json tasks_fe/src/package-lock.json tasks_fe/tests/package.json tasks_fe/tests/package-lock.json
docker compose -f docker-compose-tasks-fe.yml run -u $(id -u) --rm npm
docker compose -f docker-compose-tasks-fe.yml run -u $(id -u) --rm npm_tests# start containers
docker compose up
docker compose up -d# setup database
docker compose -f docker-compose-tasks-be.yml run --rm cli update_database.php#### Static code analyzers (backend)
docker compose -f docker-compose-tasks-be.yml run --rm psalm
docker compose -f docker-compose-tasks-be.yml run --rm psalm_taint
docker compose -f docker-compose-tasks-be.yml run --rm phpstan
docker compose -f docker-compose-tasks-be.yml run --rm rector
docker compose -f docker-compose-tasks-be.yml run --rm phpmd
docker compose -f docker-compose-tasks-be.yml run --rm phpcsfixer#### Static code analyzers and builders (frontend)
docker compose -f docker-compose-tasks-fe.yml run --rm biome
docker compose -f docker-compose-tasks-fe.yml run --rm stylelint
docker compose -f docker-compose-tasks-fe.yml run --rm tsclint
docker compose -f docker-compose-tasks-fe.yml run --rm htmlvalidate
docker compose -f docker-compose-tasks-fe.yml run -u $(id -u) --rm esbuild#### Tests (backend)
docker compose -f docker-compose-tasks-be.yml run --rm phpunit
docker compose -f docker-compose-tasks-be.yml run --rm phpunit_feature#### Tests (frontend)
docker compose -f docker-compose-tasks-fe.yml run -u $(id -u) --rm vitest
docker compose -f docker-compose-tasks-e2e.yml run --rm playwright
docker compose -f docker-compose-tasks-e2e.yml run -u $(id -u) --rm lighthouse#### Security scanning
docker images | grep example_tasks | awk '{print $1}' | xargs -n1 trivy image --scanners vuln
trivy fs --scanners vuln,config,secret,license --license-full --skip-dirs "tasks_be/tests/vendor/" ./docker images | grep example_tasks | awk '{print $1}' | xargs -n1 docker scout cves --locations
docker scout cves fs://.#### Convert API blueprint to OpenAPI-JSON, OpenAPI-PHP and HTML
chmod 0666 tasks_be/docs/api_openapi.json tasks_be/tests/data/api_openapi.php tasks_be/docs/api.html.gz
docker compose -f docker-compose-tasks-be.yml run -u $(id -u) --rm apib2openapi
docker compose -f docker-compose-tasks-be.yml run -u $(id -u) --rm apib2php
docker compose -f docker-compose-tasks-be.yml run -u $(id -u) --rm apib2html#### URLs
http://127.0.0.1:8080/tasks/ (Frontend SPA)
http://127.0.0.1:8080/v1/tasks (API endpoint)http://127.0.0.1:8080/docs/ (OpenAPI and HTML documentation)
http://127.0.0.1:8080/coverage/ (code coverage)
http://127.0.0.1:8025/ (Mailpit, catches all outgoing emails)#### Command line tests
export BASE=http://127.0.0.1:8080
export TOKEN=$(curl -s -X POST -d '{"email":"[email protected]","password":"insecure"}' "${BASE}/v1/customers/login" | jq -r '.token')
echo $TOKENcurl -i -X POST -d '{"title":"test","duedate":"2020-05-22"}' -H "Authorization: ${TOKEN}" "${BASE}/v1/tasks"
curl -i -X GET -H "Authorization: ${TOKEN}" "${BASE}/v1/tasks"
curl -i -X PUT -d '{"title":"test","duedate":"2020-05-22","completed":true}' -H "Authorization: ${TOKEN}" \
"${BASE}/v1/tasks/1"
curl -i -X GET -H "Authorization: ${TOKEN}" "${BASE}/v1/tasks?completed=1"
curl -i -X GET -H "Authorization: ${TOKEN}" "${BASE}/v1/tasks/1"
curl -i -X DELETE -H "Authorization: ${TOKEN}" "${BASE}/v1/tasks/1"# import task queue into redis stream
docker compose -f docker-compose-tasks-be.yml run --rm cli task_queue.php# import redis stream into clickhouse
docker compose -f docker-compose-tasks-be.yml run --rm cli task_stream.php# generate bearer token for customer id "42" with email "[email protected]"
docker compose -f docker-compose-tasks-be.yml run --rm cli generate_token.php \
42 [email protected]#### [architecture.md](https://github.com/thbley/php_frameworkless/blob/master/architecture.md)
#### [development.md](https://github.com/thbley/php_frameworkless/blob/master/development.md)