Feature Language Change Composer Dependency Changed PBF PR-6.1-dev Pending

User tests: Successful: Unsuccessful:

avatar Fedik
Fedik
11 Jan 2026

Pull Request for Issue #36898 .

Alternative to PR #45523 .

Summary of Changes

This is complete (I hope) implementation of environment variables in Joomla.

This version uses Symfony\Dotenv component which have an ability to use php file for the environment variables caching. Which should improve security and boot speed. Also provides CLI commands for dump .env to php file, and for debugging of existing variables.

Compared to vlucas/phpdotenv used in #45523 Symfony\Dotenv lacks of customization (like custom Parser etc) but we probably will not bee need it any time soon.

Key points:

  • By default the feature is disabled. Create .env (or .env.local.php) in root folder to enable it. Or for CLI run command as JOOMLA_ENV=test php cli/joomla.php foobar-comand
  • I tried to keep the variable names in sync with Joomla Docker. If you find something is missing or a typo, please let me know.
  • The installation can be completed with environment variables (except language part). This work with CLI and WEB installer. User can provide all options via environment variables (including admin user info) or a few (like DB only, then installer will ask for missing options).
  • The configuration options provided by environment variables cannot be edited in backend, also via CLI.
  • The default JOOMLA_ENV is prod. In this state .env file is not allowed and must be used .env.local.php instead. During installation of prod environment installer will dump .env to .env.local.php and remove .env.

New CLI commands:

  • php cli/joomla.php config-dotenv:dump compiles .env files into a PHP-optimized file .env.local.php
  • php cli/joomla.php config-dotenv:debug displays all the environment variables configured by dotenv.

Testing Instructions

Test installation, test with Web and in CLI installer

  1. Create .env with DB options:
JOOMLA_DB_TYPE="mysql"
JOOMLA_DB_HOST="Your DB host"
JOOMLA_DB_USER="Your DB user"
JOOMLA_DB_PASSWORD="Your DB password"
JOOMLA_DB_NAME="Your db name"
JOOMLA_DB_PREFIX="DB prefix"

And run installer. You should be asked for Site name, and User information.
Then installation should be completed, as usual.

  1. Create .env with all installation parameters and user information:
JOOMLA_DB_TYPE="mysql"
JOOMLA_DB_HOST="Your DB host"
JOOMLA_DB_USER="Your DB user"
JOOMLA_DB_PASSWORD="Your DB password"
JOOMLA_DB_NAME="Your db name"
JOOMLA_DB_PREFIX="DB prefix"

JOOMLA_SITE_NAME="Test installation"
JOOMLA_PUBLIC_FOLDER=""

JOOMLA_ADMIN_USER="Your admin user"
JOOMLA_ADMIN_USERNAME="Your admin username"
JOOMLA_ADMIN_PASSWORD="Your admin user password"
JOOMLA_ADMIN_EMAIL="Your admin user email"

And run installer. You will not be asked for Site name, and User information.
The installation should be completed, as usual.

Test the existing site

Create .env.local.php with DB options, and copy options from configuration.php.
(skip this step if the site was installed with use of .env)

<?php

return [
  'JOOMLA_DB_TYPE' => 'mysql',
  'JOOMLA_DB_HOST' => 'Your DB host',
  'JOOMLA_DB_USER' => 'Your DB user',
  'JOOMLA_DB_PASSWORD' => 'Your DB password',
  'JOOMLA_DB_NAME' => 'Your db name',
  'JOOMLA_DB_PREFIX' => 'DB prefix',
];

Then visit the site, all should work as before.

Link to documentations

Please select:

  • Documentation link for docs.joomla.org:
  • No documentation changes for docs.joomla.org needed
  • Pull Request link for manual.joomla.org: TBD
  • No documentation changes for manual.joomla.org needed
avatar Fedik Fedik - open - 11 Jan 2026
avatar Fedik Fedik - change - 11 Jan 2026
Status New Pending
avatar joomla-cms-bot joomla-cms-bot - change - 11 Jan 2026
Category Repository Administration com_config Language & Strings External Library Composer Change Installation JavaScript Libraries
avatar Fedik Fedik - change - 11 Jan 2026
Labels Added: Feature Language Change Composer Dependency Changed PR-6.1-dev
avatar HLeithner
HLeithner - comment - 16 Jan 2026

