Config Loader – Konfigurace pro každý presenter zvlášť

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Xethilos
Člen | 19
+
0
-

Potřeboval jsem nějaký konfigurační načítač, který by shromáždil všechny informace, extrahoval do souboru potřebné překlady (Pro PoEdit), parametry v konfigu, práva atd. Odhodlal jsem se to sdílet poprvé na GitHubu a možná se vám to bude hodit a ušetřím vám nějakou tu hodinku.

Ukázka jednoduchého configu v neonu (add.neon):

parameters:
    limitPerPage: 20
    array:
        nette: yes
component: 'Components\Class'
model: 'Model\Model'
menu:
    parent: [name: 'Advertisement',
            icon: 'pe-7s-display1']
    childrens: [[name: 'Add',
            url: 'Advertisement:add',
            icon: 'pe-7s-plus'],

            [name: 'List',
            url: 'Advertisement:',
            icon: 'pe-7s-keypad']]
authorizator:
    resources:
        news: 'News'
    privileges:
        news:
            add: 'Add'
            edit: 'Edit'
            delete: 'Delete'

Načtení loaderu (Bez použití Extenze):

<?php
$writer = new GettextWriter(__DIR__ . '/translations/translations.php'); // Extrahuje všechny překlady z configu do tohoto souboru
$config = new ConfigLoader($appDir, '/configs'); // Načte všechny configy z této cesty a všech podadresářů

$config->setCache($cache); // Nastavení keše, nepovinný parameter, ale celkem důležitý

$config->setWriter($writer); // Nastavení gettextového zapisovače

$config->add('component', function ($values, array $previousValues, $namespace) {
	$namespace; // Název config = add.neon = Add ||| add.namespace.neon = AddNamespace
	$values; // Hodnoty z položky (Component\Class)

	foreach ($values as $name => $class) {
        if (!class_exists($class)) {
            throw new Exception("Component '$class' does not exist for '$namespace'.");
        }
    }

	$previousValues = $values;

	return $values;
}); // Vlastní zpracování položky component

$config->execute(); // Zpracování a dodatečné chování keše

?>

Instalace pomocí konfiguračního neonu:

extensions:
	configLoader: ConfigExtension

Parametry v neonu:

configLoader:
	writer: # Gettext writer
		use: yes # Zda má být použit
		execution: GettextWriter::REWRITE # Soubor bude vždy přepsán
	cache:
		use: yes # Zda má být použit
	loader:
		directory: '/addons/configs' # Přeloží se jako cesta %appDir%/addons/configs
		execution: ConfigLoader::CHECK # Kontroluje zda jsou soubory novější než keš, lze vypnout ConfigLoader::DISABLE
		addons:
			services: Services::loader # Název addonu pro vlastní extrátor s callbackem

Tyto hodnoty jsou i jako výchozí

Hodnoty které obsahuje třída:

<?php
array (7)
    models => array (1)
        0 => "Model\Model" (11)
    routers => array ()
    resources => array (1)
        news => "News" (4)
    privileges => array (1)
        news => array (3)
            add => "Add" (3)
            edit => "Edit" (4)
            delete => "Delete" (6)
    menu => array (1)
        0 => array (2)
            parent => array (1) [ ... ]
            childrens => array (2) [ ... ]
    parameters => array (1)
        Add => Settings
            values protected => array (2) [ ... ]
            filePath protected => ".../config/add.neon" (92)
            namespace protected => "Add" (3)
            cache => Cache #6d6c { ... }
    components => array(1)
        0 => 'Component\Class'
?>

Získání hodnot:

<?php
$config->components;
$config->privileges;
// atd.
?>

Parametery:

<?php
$parameters = $config->getParameters('Add'); // Získání parameterů obsažené v add.config
$config->getParameters($presenter->name); // Získání parameterů v configu s názvem presenteru
?>

Práce s parametery:

<?php
$parameters['limitPerPage']; // Dostaneme 20
$parameters->change(array('limitPerPage' => 50)); // Změna limitu + uložení do souborů v configu + změna v keši
?>

Gettext writer:

<?php
$writer = new GettextWriter(__DIR__ . '/translations/translations.php');

$writer->setExecution($writer::DISABLED); // Vypnutí zapisovače
$writer->setExecution($writer::CHECK); // Když soubor existuje nic nezapíše
$writer->setExecution($writer::REWRITE); // Pokaždé soubor přepíše

$translate = array('Add', 'Edit', 'Writer');

$writer->add($translate);
$writer->add('Delete');

/**
Soubor translations.php

<?php
_('Add');
_('Edit');
_('Writer');
_('Delete');
*/
?>

GitHub

Editoval Xethilos (10. 11. 2014 16:45)