Proč nepoužívat funkci env() v kontrolerech

Laravel - env - konfigurační soubory


Autor Pavel Zaněk

7. 8. 2022

Obsah článku

Výchozí soubor .env v MVC frameworku Laravel obsahuje běžné konfigurační hodnoty, které se mohou lišit v závislosti na tom, zda vaše aplikace běží lokálně nebo na produkčním webovém serveru. Tyto hodnoty jsou pak načteny z různých konfiguračních souborů Laravelu v adresáři „config“ pomocí Laravel funkce env. U pár projektů postavených na frameworku Laravel jsem si všiml, že kontrolery obsahují právě funkci env bez využití konfiguračních souborů v adresáři „config“. Proto jsem se rozhodl napsat tento článek, který bude zaměřený, proč byste tuto funkci neměli využívat ve Vašich kontrolorech, ale proč bystě měli nejdříve data z .env souboru načítat přes konfigurační soubory (adresář config).

Funkce env() v kontroleru

Pojďme se spolu podívat na příklad, kdy v rámci kontroleru máme metodu index, která nám vrátí v rámci response URL adresu aplikace.

<?php

namespace App\Http\Controllers;

class HomepageController extends Controller
{
    public function index()
    {
        return env('APP_URL');
    }
}

Env funkce nám získá hodnotu uvedenou v .env souboru (root složka projektu).

APP_URL="https://test.com"

Výstupem kontroleru by tedy byla response s hodnotou „https://test.com“.

Jedná se o jednoduchý příklad, který Vám bude fungovat – tedy response opravdu vrátí danou hodnotu. Nicméně problém by nastal v případě, pokud začnete Vaši aplikaci, resp. konfigurační soubory cachovat.

Konfigurační soubory a cache

Chcete-li své aplikaci zvýšit rychlost, měli byste všechny své konfigurační soubory uložit do jednoho souboru pomocí Artisan příkazu config:cache.

Tím se zkombinují všechny možnosti konfigurace pro vaši aplikaci do jednoho souboru, který může framework rychle načíst.

V dokumentaci se pak můžete dočíst, že po uložení konfigurace do cache nebude soubor .env načten; proto „funkce env vrátí pouze externí proměnné prostředí na systémové úrovni“.

Pokud tedy pracujete na aplikaci, uvedete si hodnoty do .env souboru, spustíte cache pro konfigurační soubory a posléze upravíte .env (úprava hodnoty/nová hodnota), response kontroleru již bude prázdná a Vám tak aplikace nebude fungovat.

Konfigurační soubory

Laravel obsahuje adresář „config“, kde naleznete veškeré konfigurační soubory spojené s Laravel aplikací. Můžete zde nalézt výchozí konfigurační soubory Laravelu, ale také zde můžete zpravidla najít konfigurační soubory balíčků (např. Spatie Media Library Vám po instalaci nabídne vytvořit konfigurační soubor do tohoto adresáře pomocí Artisan příkazu – php artisan vendor:publish –provider=“Spatie\MediaLibrary\MediaLibraryServiceProvider“ –tag=“config“).

Pokud se například rozhodneme načítat URL adresu aplikace korektně pomocí konfiguračních souborů (abychom neztratili možnost cachování), budeme muset načítat hodnotu z .env souboru nejdříve do konfiguračního souboru, který posléze využijeme v našem kontroleru.

U URL adresy aplikace již nemusíme vytvářet nový konfigurační soubor, ale použijeme již výchozí soubor (ve kterém už je dokonce hodnota z .env souboru uvedena (proměnná „APP_URL“)).

V adresáři config můžete vidět soubor app.php. Jedná se o konfigurační soubor, který obsahuje základní nastavení naší aplikace.

Můžete si všimnout, že je zde uvedeno pole obsahující klíče a k nim příslušné hodnoty. V poli můžete vidět index/klíč „url“, kde se nám dotahují data z .env souboru.

<?php

...

return [

    ....

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => env('APP_URL', 'https://test.com'),

    ....

];

Můžete si všimnout, že se dotahuje hodnota ze souboru .env, ale také, pokud zde žádná hodnota není uvedena, se doplní výchozí hodnota, kterou zde uvedete. Resp. druhý parametr funkce env() slouží pro určení výchozí hodnoty.

Funkce config() v kontroleru

Pojďme tedy tento konfigurační soubor v našem kontroleru použít.

<?php

namespace App\Http\Controllers;

class HomepageController extends Controller
{
    public function index()
    {
        return config('app.url');
    }
}

Ano, opravdu stačí nahradit funkci env() za funkci config(). Po této úpravě již můžete cachovat Vaše konfigurační soubory pomocí php artisan config:cache.

Další články

Autor Pavel Zaněk

Tvořím webové stránky s velkou oblibou v online marketingu - především v odvětví optimalizace pro vyhledávače (SEO). Především se specializuji na tvorbu webových aplikací na míru (PHP framework Laravel s využitím dalších moderních technologií) a na tvorbu webových stránek s použitím redakčního systému Wordpress. Ačkoliv se více zaměřuji na logiku webových aplikací (back end), jsem schopný tvořit i moderní a responzivní šablony v rámci webové grafiky (front end).

7. 8. 2022