Symfony4 uygulamaları varsayılan olarak uygulama değişkenleri için .env dosyasını kullanırlar. Bu örneğimizde dinamik olarak uygulamamıza tarayıcıdan ve terminalden ulaştığımızda .env.test dosyasını kullanacağız. Bu işlem için aşağıdaki adımları atmamız gerekecek.


Dosyalar


config/packages/doctrine.yaml


Bu dosya composer require doctrine komutu çalıştırıldığı zaman otomatik olarak yaratılır.


parameters:
env(DATABASE_URL): ''

doctrine:
dbal:
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci

url: '%env(resolve:DATABASE_URL)%'
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App

config/packages/test/doctrine.yaml


Bu dosyayı yaratın. Versiyon için $ sqlite3 --version komutunu çalıştırabilirsiniz.


doctrine:
dbal:
driver: 'pdo_sqlite'
server_version: '3.11.0'

bin/console


Aşağıdaki eki $kernel = new Kernel($env, $debug); satırının tam uzerine yerleştirin.


if ($env === 'test') {
(new Dotenv())->load(__DIR__.'/../.env.test');
}

public/index_test.php


Öncelikle public/index.php dosyasının içeriğini kopyalayıp bu dosyayı aşağıdaki değişikliklerle birlikte yaratın.


# Replace
$env = $_SERVER['APP_ENV'] ?? 'dev';
# with
$env = 'test';

# Add line below right above $kernel = new Kernel($env, $debug);
(new Dotenv())->load(__DIR__.'/../.env.test');

.env


Bu dosya zaten mevcut ve sadece dev ortamı için kullanılır.


###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=d7f88292186a64eeef558337bb2f0f43
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
DATABASE_URL=mysql://root:root@127.0.0.1:3306/symfony
###< doctrine/doctrine-bundle ###

.env.test


Bu dosyayı yaratın.


###> symfony/framework-bundle ###
APP_ENV=test
APP_SECRET=d7f88292186a64eeef558337bb2f0f43
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
DATABASE_URL=sqlite:///%kernel.project_dir%/var/cache/test/database.db
###< doctrine/doctrine-bundle ###

Nginx konfigürasyon


server {
listen 80;

server_name symfony-4-0-skeleton.dev;

root /srv/www/symfony/4-0-skeleton/public;

location / {
try_files $uri /index.php$is_args$args;
}

# REMOVE THIS WHOLE BLOCK IN PRODUCTION
location ~ ^/index_test\.php(/|$) {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}

location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}

location ~ \.php$ {
return 404;
}

error_log /var/log/nginx/symfony_4_0_skeleton_error.log;
access_log /var/log/nginx/symfony_4_0_skeleton_access.log;
}

Test


Eğer tarayıcınızdan http://192.168.99.30 adresine giderseniz, uygulamanız .env dosyasından MySQL veritabanını kullanacaktır. Eğer http://192.168.99.30/index_test.php adresine giderseniz, uygulamanız .env.test dosyasından SQLite veritananını kullanacaktır. Aynı durum terminal komutlarına ... -env=test ekini eklediğiniz zamanda geçerli olacaktır.