Я использую Lumen 8. и я хочу использовать конфигурацию внутри .env.testing
но он всегда читает конфигурацию внутри .env
< sizestests/TestCase.php
<?php
use Dotenv\Dotenv;
abstract class TestCase extends Tests\Utilities\UnitTest\Testing\TestCase
{
public static function setUpBeforeClass(): void
{
Dotenv::createImmutable(dirname(__DIR__), '.env.testing')->load();
parent::setUpBeforeClass();
}
public function createApplication()
{
return require __DIR__ . '/../bootstrap/app.php';
}
}
< sizes.env.testing
APP_ENV=testing
APP_DEBUG=false
DB_CONNECTION=mysql
DB_HOST=db_testing
DB_PORT=3307
DB_DATABASE=db_testing
DB_USERNAME=db_username
DB_PASSWORD=db_password
< EM> .env
APP_ENV=local
APP_DEBUG=false
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3307
DB_DATABASE=db_local
DB_USERNAME=db_username
DB_PASSWORD=db_password
Когда я отлаживаю тестовый файл, например dd(DB::connection()->getDatabaseName());
он возвращает db_local
вместо db_testing
Я не хочу добавлять всю свою конфигурацию внутрь phpunit.xml
чего не хватает? Что я должен делать?
2 ответа
Вы загружаете файл среды в новый экземпляр репозитория, но ваше приложение lumen не знает, что экземпляр репозитория существует.
Затем, когда ваш файл bootstrap/app.php
запускается, он создает экземпляр репозитория, загруженный с вашим обычным файлом .env
, который lumen знает, как использовать.
Самым чистым решением, вероятно, является удаление метода setUpBeforeClass()
и просто обновление файла bootstrap/app.php
для поддержки загрузки различных файлов .env.
Один пример:
$env = env('APP_ENV');
$file = '.env.'.$env;
// If the specific environment file doesn't exist, null out the $file variable.
if (!file_exists(dirname(__DIR__).'/'.$file)) {
$file = null;
}
// Pass in the .env file to load. If no specific environment file
// should be loaded, the $file parameter should be null.
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
dirname(__DIR__),
$file
))->bootstrap();
Если вы обновите файл bootstrap/app.php
с помощью этого кода, тогда вы можете указать одну переменную среды в файле phpunit.xml
, чтобы установить для переменной APP_ENV
значение testing
. Если вы это сделаете, приведенный выше код загрузит файл .env.testing
.
NB: вся теория основана на чтении кода. непроверенный.
Довольно интересно, что lumen не поддерживает имена динамических файлов среды после того, как они удалили поддержку artisan. Ссылка на Проблема
Так что в основном вам нужно перейти в ручной режим
В вашем файле bootstrap.app
// boostrap.php
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
\dirname(__DIR__),
))->bootstrap();
class LoadEnvironmentVariables
{
protected $filePath;
protected $fileName;
// change the $name, i.e the env file name to your env file manually
public function __construct($path, $name = null)
{
$this->filePath = $path;
$this->fileName = $name;
}
....
Вот еще одна ссылка, которая может помочь
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.