improve configurations for usage in multi-environment setups (#1775)
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -14,6 +14,7 @@ php.ini
|
|||||||
/config/packages/*-local.yaml
|
/config/packages/*-local.yaml
|
||||||
/config/packages/*/local.yaml
|
/config/packages/*/local.yaml
|
||||||
/config/packages/*/*-local.yaml
|
/config/packages/*/*-local.yaml
|
||||||
|
/config/bundles-local.php
|
||||||
|
|
||||||
public/avatars/*.png
|
public/avatars/*.png
|
||||||
|
|
||||||
|
|||||||
20
bin/console
20
bin/console
@@ -1,31 +1,23 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
set_time_limit(0);
|
|
||||||
|
|
||||||
if (!file_exists(__DIR__.'/../vendor/autoload.php')) {
|
|
||||||
echo 'Warning: You need to run "composer install" before you can use the console.' . \PHP_EOL;
|
|
||||||
die(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require __DIR__.'/../vendor/autoload.php';
|
|
||||||
|
|
||||||
use App\Kernel;
|
use App\Kernel;
|
||||||
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
use Symfony\Component\Console\Input\ArgvInput;
|
use Symfony\Component\Console\Input\ArgvInput;
|
||||||
use Symfony\Component\ErrorHandler\Debug;
|
use Symfony\Component\ErrorHandler\Debug;
|
||||||
use Symfony\Component\Dotenv\Dotenv;
|
use Symfony\Component\Dotenv\Dotenv;
|
||||||
|
|
||||||
|
set_time_limit(0);
|
||||||
|
|
||||||
|
require __DIR__.'/../vendor/autoload.php';
|
||||||
|
|
||||||
if (!isset($_SERVER['APP_ENV'])) {
|
if (!isset($_SERVER['APP_ENV'])) {
|
||||||
if (!class_exists(Dotenv::class)) {
|
|
||||||
throw new \RuntimeException('APP_ENV environment variable is not defined. You need to define environment variables or change the variables in your .env file.');
|
|
||||||
}
|
|
||||||
(new Dotenv(true))->load(__DIR__.'/../.env');
|
(new Dotenv(true))->load(__DIR__.'/../.env');
|
||||||
}
|
}
|
||||||
|
|
||||||
$input = new ArgvInput();
|
$input = new ArgvInput();
|
||||||
$env = $input->getParameterOption(['--env', '-e'], $_SERVER['APP_ENV'] ?? 'dev');
|
$env = $input->getParameterOption(['--env', '-e'], $_SERVER['APP_ENV'] ?? 'prod');
|
||||||
$debug = ($_SERVER['APP_DEBUG'] ?? ('prod' !== $env)) && !$input->hasParameterOption(['--no-debug', '']);
|
$debug = (bool) ($_SERVER['APP_DEBUG'] ?? (in_array($env, ['dev', 'test']))) && !$input->hasParameterOption(['--no-debug', '']);
|
||||||
|
|
||||||
if ($debug) {
|
if ($debug) {
|
||||||
umask(0000);
|
umask(0000);
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
jms_serializer:
|
|
||||||
visitors:
|
|
||||||
json_serialization:
|
|
||||||
options:
|
|
||||||
- JSON_PRETTY_PRINT
|
|
||||||
- JSON_UNESCAPED_SLASHES
|
|
||||||
- JSON_PRESERVE_ZERO_FRACTION
|
|
||||||
@@ -3,6 +3,10 @@ jms_serializer:
|
|||||||
datetime:
|
datetime:
|
||||||
default_format: 'Y-m-d\TH:i:sO' # DATE_ISO8601
|
default_format: 'Y-m-d\TH:i:sO' # DATE_ISO8601
|
||||||
visitors:
|
visitors:
|
||||||
|
json_serialization:
|
||||||
|
options:
|
||||||
|
- JSON_UNESCAPED_SLASHES
|
||||||
|
- JSON_PRESERVE_ZERO_FRACTION
|
||||||
xml_serialization:
|
xml_serialization:
|
||||||
format_output: '%kernel.debug%'
|
format_output: '%kernel.debug%'
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -302,8 +302,7 @@ kimai:
|
|||||||
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
# STORAGE
|
# STORAGE
|
||||||
# If you want to use directories outside the Kimai directory, change these
|
# That's the place where plugins can store static content
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
data_dir: '%kernel.project_dir%/var/data'
|
data_dir: '%kernel.project_dir%/var/data'
|
||||||
plugin_dir: '%kernel.project_dir%/var/plugins'
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
jms_serializer:
|
|
||||||
visitors:
|
|
||||||
json_serialization:
|
|
||||||
options:
|
|
||||||
- JSON_UNESCAPED_SLASHES
|
|
||||||
- JSON_PRESERVE_ZERO_FRACTION
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
webpack_encore:
|
|
||||||
# Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
|
|
||||||
# Available in version 1.2
|
|
||||||
cache: true
|
|
||||||
@@ -10,4 +10,4 @@ webpack_encore:
|
|||||||
|
|
||||||
# Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
|
# Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
|
||||||
# Available in version 1.2
|
# Available in version 1.2
|
||||||
#cache: '%kernel.debug%'
|
cache: '%kernel.debug%'
|
||||||
|
|||||||
@@ -9,14 +9,11 @@ require __DIR__.'/../vendor/autoload.php';
|
|||||||
|
|
||||||
// The check is to ensure we don't use .env in production
|
// The check is to ensure we don't use .env in production
|
||||||
if (!isset($_SERVER['APP_ENV'])) {
|
if (!isset($_SERVER['APP_ENV'])) {
|
||||||
if (!class_exists(Dotenv::class)) {
|
|
||||||
throw new \RuntimeException('APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.');
|
|
||||||
}
|
|
||||||
(new Dotenv(true))->load(__DIR__.'/../.env');
|
(new Dotenv(true))->load(__DIR__.'/../.env');
|
||||||
}
|
}
|
||||||
|
|
||||||
$env = $_SERVER['APP_ENV'] ?? 'prod';
|
$env = $_SERVER['APP_ENV'] ?? 'prod';
|
||||||
$debug = $_SERVER['APP_DEBUG'] ?? ('prod' !== $env);
|
$debug = (bool) ($_SERVER['APP_DEBUG'] ?? (in_array($env, ['dev', 'test'])));
|
||||||
|
|
||||||
if ($debug) {
|
if ($debug) {
|
||||||
umask(0000);
|
umask(0000);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ namespace App\Command;
|
|||||||
|
|
||||||
use App\Constants;
|
use App\Constants;
|
||||||
use Doctrine\DBAL\Connection;
|
use Doctrine\DBAL\Connection;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Helper\QuestionHelper;
|
use Symfony\Component\Console\Helper\QuestionHelper;
|
||||||
use Symfony\Component\Console\Input\ArrayInput;
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
@@ -18,6 +19,7 @@ use Symfony\Component\Console\Input\InputInterface;
|
|||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
||||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Command used to do the basic installation steps for Kimai.
|
* Command used to do the basic installation steps for Kimai.
|
||||||
@@ -69,7 +71,11 @@ final class InstallCommand extends Command
|
|||||||
|
|
||||||
$io->title('Kimai installation running ...');
|
$io->title('Kimai installation running ...');
|
||||||
|
|
||||||
$environment = getenv('APP_ENV');
|
/** @var Application $application */
|
||||||
|
$application = $this->getApplication();
|
||||||
|
/** @var KernelInterface $kernel */
|
||||||
|
$kernel = $application->getKernel();
|
||||||
|
$environment = $kernel->getEnvironment();
|
||||||
|
|
||||||
// create the database, in case it is not yet existing
|
// create the database, in case it is not yet existing
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -9,12 +9,14 @@
|
|||||||
|
|
||||||
namespace App\Command;
|
namespace App\Command;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Input\ArrayInput;
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Input\StringInput;
|
use Symfony\Component\Console\Input\StringInput;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Command used to update a Kimai installation.
|
* Command used to update a Kimai installation.
|
||||||
@@ -81,10 +83,11 @@ final class ReloadCommand extends Command
|
|||||||
return self::ERROR_LINT_TRANSLATIONS;
|
return self::ERROR_LINT_TRANSLATIONS;
|
||||||
}
|
}
|
||||||
|
|
||||||
$environment = getenv('APP_ENV');
|
/** @var Application $application */
|
||||||
if ($input->hasArgument('env')) {
|
$application = $this->getApplication();
|
||||||
$environment = $input->getArgument('env');
|
/** @var KernelInterface $kernel */
|
||||||
}
|
$kernel = $application->getKernel();
|
||||||
|
$environment = $kernel->getEnvironment();
|
||||||
|
|
||||||
// flush the cache, in case values from the database are cached
|
// flush the cache, in case values from the database are cached
|
||||||
$cacheResult = $this->rebuildCaches($environment, $io, $input, $output);
|
$cacheResult = $this->rebuildCaches($environment, $io, $input, $output);
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ namespace App\Command;
|
|||||||
|
|
||||||
use App\Constants;
|
use App\Constants;
|
||||||
use Doctrine\DBAL\Connection;
|
use Doctrine\DBAL\Connection;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Input\ArrayInput;
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Command used to update a Kimai installation.
|
* Command used to update a Kimai installation.
|
||||||
@@ -66,8 +68,11 @@ final class UpdateCommand extends Command
|
|||||||
|
|
||||||
$io->title('Kimai updates running ...');
|
$io->title('Kimai updates running ...');
|
||||||
|
|
||||||
// we cannot change the environment here, as it needs to be configured in the .env file before this command is started
|
/** @var Application $application */
|
||||||
$environment = getenv('APP_ENV');
|
$application = $this->getApplication();
|
||||||
|
/** @var KernelInterface $kernel */
|
||||||
|
$kernel = $application->getKernel();
|
||||||
|
$environment = $kernel->getEnvironment();
|
||||||
|
|
||||||
// make sure database is available, Kimai running and installed
|
// make sure database is available, Kimai running and installed
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class AppExtension extends Extension
|
|||||||
|
|
||||||
// safe alternatives to %kernel.project_dir%
|
// safe alternatives to %kernel.project_dir%
|
||||||
$container->setParameter('kimai.data_dir', $config['data_dir']);
|
$container->setParameter('kimai.data_dir', $config['data_dir']);
|
||||||
$container->setParameter('kimai.plugin_dir', $config['plugin_dir']);
|
$container->setParameter('kimai.plugin_dir', $container->getParameter('kernel.project_dir') . '/var/plugins');
|
||||||
|
|
||||||
$this->setLanguageFormats($config['languages'], $container);
|
$this->setLanguageFormats($config['languages'], $container);
|
||||||
unset($config['languages']);
|
unset($config['languages']);
|
||||||
|
|||||||
@@ -46,13 +46,7 @@ class Configuration implements ConfigurationInterface
|
|||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
->scalarNode('plugin_dir')
|
->scalarNode('plugin_dir')
|
||||||
->isRequired()
|
->setDeprecated('Changing the plugin directory via "kimai.plugin_dir" is not supported since 1.9')
|
||||||
->validate()
|
|
||||||
->ifTrue(function ($value) {
|
|
||||||
return !file_exists($value);
|
|
||||||
})
|
|
||||||
->thenInvalid('Plugin directory does not exist')
|
|
||||||
->end()
|
|
||||||
->end()
|
->end()
|
||||||
->append($this->getUserNode())
|
->append($this->getUserNode())
|
||||||
->append($this->getTimesheetNode())
|
->append($this->getTimesheetNode())
|
||||||
|
|||||||
@@ -98,6 +98,23 @@ class Kernel extends BaseKernel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->environment === 'test' && getenv('TEST_WITH_BUNDLES') === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we can either define all kimai bundles hardcoded ...
|
||||||
|
if (is_file($this->getProjectDir() . '/config/bundles-local.php')) {
|
||||||
|
$contents = require $this->getProjectDir() . '/config/bundles-local.php';
|
||||||
|
foreach ($contents as $class => $envs) {
|
||||||
|
if (isset($envs['all']) || isset($envs[$this->environment])) {
|
||||||
|
yield new $class();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... or we load them dynamically from the plugins directory
|
||||||
foreach ($this->getBundleDirectories() as $bundleDir) {
|
foreach ($this->getBundleDirectories() as $bundleDir) {
|
||||||
$bundleName = $bundleDir->getRelativePathname();
|
$bundleName = $bundleDir->getRelativePathname();
|
||||||
$pluginClass = 'KimaiPlugin\\' . $bundleName . '\\' . $bundleName;
|
$pluginClass = 'KimaiPlugin\\' . $bundleName . '\\' . $bundleName;
|
||||||
@@ -112,10 +129,6 @@ class Kernel extends BaseKernel
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->environment === 'test' && getenv('TEST_WITH_BUNDLES') === false) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$directories = [];
|
$directories = [];
|
||||||
$finder = new Finder();
|
$finder = new Finder();
|
||||||
$finder->ignoreUnreadableDirs()->directories()->name('*Bundle');
|
$finder->ignoreUnreadableDirs()->directories()->name('*Bundle');
|
||||||
@@ -207,9 +220,10 @@ class Kernel extends BaseKernel
|
|||||||
// load application routes
|
// load application routes
|
||||||
$routes->import($confDir . '/routes' . self::CONFIG_EXTS, '/', 'glob');
|
$routes->import($confDir . '/routes' . self::CONFIG_EXTS, '/', 'glob');
|
||||||
|
|
||||||
/** @var SplFileInfo $bundleDir */
|
foreach ($this->bundles as $bundle) {
|
||||||
foreach ($this->getBundleDirectories() as $bundleDir) {
|
if (strpos(\get_class($bundle), 'KimaiPlugin\\') !== false) {
|
||||||
$routes->import($bundleDir->getRealPath() . '/Resources/config/routes' . self::CONFIG_EXTS, '/', 'glob');
|
$routes->import($bundle->getPath() . '/Resources/config/routes' . self::CONFIG_EXTS, '/', 'glob');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ class AppExtensionTest extends TestCase
|
|||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
$container->setParameter('app_locales', 'de|en|tr|zh_CN');
|
$container->setParameter('app_locales', 'de|en|tr|zh_CN');
|
||||||
|
$container->setParameter('kernel.project_dir', realpath(__DIR__ . '/../../'));
|
||||||
|
|
||||||
return $container;
|
return $container;
|
||||||
}
|
}
|
||||||
@@ -55,7 +56,7 @@ class AppExtensionTest extends TestCase
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
'data_dir' => '/tmp/',
|
'data_dir' => '/tmp/',
|
||||||
'plugin_dir' => '/tmp/',
|
'plugin_dir' => '/tmp/', // still here, to make sure that this value is NOT applied!
|
||||||
'timesheet' => [],
|
'timesheet' => [],
|
||||||
'saml' => [
|
'saml' => [
|
||||||
'connection' => []
|
'connection' => []
|
||||||
@@ -72,7 +73,7 @@ class AppExtensionTest extends TestCase
|
|||||||
|
|
||||||
$expected = [
|
$expected = [
|
||||||
'kimai.data_dir' => '/tmp/',
|
'kimai.data_dir' => '/tmp/',
|
||||||
'kimai.plugin_dir' => '/tmp/',
|
'kimai.plugin_dir' => realpath(__DIR__ . '/../../') . '/var/plugins',
|
||||||
'kimai.languages' => [
|
'kimai.languages' => [
|
||||||
'en' => [
|
'en' => [
|
||||||
'date_time_type' => 'yyyy-MM-dd HH:mm',
|
'date_time_type' => 'yyyy-MM-dd HH:mm',
|
||||||
|
|||||||
@@ -54,10 +54,12 @@ class ConfigurationTest extends TestCase
|
|||||||
|
|
||||||
public function testValidatePluginDir()
|
public function testValidatePluginDir()
|
||||||
{
|
{
|
||||||
$this->expectException(InvalidConfigurationException::class);
|
$finalizedConfig = $this->getCompiledConfig($this->getMinConfig());
|
||||||
$this->expectExceptionMessage('Invalid configuration for path "kimai.plugin_dir": Plugin directory does not exist');
|
$finalizedConfig['plugin_dir'] = 'sdfsdfs';
|
||||||
|
|
||||||
$this->assertConfig($this->getMinConfig('/tmp/', 'sdfsdfs'), []);
|
$config = $this->getMinConfig('/tmp/', 'sdfsdfs');
|
||||||
|
|
||||||
|
$this->assertConfig($config, $finalizedConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testValidateLdapConfigUserBaseDn()
|
public function testValidateLdapConfigUserBaseDn()
|
||||||
|
|||||||
Reference in New Issue
Block a user