I'm still not happy with 2 things, enforce a environment variable to use environment variables and that the it's allowed with out public folder.

avatar Fedik
Fedik - comment - 17 Jan 2026

enforce a environment variable to use environment variables

Sorry I did not understand this part, what do you mean?

that the it's allowed with out public folder

It is safe to use now, and for prod env it will require PHP version.
Also requiring "public folder" will make impossible to do installation using env variables which makes whole changes useless.

avatar Elfangor93
Elfangor93 - comment - 31 Jan 2026

I tried to test this PR. So I created the .env file with the content you mentioned.
When perfoming the installation using the Web installer everything is like without the .env file. I had to enter everything by hand.
When perfoming the installation using the CLI I get ased all the inputs like without the .env file. But instead of the super user password prompt I get the following output over and over again.

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Helper\QuestionHelper.php on line 412

 [WARNING] Value for admin-password is incorrect: Field required: Set the password for your Super User account

 Set the password for your Super User account:
 > Das System kann den angegebenen Pfad nicht finden.
 
Call Stack:
    0.0004     493400   1. {main}() D:\wamp64\www\joom6test\installation\joomla.php:0
    0.0019     505800   2. require_once('D:\wamp64\www\joom6test\installation\includes\cli.php') D:\wamp64\www\joom6test\installation\joomla.php:39
    0.1466    5285672   3. Joomla\Console\Application->execute() D:\wamp64\www\joom6test\installation\includes\cli.php:67
    0.2162    5315216   4. Joomla\Console\Application->doExecute() D:\wamp64\www\joom6test\libraries\vendor\joomla\console\src\Application.php:413
    0.2955    7268160   5. Joomla\Console\Application->runCommand($command = class Joomla\CMS\Installation\Console\InstallCommand { private ${Joomla\Console\Command\AbstractCommand}aliases = []; private ${Joomla\Console\Command\AbstractCommand}application = class Joomla\CMS\Installation\Application\CliInstallationApplication { protected $config = class Joomla\Registry\Registry { ... }; protected ?Psr\Log\LoggerInterface $logger = class Joomla\CMS\Log\DelegatingPsrLogger { ... }; private ${Joomla\Application\AbstractApplication}dispatcher = class Joomla\Event\Dispatcher { ... }; private ${Joomla\Console\Application}autoExit = TRUE; private ${Joomla\Console\Application}catchThrowables = TRUE; private ${Joomla\Console\Application}commands = [...]; private ${Joomla\Console\Application}commandLoader = NULL; private ${Joomla\Console\Application}consoleInput = class Symfony\Component\Console\Input\ArgvInput { ... }; private ${Joomla\Console\Application}consoleOutput = class Symfony\Component\Console\Output\ConsoleOutput { ... }; private ${Joomla\Console\Application}defaultCommand = 'list'; private ${Joomla\Console\Application}definition = class Symfony\Component\Console\Input\InputDefinition { ... }; private ${Joomla\Console\Application}helperSet = class Symfony\Component\Console\Helper\HelperSet { ... }; private ${Joomla\Console\Application}initialised = TRUE; private ${Joomla\Console\Application}name = 'Joomla CLI installation'; private ${Joomla\Console\Application}runningCommand = ...; private ${Joomla\Console\Application}terminal = class Symfony\Component\Console\Terminal { ... }; private ${Joomla\Console\Application}version = '6.1.0-alpha3'; private ${Joomla\Console\Application}wantsHelp = FALSE; public $input = NULL; protected $language = class Joomla\CMS\Language\Language { ... }; protected $mvcFactory = class Joomla\CMS\MVC\Factory\MVCFactory { ... }; protected $session = class Joomla\CMS\Session\Session { ... }; protected $clientId = 2; protected $identity = NULL; private $userFactory = NULL; private $container = NULL }; private ${Joomla\Console\Command\AbstractCommand}applicationDefinitionMerged = TRUE; private ${Joomla\Console\Command\AbstractCommand}applicationDefinitionMergedWithArgs = TRUE; private ${Joomla\Console\Command\AbstractCommand}definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; private ${Joomla\Console\Command\AbstractCommand}description = 'Install the Joomla CMS'; private ${Joomla\Console\Command\AbstractCommand}help = '<info>%command.name%</info> will install Joomla\n\t\t\nUsage: <info>php %command.full_name%</info>'; private ${Joomla\Console\Command\AbstractCommand}helperSet = class Symfony\Component\Console\Helper\HelperSet { private array $helpers = [...] }; private ${Joomla\Console\Command\AbstractCommand}hidden = FALSE; private ${Joomla\Console\Command\AbstractCommand}name = 'install'; private ${Joomla\Console\Command\AbstractCommand}synopsis = ['short' => 'install [options] [--] <command>', 'long' => 'install [--site-name SITE-NAME] [--admin-user ADMIN-USER] [--admin-username ADMIN-USERNAME] [--admin-password ADMIN-PASSWORD] [--admin-email ADMIN-EMAIL] [--db-type DB-TYPE] [--db-host DB-HOST] [--db-user DB-USER] [--db-pass [DB-PASS]] [--db-name DB-NAME] [--db-prefix DB-PREFIX] [--db-encryption DB-ENCRYPTION] [--db-sslkey [DB-SSLKEY]] [--db-sslcert [DB-SSLCERT]] [--db-sslverifyservercert [DB-SSLVERIFYSERVERCERT]] [--db-sslca [DB-SSLCA]] [--db-sslcipher [DB-SSLCIPHER]] [--public-folder [PUBLIC-FOLDER]] [-h|'...]; protected $ioStyle = class Symfony\Component\Console\Style\SymfonyStyle { private Symfony\Component\Console\Output\OutputInterface ${Symfony\Component\Console\Style\OutputStyle}output = class Symfony\Component\Console\Output\ConsoleOutput { ... }; private Symfony\Component\Console\Helper\SymfonyQuestionHelper $questionHelper = class Symfony\Component\Console\Helper\SymfonyQuestionHelper { ... }; private Symfony\Component\Console\Helper\ProgressBar $progressBar = *uninitialized*; private int $lineLength = 119; private Symfony\Component\Console\Output\TrimmedBufferOutput $bufferedOutput = class Symfony\Component\Console\Output\TrimmedBufferOutput { ... }; private Symfony\Component\Console\Input\InputInterface $input = class Symfony\Component\Console\Input\ArgvInput { ... }; private Symfony\Component\Console\Output\OutputInterface $output = class Symfony\Component\Console\Output\ConsoleOutput { ... } }; protected $cliInput = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { ... }; protected $stream = NULL; protected array $options = [...]; protected array $arguments = [...]; protected bool $interactive = TRUE; private array $tokens = [...]; private array $parsed = [...] } }, $input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected array $options = []; protected array $arguments = ['command' => 'install']; protected bool $interactive = TRUE; private array $tokens = [0 => 'install']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... }; private bool $decorated = TRUE }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) D:\wamp64\www\joom6test\libraries\vendor\joomla\console\src\Application.php:374
    0.2971    7371624   6. Joomla\Console\Command\AbstractCommand->execute($input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected array $options = []; protected array $arguments = ['command' => 'install']; protected bool $interactive = TRUE; private array $tokens = [0 => 'install']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... }; private bool $decorated = TRUE }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) D:\wamp64\www\joom6test\libraries\vendor\joomla\console\src\Application.php:1078
    0.2974    7373344   7. Joomla\CMS\Installation\Console\InstallCommand->doExecute($input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected array $options = []; protected array $arguments = ['command' => 'install']; protected bool $interactive = TRUE; private array $tokens = [0 => 'install']; private array $parsed = [] }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... }; private bool $decorated = TRUE }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) D:\wamp64\www\joom6test\libraries\vendor\joomla\console\src\Command\AbstractCommand.php:234
    0.3359    8570104   8. Joomla\CMS\Installation\Console\InstallCommand->getCLIOptions() D:\wamp64\www\joom6test\installation\src\Console\InstallCommand.php:101
    7.0553    9429200   9. Joomla\CMS\Installation\Console\InstallCommand->getStringFromOption($option = 'admin-password', $question = 'Set the password for your Super User account', $field = class Joomla\CMS\Form\Field\PasswordField { protected $description = 'INSTL_ADMIN_PASSWORD_LENGTH'; protected $hint = ''; protected $autocomplete = 'new-password'; protected $spellcheck = TRUE; protected $autofocus = FALSE; protected $element = class SimpleXMLElement { public $@attributes = [...] }; protected $form = class Joomla\CMS\Form\Form { protected $data = class Joomla\Registry\Registry { ... }; protected $errors = [...]; protected $name = 'jform'; protected $options = [...]; protected $xml = class SimpleXMLElement { ... }; protected $controlFields = [...]; public $repeat = FALSE; private $databaseAwareTraitDatabase = class Joomla\Database\Mysqli\MysqliDriver { ... }; private $currentUser = class Joomla\CMS\User\User { ... } }; protected $formControl = 'jform'; protected $hidden = FALSE; protected $hiddenLabel = FALSE; protected $hiddenDescription = FALSE; protected $translateLabel = TRUE; protected $translateDescription = TRUE; protected $translateHint = TRUE; protected $id = 'jform_admin_password'; protected $input = NULL; protected $label = NULL; protected $multiple = FALSE; public $repeat = FALSE; protected $pattern = ''; protected $validationtext = ''; protected $name = 'jform[admin_password]'; protected $fieldname = 'admin_password'; protected $group = ''; protected $required = TRUE; protected $disabled = FALSE; protected $readonly = FALSE; protected $type = 'Password'; protected $validate = 'password'; protected $value = ''; protected $default = ''; protected $size = 0; protected $class = 'required'; protected $labelclass = ''; protected $onchange = ''; protected $onclick = ''; protected $showon = ''; protected $parentclass = NULL; protected $layout = 'joomla.form.field.password'; protected $layoutData = []; protected $renderLayout = 'joomla.form.renderfield'; protected $renderLabelLayout = 'joomla.form.renderlabel'; protected $layoutPaths = [0 => '']; protected $dataAttributes = []; private ${Joomla\CMS\Form\FormField}databaseAwareTraitDatabase = class Joomla\Database\Mysqli\MysqliDriver { private ${Joomla\Database\DatabaseDriver}database = ''; public $name = 'mysqli'; public $serverType = NULL; protected $connection = NULL; protected $count = 0; protected $cursor = NULL; protected $executed = FALSE; protected $limit = 0; protected $nameQuote = '`'; protected $nullDate = '0000-00-00 00:00:00'; protected $offset = 0; protected $options = [...]; protected $sql = NULL; protected $statement = NULL; protected $tablePrefix = ''; protected $utf = TRUE; protected $errorNum = 0; protected $errorMsg = NULL; protected $transactionDepth = 0; protected $factory = class Joomla\Database\DatabaseFactory { ... }; protected $monitor = NULL; private ${Joomla\Database\DatabaseDriver}dispatcher = class Joomla\Event\Dispatcher { ... }; protected $utf8mb4 = FALSE; protected $mariadb = FALSE }; private ${Joomla\CMS\Form\FormField}currentUser = class Joomla\CMS\User\User { protected $isRoot = NULL; public $id = 0; public $name = NULL; public $username = NULL; public $email = NULL; public $password = NULL; public $password_clear = ''; public $block = NULL; public $sendEmail = 0; public $registerDate = NULL; public $lastvisitDate = NULL; public $activation = NULL; public $params = NULL; public $groups = [...]; public $guest = 1; public $lastResetTime = NULL; public $resetCount = NULL; public $requireReset = NULL; public $typeAlias = NULL; public $otpKey = NULL; public $otep = NULL; public $authProvider = NULL; protected $_params = class Joomla\Registry\Registry { ... }; protected $_authGroups = NULL; protected $_authLevels = NULL; protected $_authActions = NULL; protected $_errorMsg = NULL; protected $_errors = [...]; private bool $useExceptions = FALSE }; protected $threshold = 66; protected $minLength = 12; protected $maxLength = 99; protected $minIntegers = 0; protected $minSymbols = 0; protected $minUppercase = 0; protected $minLowercase = 0; protected $meter = TRUE; protected $force = FALSE; protected $rules = FALSE; protected $lock = FALSE }) D:\wamp64\www\joom6test\installation\src\Console\InstallCommand.php:262
    9.1882    9450744  10. Symfony\Component\Console\Style\SymfonyStyle->askHidden($question = 'Set the password for your Super User account', $validator = ???) D:\wamp64\www\joom6test\installation\src\Console\InstallCommand.php:383
    9.1882    9450968  11. Symfony\Component\Console\Style\SymfonyStyle->askQuestion($question = class Symfony\Component\Console\Question\Question { private ?int $attempts = NULL; private bool $hidden = TRUE; private bool $hiddenFallback = TRUE; private ?Closure $autocompleterCallback = NULL; private ?Closure $validator = NULL; private ?Closure $normalizer = NULL; private bool $trimmable = TRUE; private bool $multiline = FALSE; private ?int $timeout = NULL; private string $question = 'Set the password for your Super User account'; private string|int|float|bool|null $default = NULL }) D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Style\SymfonyStyle.php:229
    9.1882    9450936  12. Symfony\Component\Console\Helper\QuestionHelper->ask($input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 1; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected array $options = []; protected array $arguments = ['command' => 'install']; protected bool $interactive = TRUE; private array $tokens = [0 => 'install']; private array $parsed = [] }, $output = class Symfony\Component\Console\Style\SymfonyStyle { private Symfony\Component\Console\Output\OutputInterface ${Symfony\Component\Console\Style\OutputStyle}output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { ... }; private array $consoleSectionOutputs = [...] }; private Symfony\Component\Console\Helper\SymfonyQuestionHelper $questionHelper = class Symfony\Component\Console\Helper\SymfonyQuestionHelper { protected ?Symfony\Component\Console\Helper\HelperSet $helperSet = NULL }; private Symfony\Component\Console\Helper\ProgressBar $progressBar = *uninitialized*; private int $lineLength = 119; private Symfony\Component\Console\Output\TrimmedBufferOutput $bufferedOutput = class Symfony\Component\Console\Output\TrimmedBufferOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private int $maxLength = 4; private string $buffer = '\n > ' }; private Symfony\Component\Console\Input\InputInterface $input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { ... }; protected $stream = NULL; protected array $options = [...]; protected array $arguments = [...]; protected bool $interactive = TRUE; private array $tokens = [...]; private array $parsed = [...] }; private Symfony\Component\Console\Output\OutputInterface $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { ... }; private array $consoleSectionOutputs = [...] } }, $question = class Symfony\Component\Console\Question\Question { private ?int $attempts = NULL; private bool $hidden = TRUE; private bool $hiddenFallback = TRUE; private ?Closure $autocompleterCallback = NULL; private ?Closure $validator = NULL; private ?Closure $normalizer = NULL; private bool $trimmable = TRUE; private bool $multiline = FALSE; private ?int $timeout = NULL; private string $question = 'Set the password for your Super User account'; private string|int|float|bool|null $default = NULL }) D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Style\SymfonyStyle.php:307
    9.1882    9450936  13. Symfony\Component\Console\Helper\QuestionHelper->doAsk($inputStream = resource(1) of type (stream), $output = class Symfony\Component\Console\Style\SymfonyStyle { private Symfony\Component\Console\Output\OutputInterface ${Symfony\Component\Console\Style\OutputStyle}output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { ... }; private array $consoleSectionOutputs = [...] }; private Symfony\Component\Console\Helper\SymfonyQuestionHelper $questionHelper = class Symfony\Component\Console\Helper\SymfonyQuestionHelper { protected ?Symfony\Component\Console\Helper\HelperSet $helperSet = NULL }; private Symfony\Component\Console\Helper\ProgressBar $progressBar = *uninitialized*; private int $lineLength = 119; private Symfony\Component\Console\Output\TrimmedBufferOutput $bufferedOutput = class Symfony\Component\Console\Output\TrimmedBufferOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private int $maxLength = 4; private string $buffer = '\n > ' }; private Symfony\Component\Console\Input\InputInterface $input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { ... }; protected $stream = NULL; protected array $options = [...]; protected array $arguments = [...]; protected bool $interactive = TRUE; private array $tokens = [...]; private array $parsed = [...] }; private Symfony\Component\Console\Output\OutputInterface $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { ... }; private array $consoleSectionOutputs = [...] } }, $question = class Symfony\Component\Console\Question\Question { private ?int $attempts = NULL; private bool $hidden = TRUE; private bool $hiddenFallback = TRUE; private ?Closure $autocompleterCallback = NULL; private ?Closure $validator = NULL; private ?Closure $normalizer = NULL; private bool $trimmable = TRUE; private bool $multiline = FALSE; private ?int $timeout = NULL; private string $question = 'Set the password for your Super User account'; private string|int|float|bool|null $default = NULL }) D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Helper\QuestionHelper.php:62
    9.1889    9450536  14. Symfony\Component\Console\Helper\QuestionHelper->getHiddenResponse($output = class Symfony\Component\Console\Style\SymfonyStyle { private Symfony\Component\Console\Output\OutputInterface ${Symfony\Component\Console\Style\OutputStyle}output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { ... }; private array $consoleSectionOutputs = [...] }; private Symfony\Component\Console\Helper\SymfonyQuestionHelper $questionHelper = class Symfony\Component\Console\Helper\SymfonyQuestionHelper { protected ?Symfony\Component\Console\Helper\HelperSet $helperSet = NULL }; private Symfony\Component\Console\Helper\ProgressBar $progressBar = *uninitialized*; private int $lineLength = 119; private Symfony\Component\Console\Output\TrimmedBufferOutput $bufferedOutput = class Symfony\Component\Console\Output\TrimmedBufferOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private int $maxLength = 4; private string $buffer = '\n > ' }; private Symfony\Component\Console\Input\InputInterface $input = class Symfony\Component\Console\Input\ArgvInput { protected Symfony\Component\Console\Input\InputDefinition $definition = class Symfony\Component\Console\Input\InputDefinition { ... }; protected $stream = NULL; protected array $options = [...]; protected array $arguments = [...]; protected bool $interactive = TRUE; private array $tokens = [...]; private array $parsed = [...] }; private Symfony\Component\Console\Output\OutputInterface $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 32; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { ... }; private array $consoleSectionOutputs = [...] } }, $inputStream = resource(1) of type (stream), $trimmable = TRUE) D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Helper\QuestionHelper.php:109
    9.2211    9450536  15. rtrim($string = NULL) D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Helper\QuestionHelper.php:412

