diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ada63d6..14bdd88 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,3 +1,5 @@ +# Documentation:https://github.com/samuelgfeller/slim-example-project/wiki/GitHub-Actions#build-testing +# How to deploy: https://github.com/samuelgfeller/slim-example-project/wiki/GitHub-Actions#deploying-to-server name: 🧪 Build test on: push: @@ -7,6 +9,10 @@ on: pull_request: types: [ opened, synchronize, reopened ] +env: + # Set APP_ENV to 'github' so that settings.php loads the correct configuration for database migrations and testing + APP_ENV: github + jobs: run: runs-on: ${{ matrix.operating-system }} @@ -69,8 +75,6 @@ jobs: - name: Execute database migrations run: composer migrate-prod - env: - APP_ENV: github - name: Show test db tables run: mysql -uroot -proot -D ${{ matrix.test-database }} -e "SHOW TABLES;" @@ -78,5 +82,4 @@ jobs: - name: Run test suite run: composer test env: - APP_ENV: github PHP_CS_FIXER_IGNORE_ENV: 1 diff --git a/.scrutinizer.yml b/.scrutinizer.yml index a2f59fd..a9e47b8 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,7 +1,6 @@ filter: paths: [ "src/*" ] - excluded_paths: [ "vendor/*", "tests/*", "resources/", "public/", "src/Infrastructure/Console/**", - "src/Application/ErrorHandler/**", ] + excluded_paths: [ "vendor/*", "tests/*", "resources/", "public/", "src/Infrastructure/Console/**", "src/Application/ErrorHandler/**", ] checks: php: diff --git a/README.md b/README.md index f172e40..b75de89 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,11 @@

Slim API starter

[![Latest Version on Packagist](https://img.shields.io/github/release/samuelgfeller/slim-api-starter.svg)](https://packagist.org/packages/slim-api-starter) +[![Code Coverage](https://scrutinizer-ci.com/g/samuelgfeller/slim-api-starter/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/samuelgfeller/slim-api-starter/?branch=master) +[![Build Status](https://scrutinizer-ci.com/g/samuelgfeller/slim-api-starter/badges/build.png?b=master)](https://scrutinizer-ci.com/g/samuelgfeller/slim-api-starter/build-status/master) +[![Quality Score](https://img.shields.io/scrutinizer/quality/g/samuelgfeller/slim-api-starter.svg)](https://scrutinizer-ci.com/g/samuelgfeller/slim-api-starter/?branch=master) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE) + [Slim 4](https://www.slimframework.com/) API starter template with a few examples and some essential [features](#features) to build a secure and scalable API following 2024 best practices and @@ -65,7 +70,7 @@ demo table `user`: composer migrate ``` -### 4. Insert demo data +#### 4. Insert demo data You can install four demo users into the database to test the API response by running the following command: @@ -81,7 +86,7 @@ Replace the matrix value "test-database" `slim_api_starter_test` with the name o your test database as you specified in `config/env/env.test.php`. If you are not using Scrutinizer, remove the "Scrutinizer Scan" step from the workflow. -### Done! +#### Done! That's it! Your project should now be fully set up and ready to use. If you are using XAMPP and installed the project in the `htdocs` folder, you can access it via http://localhost/project-name. diff --git a/config/env/env.dev.php b/config/env/env.dev.php index 32f6a9b..13e88df 100644 --- a/config/env/env.dev.php +++ b/config/env/env.dev.php @@ -1,6 +1,7 @@ 'val', 'nextKey' => 'nextVal',]; + * correct: $settings['db]['key'] = 'val'; $settings['db]['nextKey'] = 'nextVal'; + * incorrect $settings['db'] = [ 'key' => 'val', 'nextKey' => 'nextVal',]; + * Every key must be set by its own to not overwrite the entire array. + * + * Documentation: https://github.com/samuelgfeller/slim-example-project/wiki/Configuration */ // $_ENV['APP_ENV'] should be set to "prod" in the secret env.php file of the prod server. diff --git a/config/env/env.prod.php b/config/env/env.prod.php index 4e3a0ba..d25c8c6 100644 --- a/config/env/env.prod.php +++ b/config/env/env.prod.php @@ -1,19 +1,16 @@ 'val', 'nextKey' => 'nextVal',]; - * good $settings['db]['key'] = 'val'; $settings['db]['nextKey'] = 'nextVal'; - * It's mandatory to set every key by its own and not remap the entire array + * correct: $settings['db]['key'] = 'val'; $settings['db]['nextKey'] = 'nextVal'; + * incorrect $settings['db'] = [ 'key' => 'val', 'nextKey' => 'nextVal',]; + * Every key must be set by its own to not overwrite the entire array. */ -// error_reporting taken from server php.ini -// display_errors value defined in server - // Error handler. More controlled than ini $settings['error']['display_error_details'] = false; @@ -22,4 +19,3 @@ // $settings['db']['database'] = ''; // $settings['api']['allowed_origin'] = 'https://prod-frontend-domain.com'; -$settings['api']['allowed_origin'] = 'https://slim-api-starter-frontend.samuel-gfeller.ch'; diff --git a/public/frontend/home.html b/public/frontend/home.html index a9b6ffc..4e61476 100644 --- a/public/frontend/home.html +++ b/public/frontend/home.html @@ -8,12 +8,13 @@

Frontend for Slim API Starter

-

This frontend is an example of a separate application that will communicate with the API.

+

This frontend is an example of a separate application that communicates with the API.

The link to the actual frontend must be added to the $settings['api']['allowed_origin'] in the config files: config/env/env.dev.php and config/env/env.prod.php.

-

You can test the API by clicking on the button below. It should request the list of users - that were inserted for demonstration purposes.

+

You can test the API by clicking on the button below which will make an Ajax + GET request to retrieve the list of users + that are in the database.

diff --git a/tests/Integration/Api/CorsMiddlewareTest.php b/tests/Integration/Api/CorsMiddlewareTest.php new file mode 100644 index 0000000..fc98daa --- /dev/null +++ b/tests/Integration/Api/CorsMiddlewareTest.php @@ -0,0 +1,23 @@ +createRequest('OPTIONS', ''); + $response = $this->app->handle($request); + $allowedUrl = $this->container->get('settings')['api']['allowed_origin']; + // Check that the response contains the Access-Control-Allow-Origin header + self::assertSame($allowedUrl, $response->getHeaderLine('Access-Control-Allow-Origin')); + } +}