Edit this page

Configuration

To configure your project properly, basic configuration has to be set on entry point: public/index.php. This is mandatory config which tells the framework what is where.

All other configuration files are located in configs directory.

Mandatory - index.php

This configuration is used on every HTTP request and CLI call and it's mandatory for system to work. Here's what every item in index.php means.

site_url

This is domain with schema or array of domains with schema. Schema has to be defined so framework can know if you're using SSL or not. Remember that this is also used in CLI where domain can't be automatically detected.

example value meaning
https://example.com You're using domain example.com with SSL
http://localhost:3000 You're using domain localhost:3000 without SSL

You can get these values by using:

Class and method return value
Application::getDomain() You'll get domain part only, like example.com or localhost:3000
Application::isSSL() Returns true if https is detected, false otherwise
Application::getDomainWithSchema() Returns full schema and domain in use, like https://example.com or http://localhost:3000
Route::home() This is alias to Application::getDomainWithSchema()

assets

This is key-value array with the list of other domains or locations where your assets are located. This is useful if you're using CDN, or you simply want to have different locations for development and production environment.

key value meaning
static /static You placed your assets in public folder relative to the domain set under site_url
cdn https://cdn.example.com Your assets are placed behind CDN
dev http://localhost:3000/static Your assets can be reached locally

You can get the path to your assets using Route::asset(), where first parameter is the file name with or without additional sub-location and second parameter is optional key from the config above. If second parameter is not provided, framework will use the first item from assets array.

Example:

\Koldy\Route::asset('logo.png'); // returns https://example.com/static/logo.png
\Koldy\Route::asset('images/logo.png'); // returns https://example.com/static/images/logo.png

\Koldy\Route::asset('logo.png', 'cdn'); // returns https://cdn.example.com/logo.png
\Koldy\Route::asset('logo.png', 'dev'); // returns http://localhost:3000/static/logo.png

Final configuration in index.php would look like:

'assets' => [
    'static' => '/static',
    'cdn' => 'https://cdn.example.com',
    'dev' => 'http://localhost:3000/static'
]

paths

This gives you ability to make your own structure of the project or when needed in some special cases, some of the folders can be placed on totally different file system location outside of the project.

key meaning default
application Path to your application directory where by default is all other backend stuff [projectRoot]/application
storage Path to storage directory where usually are all files generated on the server. This directory is ignored by .gitignore by default. [projectRoot]/storage
view Path to your templates (or so called views) [projectRoot]/application/views
modules Path to your modules directory [projectRoot]/application/modules
scripts Path to your CLI scripts [projectRoot]/application/scripts
configs Path to directory where all config files are located [projectRoot]/configs - UPDATE FW

config

This gives you ability to override location of your configs per file.

Example: You might have a config file named site-conf.php in configs folder for your development environment and you're using it with Application::getConfig('site-conf') which is fine. In this case, framework will look for the config file on [projectRoot]/configs/site-conf.php by default. But, when your app is deployed on production server, you might want to read this config from a location outside of project root. In this case, you can define site-conf key with value like /var/configs/site-conf.php and framework will do the rest.

Final config would look like:

'config' => [
    'site-conf' => '/var/configs/other-conf.php'
]

env

This tells framework weather you're running in development or production mode. Note that there's no testing environment. More on that read under live section.

This setting is usually used on cases like error handling. Error details and stacktrace will be exposed during development so you can see error right away, while it won't be exposed on production environment.

value constant meaning
0 Application::DEVELOPMENT App is running in development environment
1 Application::PRODUCTION App is running in production environment

Final config example:

'env' => \Koldy\Application::PRODUCTION

Usage:

method meaning
Application::inDevelopment() Returns true if 0 is set for env
Application::inProduction() Returns true if 1 is set for env

If you're using Webpack, Gulp, Grunt, Bower or any other package manager, you'll probably want to handle paths to assets differently for development and differently on production server.

live

This is boolean variable that tells if you're running this system live or not. Framework internally doesn't use this setting, but you should.

In standard development, you'll need to implement 3rd party tracking code, like Google Analytics, Intercom and such, but you'll want to hide tracking code on all other systems other than live system.

Final config example:

'live' => true

To use this setting, use Application::isLive() which returns true or false.

Testing environment

If you're looking for testing environment, you can get it by combining live and env. This is how we see it:

env live meaning
development false You're running this system locally for development
development true You're running system locally, but including "live" stuff. This can be temporary, just for testing to see if you implemented everything correctly
production false You are running in production environment, but not live - this is testing because you're testing production build, but not using any tracking scripts
production true You are running fully live on your production server

timezone

This is standard timezone string from PHP. Put the timezone you need. Default is UTC and it's required.

In standard development when working with multiple timezones, all dates and times are stored in database or other permanent storage in UTC and when you need to show the time to user, it is then converted to the user's local timezone.

additional_include_path

As it says, this is array of additional include paths. This is useful if you're having multiple projects and you want to access directories on other locations or you have some library project outside of your project and you're depending on it.

Final config example:

'additional_include_path' => [__DIR__ . '/../../library']

key

This is random key with the maximum length of 32 characters that you should generate. Make it unique.

It is used when framework needs some uniqueness per project. For example, if you're using Crypt class and you try to encrypt and decrypt something without providing a key, framework will then use this key as its key for encrypting.

routing_class and routing_options

This is class name of routing class that will be used for resolving HTTP requests and translating it into controllers and methods. The class name has to extend \Koldy\Route\AbstractRoute in order to make this work.

Framework has \Koldy\Route\DefaultRoute class and there's 99% chance that it will suit all your needs just fine.

routing_options is array that will be passed to constructor of routing_class as first parameter.

Final config example:

'routing_class' => '\Koldy\Route\DefaultRoute',
'routing_options' => [
    'always_restful' => false
],

In our case, DefaultRoute accepts only always_restful setting. If you create your own routing class, then you can set the array of any structure here. Read more on DefaultRoute docs.

security

This block contains some common security stuff, such as OpenSSL default method and CSRF settings. Example:

'security' => [
    'openssl_default_method' => 'aes-256-cbc',

    'csrf' => [
        'enabled' => false,
        'parameter_name' => 'csrf',
        'cookie_name' => 'csrf_token',
        'session_key_name' => 'csrf_token'
    ]
]

Find more info about OpenSSL methods here.

Find more details about CSRF implementation here.

filesystem

This is array of some file system specific work. So far, only default chmod setting should be defined here. Example:

'filesystem' => [
    'default_chmod' => 0755
]

log

This is array of possible log writers. Think of it like this: when you use Log::debug('something');, where should it go? Should it end up in file on filesystem, database, in console, Slack or somewhere else? All log options should be configured here.

Read more about Log here.

Alternative Location Of Mandatory Configuration

Having all mandatory configuration in index.php is good for performance reasons - you eliminate loading configuration from other file on literally every execution. In some rare cases, you'd want to have this configuration in separate file, usually when you have multiple entry points (entry points that aren't going through index.php).

In this case, whole configuration array you're passing to useConfig() should be moved to configs/application.php:

return [
    'site_url' => 'https://domain.com',
    ...
];

Then, instead of passing array to useConfig(), simply pass location of application.php file. If application.php is within configs folder, you can use:

Koldy\Application::useConfig(__DIR__ . '/../configs/application.php');