Do I have to do anything else than just create the .env file?

avatar Fedik
Fedik - comment - 31 Jan 2026

If I right remember it is some issue with Laragon
Similar problem #45523 (comment)

avatar Elfangor93
Elfangor93 - comment - 31 Jan 2026

@Fedik Have I done something wrong?
Do I need to do something additional then just creating the .env file? Do I need to add it as an environment variable or something?
Because in my test it seems to ignore the .env completely.

I tested with Joomla! 6.1.0 Alpha 3 and PHP v8.3.24.

avatar Fedik
Fedik - comment - 31 Jan 2026

Depend how did you run the test.

The PR can be tested only with prebuilt package or using GIT.
It cannot be tested with patch tester.

avatar Fedik Fedik - change - 31 Jan 2026
Labels Added: PBF
avatar Fedik
Fedik - comment - 31 Jan 2026

I fixed PR conflict, wait when build is finished. Then can download new prebuilt package.

avatar Elfangor93
Elfangor93 - comment - 31 Jan 2026

Oke, now the tests with the Web UI were successful. But with CLI it does not work.
If I do not provide any info for the super user credentials in the .env file then I get the error I already reported:

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Helper\QuestionHelper.php on line 412

 [WARNING] Value for admin-password is incorrect: Field required: Set the password for your Super User account

 Set the password for your Super User account:
 > Das System kann den angegebenen Pfad nicht finden.

