Skip to content

Repository files navigation

Application Package

Packagist PHP Version SupportPackagist VersionPackagist DownloadsComposer dependenciesTest workflowCodecov

Application skeleton with strict minimum Router and Environment.

Dependencies

Environment package: https://github.com/rancoud/Environment
Router package: https://github.com/rancoud/Router

Installation

composer require rancoud/application

How to use it?

General

Requirements

You need .env file and route file called for example routes.php
Content of default .env (all values are optionals, you can use an empty .env file if you want)

# setup timezone, by default use UTC (valid timezones are checked against DateTimeZone::listIdentifiers())TIMEZONE=null# file names that contain route configurations, if null it will load all files in current folder provided to the Application constructorROUTES=null# to enable all DEBUG_* parametersDEBUG=false# enable error_reporting: show php errorsDEBUG_PHP=false# save PSR-7 request object for Application->getDebugInfos()DEBUG_REQUEST=false# save PSR-7 response object for Application->getDebugInfos()DEBUG_RESPONSE=false# save queries for Application->getDebugInfos()DEBUG_DATABASE=false# add all values of Session object to Application->getDebugInfos()DEBUG_SESSION=false# add memory usage/limit/percentage to Application->getDebugInfos()DEBUG_MEMORY=false# save elapsed time of each call of Application->run() for Application->getDebugInfos()DEBUG_RUN_ELAPSED_TIMES=false# add all included files included to Application->getDebugInfos()DEBUG_INCLUDED_FILES=false

DEBUG_* infos are available with Application->getDebugInfos(); (except DEBUG_PHP)
Content of routes.php

<?phpuseRancoud\Http\Message\Factory\Factory;
useRancoud\Http\Message\Stream;
/** @var \Rancoud\Router\Router $router */$router->any('/home', staticfunction ($request, $next) {
return (newFactory())->createResponse()->withBody(Stream::create('hello world'));
});

Usage

// you have to set thoses required folders$folders = [
'ROOT' => 'folder/path/of/env', // ROOT is used to read the .env file (must be a folder)'ROUTES' => 'folder/path/of/routes'// ROUTES is used to initialize the router with routes (must be a folder, so it will read php files inside it)
];
$app = newApplication($folders);
// create server request from globals$request = (new \Rancoud\Http\Message\Factory\Factory())->createServerRequestFromGlobals();
// you can also create request from scratch for example// $request = new \Rancoud\Http\Message\ServerRequest('GET', '/home');// $response can be null if no route AND no default404 has been found by the Router$response = $app->run($request);
// you can send response output directly (if not null of course)$response->send();

You can add more folders in constructor

$folders = [
'ROOT' => 'folder/path/of/env',
'ROUTES' => 'folder/path/of/routes',
'EXTRA' => 'folder/path/of/extra'
];
$app = newApplication($folders);
// you can access to specific folders$folderExtra = Application::getFolder('EXTRA');

Environment File

You can specify another environment file instead of using .env in ROOT folder

$env = newEnvironment(['folder/path/of/env'], 'another.env');
$app = newApplication($folders, $env);
// you can access to the environment$config = Application::getConfig();

Routes

By default it will load all php files in the ROUTES folder.
You can specify in .env file which routes files you want to use.

# in this example, it will require() 3 files: www.php , backoffice.php and api.php in the routes folderROUTES=www,backoffice,api

This example show how to add routes for the router

$config = [
'routes' => [
[
'methods' => ['GET'],
'url' => '/',
'callback' => function($a,$b){
return (newMessageFactory())->createResponse(200, null, [], 'home');
},
'name' => 'test_home'
]
]
];
/* @var \Rancoud\Router\Router $router */$router->setupRouterAndRoutesWithConfigArray($config);

Router

$app = newApplication($folders, $env);
$router = Application::getRouter();

Database

You have to use this Database package

$app = newApplication($folders, $env);
Application::setDatabase($database);
$db = Application::getDatabase();
$infos = $app->getDebugInfos();
// when enabled, all saved queries will be display in $infos['database']

You are free to use something else if you don't use functions setDatabase and getDatabase.

Session

You can use this Session package
It is used in the function getDebugInfos()
You are free to use something else.

Timezone

By default the timezone used will be UTC
You can specify a timezone in .env file

# valid timezones are checked with DateTimeZone::listIdentifiers()TIMEZONE="Europe/Paris"

Debug Infos

You have to enable it in .env file

# to enable all DEBUG_* parametersDEBUG=true# enable error_reporting: show php errorsDEBUG_PHP=true# save PSR-7 request object for Application->getDebugInfos()DEBUG_REQUEST=true# save PSR-7 response object for Application->getDebugInfos()DEBUG_RESPONSE=true# save queries for Application->getDebugInfos()DEBUG_DATABASE=true# add all values of Session object to Application->getDebugInfos()DEBUG_SESSION=true# add memory usage/limit/percentage to Application->getDebugInfos()DEBUG_MEMORY=true# save elapsed time of each call of Application->run() for Application->getDebugInfos()DEBUG_RUN_ELAPSED_TIMES=true# add all included files included to Application->getDebugInfos()DEBUG_INCLUDED_FILES=true

Bags

You can put whatever you want in "bags", like your own database driver

$app = newApplication($folders, $env);
Application::setInBag('db', $mydb);
$dbInBag = Application::getFromBag('db');
Application::removeFromBag('db');

Application Constructor

Settings

Mandatory

ParameterTypeDescription
foldersarrayFolder's list. ROOT and ROUTES are mandatory

Optionals

ParameterTypeDefault valueDescription
envRancoud\Environment\EnvironmentnullSetup a different .env file

Application Methods

General Commands

  • run(request: \Psr\Http\Message\ServerRequestInterface): ?\Rancoud\Http\Message\Response
  • getDebugInfos(): array

Static Methods

  • getFolder(index: string): string
  • getInstance(): Rancoud\Application\Application
  • getConfig(): Rancoud\Environment\Environment
  • setDatabase(database: Rancoud\Database\Database): void
  • getDatabase(): ?Rancoud\Database\Database
  • getRouter(): Rancoud\Router\Router
  • getFromBag(name: string): mixed
  • removeFromBag(name: string): void
  • setInBag(name: string, object: mixed): void

Optionals Dependencies

Database package: https://github.com/rancoud/Database
Session package: https://github.com/rancoud/Session

How to Dev

composer ci for php-cs-fixer and phpunit and coverage
composer lint for php-cs-fixer
composer test for phpunit and coverage