Konfigurace frameworku

Přehled všech konfiguračních voleb v Nette Frameworku.

Nette umožňuje nastavovat aplikaci pomocí konfiguračních souborů. Ty se obykle zapisují ve formátu NEON. Vyzkoušejte si si jeho syntaxi.

Uživatelé

Uvedením pole users vytvoříme SimpleAuthenticator, uvedením polí roles nebo resources vytvoříme autorizátor Nette\Security\Permission.

security:
    debugger: true  # panel v Debugger baru

    users:
        frantisek: tajneheslo

    roles:
        guest:
        member:
        admin: [member]  # admin dědí od membera

    resources:
        file:

Application

Chyby

errorPresenter říká, jaký presenter se má zavolat, dojde-li v naší aplikaci k chybě. Jak takový presenter může vypadat, najdeme v sandboxu. Parametr catchExceptions ovlivňuje, zda dojde k zavolání error presenteru. Změnou hodnoty na true můžeme v debug módu ověřit správnou funkčnost error presenteru.

application:
    debugger: true # panel do Tracy
    errorPresenter:  ...  # default: Nette:Error
    catchExceptions: ...  # default: zapnuto v produkčním režimu
    silentLinks: ...      # default: false

Volba silentLinks určuje, jak se Nette zachová v debug módu při tom, když se nepodaří vygenerovat odkaz. Defautlní hodnota false znamená, že Nette vyhodí E_USER_WARNING chybu. Nastavením na true dojde k potlačení této chybové hlášky. V produkčním prostředí se E_USER_WARNING vyvolá vždy.

Toto chování můžeme také ovlivnit nastavením třídní proměnné Presenteru::$invalidLinkMode".

Mapování

Defaultní hodnota: *: *Module\*Presenter (v sandboxu je pak upravená na *: App\*Module\Presenters\*Presenter)

Tento parametr obsahuje pole s pravidly pro přepis názvu presenteru na název třídy. Klíč v poli obsahuje název modulu, pro který se má toto pravidlo uplatnit, nebo * jako fallback pro ostatní moduly. Hodnota pak obsahuje masku pravidla:

application:
    mapping:
        Admin: App\Admin\*Module\*Presenter
        *: App\*Module\Presenters\*Presenter

Presenter Front:Blog:Article je obsažen v modulu Front, pro ten nemáme žádný vlastní mapping, použije se tedy obecný s hvezdičkou a výsledná třída bude App\FrontModule\BlogModule\Presenters\ArticlePresenter. Presenter Admin:User:Edit se nachází v modulu Admin, pro které zde máme oddělený mapping. Výsledný název třídy bude App\Admin\UserModule\EditPresenter (všimněte si, že jelikož je modul Admin již uveden v pravidlech mappingu, ve výsledném názvu třídy bude zahozen).

Automatická registrace presenterů

Nette automaticky registruje presentery jako služby, což poté zrychlí jejich vytváření. Je zde několik konfiguračních možností, které určují, kde a jak bude Nette tyto presentery hledat.

Parametr scanComposer určuje, zde má Nette hledat presentery v Composer classmap. scanFilter říká, jaký řetězec musí obsahovat třída a název souboru, který bude automaticky registrován.

Hodnota scanDirs udává, v jakých adresářích má Nette hledat presentery pomocí RobotLoaderu. Pokud zapíšeme do konfigurace nějakou hodnotu, bude spojená s tou defaultní, což je %appDir%:

application:
    scanComposer: no  # default: true
    scanFilter: Page  # default: Presenter
    scanDirs:
        - foo

scanDirs pak bude obsahovat hodnoty %appDir% a foo, pokud bychom chtěli skenování adresářů vypnout nebo zcela přepsat, musíme použít modifkátor !, který hodnotu přepíše:

application:
    scanDirs!:
        - foo

scanDirs bude nyní obsahovat pouze hodnotu foo.

Databáze

Povinný prvek je pouze dsn:

database:
        dsn: "sqlite2:%appDir%/models/demo.db"

Framework vytvoří nejen objekt Nette\Database\Connection, ale nastavují mu i pomocné objekty jako reflection & cache a ve vývojářském režimu přidá panel do Tracy baru.

Další nastavení jsou tyto:

database:
    dsn: 'mysql:host=127.0.0.1;dbname=test'
    user: root
    password: password

    options:
        PDO::MYSQL_ATTR_COMPRESS: true
        lazy: true  # navázání připojení až když je poprvé potřeba
        driverClass: .... # třída ovladače databáze

    debugger: true        # zobrazí panel v Tracy baru
    explain:  true        # explain dotazů v Tracy bar
    autowired: true       # povoleno u prvního spojení
    conventions:  discovered # nebo 'static' nebo jméno třídy, výchozí je 'discovered'

V položce options můžete uvádět další hodnoty, které najdete v dokumentaci ovladačů PDO.

V konfiguračním souboru můžeme definovat i více než jedno databázové spojení:

database:
    main:
        dsn: 'mysql:host=127.0.0.1;dbname=test'
        user: root
        password: password

    anotherDb:
        dsn: 'sqlite::memory:'

Každé takto definované spojení vytvoří dvě služby – objekt Nette\Database\Connection pod názvem database.[NAME].connection (tedy v našem případě database.main.connection a database.anotherDb.connection) a objekt Nette\Database\Context pod názvem database.[NAME].context, který se používá při práci s vrstvou Database Explorer.