If I provide info for the super user credentials in the .env file then I get the following error, even though I pasted th same password which worked in the Web UI installation:

Install Joomla
==============

Checking system requirements...OK
Collecting configuration...OK

In CliInstallationApplication.php line 143:

  Password is too short. Passwords must have at least 12 characters.
avatar Fedik
Fedik - comment - 31 Jan 2026

The CLI error I already commented #46665 (comment)
It can be something to do with your installation.

Please try CLI install without this PR using latest joomla stable release, does it work?

avatar Elfangor93
Elfangor93 - comment - 31 Jan 2026

Please try CLI install without this PR using latest joomla stable release, does it work?

No. With Joomla 6.0.2 (stable release) it also does not work. Here I also get

Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated in D:\wamp64\www\joom6test\libraries\vendor\symfony\console\Helper\QuestionHelper.php on line 412

 [WARNING] Value for admin-password is incorrect: Field required: Set the password for your Super User account

 Set the password for your Super User account:
 > Das System kann den angegebenen Pfad nicht finden.
avatar Fedik
Fedik - comment - 31 Jan 2026

Okay, so it is something to do with your local PHP installation.

avatar Elfangor93
Elfangor93 - comment - 31 Jan 2026

Okay, so it is something to do with your local PHP installation.

Then it seems that I can not test this PR. Sorry...

Add a Comment

Login with GitHub to post a comment