Zjistíte, že ukládání dat na váš server je velká zátěž a že situace není ideální. Otevřete prohlížeč a začnete vyhledávat "efektivní způsob jak uložit data". Nakonec se rozhodnete využít Amazon S3. Protože používáte Laravel, otevřete si config/filesystems.php, změníte výchozí hodnotu z local na s3 a doplníte API klíč. A to je vše. Tak snadno můžete nahrávat data na Amazon S3.

Magie? Ne. Toto je příklad konfigurovatelného systému. Díky nastavení některých hodnot v poli získáme jiné nastavení bez nutnosti zasahovat kamkoliv jinam. V tomto článku si o konfiguracích v Laravelu povíme více a také si ukážeme jak si vytvořit svůj vlastní konfigurační soubor.

Jak konfigurace funguje?

Celá Laravel konfigurace je postavena na balíčku vlucas/phpdotenv, která umožňuje automaticky načítat enviromentální proměnné z .env souboru. Všechny konfigurační soubory jsou umístěny v root adresáři config/. Framework hned po instalaci poskytuje několik konfiguračních souborů, díky čemuž můžete velmi jednoduše například změnit řadič (drive) databáze a definovat si jinou externí službu.

Například zde je ukázka konfiguračního souboru config/database.php:

return [
    'connections' => [
        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],
// ...

Všimněte si, že metodu env() můžete použít k volání enviromentálního souboru .env, který pro každé prostředí (produkce, staging, local) může obsahovat jiné hodnoty.

V helperu env() můžete také specifikovat výchozí hodnotu v případě, že enviromentální proměnná bude chybět. Opět například v config/database.php můžeme nastavit, aby výchozí připojení bylo mysql v případě, že nebude definováno jinak:

return [
    'default' => env('DB_CONNECTION', 'mysql'),
    // ...

Přístup ke konfiguraci

Nejčastější způsob jak se dostat ke konkrétní Laravel konfiguraci je pomocí helperu config():

$ php artisan tinker

>>> app('config')->get('services')
=> [
     "mailgun" => [
       "domain" => null,
       "secret" => null,
       "endpoint" => "api.mailgun.net",
     ],
     "postmark" => [
       "token" => null,
     ],
     "ses" => [
       "key" => "",
       "secret" => "",
       "region" => "us-east-1",
     ],
   ]

Helper config() umožňuje zjednodušení a stále stejný přístup ke konfiguračnímu repozitáři:

$ php artisan tinker

>>> config()
=> Illuminate\Config\Repository {#55}

>>> config()->get('services')
// ...
   
>>> config('services')
// ...

Práce s konfigurací

Konfigurace je definována v PHP polích a díky dot (tečkové) notaci lze k nim mít jednoduchý přístup. První část argumentu helperu config() obsahuje název souboru a další části souboru jsou rozděleny tečkou:

$ php artisan tinker

>>> config('services.mailgun');
=> [
     "domain" => null,
     "secret" => null,
     "endpoint" => "api.mailgun.net",
   ]

>>> config('services.mailgun.endpoint');
=> "api.mailgun.net"

Stejně jako env() helper, i konfigurační helper umožňuje specifikovat výchozí hodnotu pokud konfigurační klíč neexistuje:

$ php artisan tinker

>>> config('my.invalid.key', 'mg.example.com');
=> mg.example.com

Konfigurační hodnotu můžete také změnit/nastavit v průběhu vykonávání kódu pomocí pole:

>>> config(['example' => 'Hello World']);
=> null
>>> config('example');
=> "Hello World"

Vytvořte si vlastní konfiguraci

Vlastní konfiguraci si můžete vytvořit přidáním souboru do adresáře config/. Například si vytvoříme novou konfiguraci api:

$ touch config/api.php

A okamžitě máte přístup ke všem konfiguračním hodnotám definovaným v této konfiguraci. Stačí používat prefix api:

>>> config('api.base_url');

Toto je pouze příklad, pokud potřebujete API pro použití nějaké služby, můžete využít již existující konfiguraci config/services.php a přidat pouze nový klíč, například pokud chcete přidat službu auth0:

<?php

return [
    'auth0' => [
        'secret' => env('AUTH0_CLIENT_SECRET')
    ],
];

Optimalizace konfigurace

Pokud používáte deploy aplikace na produkci, pak by jste měli optimalizovat konfiguraci pomocí tohoto artisan příkazu:

$ php artisan config:cache

Nicméně je potřeba ohledně toho příkazu zmínit dvě věci:

  • Tento příkaz by se neměl používat pro vývojové prostředí
  • Nevolejte helper env() mimo konfigurační soubory

Pokud zakešujete konfiguraci, některé věci jako například testy využijí tyto zakešované hodnoty. V případě, že vaše databázové přístupy budou zakešované a spustíte testy s databázovými interakcemi, vaše databázové tabulky můžou být smazány pro účely testů.

Měli byste se vyvarovat použití metody env() mimo konfigurační soubory. Helper config() používejte kdykoliv kdy potřebujete získat přístup ke konfiguraci. Správný přístup k získání konfiguračních hodnot v aplikaci je využít kombinaci konfiguračních souborů s enviromentálními proměnnými.

Konfigurační cache můžete promazat pomocí příkazu:

$ php artisan config:clear

Jako tradičně se více dozvíte v oficiální Laravel dokumentaci o konfiguraci. Pokud si chcete vytvořit vlastní balíček, pak si přečtěte dokumentaci o nastavení konfigurace v balíčku.