Služby prvního spojení se předávají přes autowiring, nicméně můžeme to vypnout skrze autowired: no a naopak u jiného spojení zapnout přes autowired: yes.

Služby ostatních spojení, která nejsou autowirovaná, lze předat explicitně v konfiguraci:

services:
    - UserManager(@database.anotherDb.connection) # nebo @database.anotherDb.context

DI kontejner

di:
    debugger: false  # vypne DI panel v Debugger baru

Formuláře

V konfiguračním souboru lze změnit výchozí chybové hlášky.

forms:
    messages:
        EQUAL: 'Please enter %s.'
        FILLED: 'Please complete mandatory field.'
        MIN_LENGTH: 'Please enter a value of at least %d characters.'
        EMAIL: '%label must be valid e-mail'

HTTP hlavičky

http:
    frames: ... # ovlivňuje hlavičku X-Frame-Options

    headers:
        X-Powered-By: MyCMS       # custom HTTP header

    csp:                          # Content Security Policy
        script-src: [
            nonce                 # for browsers that support CSP2
            self, unsafe-inline   # for browsers that support CSP1
        ]

Framework z bezpečnostních důvodů odesílá hlavičku X-Frame-Options: SAMEORIGIN, která říká, že stránku lze zobrazit uvnitř jiné stránky (v elementu IFRAME) pouze pokud se nachází na stejné doméně. To může být v některých situacích nežádoucí (například pokud vyvíjíte aplikaci pro Facebook), chování lze proto vypnout nastavením položky frames: yes. Můžete ovlivňovat i další odesílané hlavičky nastavením http.headers. V tomto příkladě nastavujeme hlavičku Content-Security-Policy která nám dovolí stahovat externí soubory (img, script apod.) pouze z naší domény. Více o hlavičce Content-Security-Policy.

HTTP proxy

Můžete zadat HTTP proxy, aby detekce IP adresy klienta fungovala správně.

http:
    proxy: 127.0.0.1  # IP adresa, rozsah, název hostitele nebo pole těchto hodnot

Šablony Latte

Lze přepínat HTML a XHTML režim šablon a registrovat vlastní Latte makra. Vlastní makra mohou být zaregistrována buď pomocí jména třídy nebo pomocí reference na službu. Jako výchozí je zavolána metoda install, ale to můžete změnit tím, že přidáte dvojtečku a jméno vaší metody.

latte:
    xhtml: yes  # výchozí je no
    macros:
        - App\MyLatteMacros::register  # statická metoda, classname nebo callable
        - @App\MyLatteMacrosFactory    # služba s metodou install
        - @App\MyLatteMacrosFactory::register # služba s metodou register

services:
    - App\MyLatteMacrosFactory

Maily

Standardní mailer je SendmailMailer, uvedením smtp aktivujeme SmtpMailer.

mail:
    smtp: true # zapne SmtpMailer místo SendmailMailer
    # nepovinné nastavení
    host: ...
    port: ...
    username: ...
    password: ...
    secure: # povolené hodnoty jsou ssl, tls nebo null
    timeout: ...

Session

Session standardně vyexpiruje při zavření okna prohlížeče. Dobu expirace nastavíme takto:

session:
    expiration: 14 days

Automatické startování session:

session:
    autoStart: true # výchozí hodnota je 'smart'

Doporučuje se ponechat autoStart: smart, protože pak automaticky startuje session, pouze pokud je již vytvořena.

Na sdílených hostinzích je vhodné zvolit vlastní adresář, kam se mají ukládat soubory s relacemi:

session:
    savePath: "%tempDir%/sessions"

V tomto příkladě se %tempDir% nahradí hodnotou, kterou jste nastavili v $configurator->setTempDirectory() v bootstrap.php.

Pokud chceme platnost session (nebo autentizace) rozšířit na subdomémy, nastavíme ještě parametry cookie:

session:
    cookieDomain: 'example.com'

Lze nastavovat všechny PHP direktivy (ve formátu camelCase).

Tracy debugger

Lze konfigurovat některé parametry Tracy a nastavovat panely do Debugger baru.

tracy:
    email: %webmasterEmail%
    strictMode: true
    editor: ...
    browser: ...
    bar: # panely do Debugger baru
        - Nette\Bridges\DITracy\ContainerPanel # alias DI Container baru
        - IncludePanel
        - XDebugHelper('myIdeKey')
        - MyPanel(@MyService)
    blueScreen: # panely do Laděnky
        - DoctrinePanel::renderException

Low-level úpravy

Všechny uvedené nastavení ovlivňují podobu DI kontejneru a systémových služeb, které vytváří. Všechny tyto služby lze ještě pozměnit na nižší úrovni. Třeba u služby application.application, což je standardně objekt Nette\Application\Application, můžeme změnit třídu:

services:
    application.application:
        factory: MyApplication
        alteration: yes

Příznak alteration je informativní a říká, že jen modifikujeme existující službu.

Můžeme také doplnit setup:

services:
    application.application:
        factory: MyApplication
        alteration: yes
        setup:
            - $onStartup = [@resource::init]

Služby

Konfigurační soubor je místem, kam umísťujeme definice vlastních služeb. Slouží k tomu sekce services, podrobný popis najdete v kapitole DI: konfigurace služeb.

Například takto může vypadat definice služby pojmenované database, což bude instance PDO:

services:
    database: PDO('mysql:host=127.0.0.1;dbname=test', root, password)