Knihova pro praci s nastavenim
- holantomas
- Člen | 55
Zdravim,
nekolikrat jsem se v projektech setkal s tim ze jsem musel nastavit nejakou
konstantu. Zatim nikdy, ale nebyla potreba ji menit, kazdopadne jsem si do
budoucna napsal knihovnu pro praci s nastavenim. A jelikoz je to v podstate
moje prvni knihovna pro nette a celkove OOP PHP, tak bych chtel vedet
vas nazor.
Knihovna(Options.php):
<?php
namespace System;
/**
* Class for work with options
*
* @author Tomas Holan <mail@tomasholan.eu>
* @copyright (c) 2014 Tomas Holan
* @version 1.0
*/
class Options extends \Nette\Object {
/** @var array */
private $options = NULL;
/** @var array */
private $updates = NULL;
/** @var array */
private $removes = NULL;
/** @var string Datetime of last download */
private $last = '1970-01-01 00:00:00';
/** @var \System\IOptionsControl */
private $control;
/** @var \Nette\Http\SessionSection */
private $session = NULL;
/**
* Class constructor
*
* @param \System\IOptionsControl $control Nette session section for cache
* @param \Nette\Http\SessionSection $session Instance of control class
*/
public function __construct(\System\IOptionsControl $control, \Nette\Http\SessionSection $session = NULL) {
$this->control = $control;
$this->session = $session;
}
/**
* Factory creating instance of this class
*
* @param \System\IOptionsControl $control Instance of control class
* @param \Nette\Http\SessionSection $session Nette session section for cache
* @return \System\Options
*/
static public function factory(\System\IOptionsControl $control, \Nette\Http\SessionSection $session = NULL){
return new \System\Options($control, $session);
}
/**
* Attach new options
*
* @param string $key
* @param string $value
* @return void
*/
public function attach($key, $value){
$this->options[$key] = $value;
}
/**
* Initialize options (set last download time)
*
* @return \System\Options
*/
public function init(){
if(isset($this->session->options)){
$this->options = $this->session->options;
$this->last = $this->session->last;
}elseif($this->options){
$this->last = date('Y-m-d H:i:s');
if($this->session instanceof \Nette\Http\SessionSection){
$this->session->options = $this->options;
$this->session->last = $this->last;
}
}else{
throw new \Nette\InvalidStateException('Options data missing.');
}
return $this;
}
/**
* Update options
*
* @return void
*/
private function update(){
if(!is_null($this->updates)){ array_merge($this->options, $this->updates);}
if(!is_null($this->removes)){ array_diff_key($this->options, array_flip($this->removes));}
$this->session->options = $this->options;
$this->last = date('Y-m-d H:i:s');
$this->session->last = $this->last;
}
/**
* Check for options updates
*
* @return void
*/
public function check(){
$this->control->check();
$this->update();
}
/**
* Get option
*
* @param string $key Key of option
* @return string Value of option
* @throws \Nette\InvalidArgumentException
*/
public function get($key) {
if (array_key_exists($key, $this->options)) {
return $this->options[$key];
} else {
throw new \Nette\InvalidArgumentException('Options key "' . $key . '" doesn\'t exist. ');
}
}
/**
* Set value to option
*
* @param string $key Key of option
* @param string $value Value of option
* @return void
*/
public function set($key, $value) {
$this->updates[$key] = $value;
}
/**
* Remove option
*
* @param type $key
* @return void
* @throws \Nette\InvalidArgumentException
*/
public function remove($key){
if (array_key_exists($key, $this->options)) {
$this->removes[] = $key;
} else {
throw new \Nette\InvalidArgumentException('Options key "' . $key . '" doesn\'t exist. ');
}
}
/**
* Take changes back
*
* @return void
*/
public function rollback(){
$this->updates = NULL;
$this->removes = NULL;
}
/**
* Commit changes
*
* @return boolean
*/
public function commit(){
if($this->control->commit()){
$this->update();
return TRUE;
}
return FALSE;
}
/**
* Return list of all Options
*
* @return array
*/
public function getOptions() {
return $this->options;
}
/**
* Return list of all Updates
*
* @return array
*/
public function getUpdates() {
return $this->updates;
}
/**
* Return list of all Removes
*
* @return array
*/
public function getRemoves() {
return $this->removes;
}
/**
* Return datetime of last download
*
* @return string Datetime of last download
*/
public function getLast(){
return $this->last;
}
}
Interface pro tridu ovladajici knihovnu(IOptionsControl.php):
<?php
namespace System;
/**
*
* @author Tomas Holan <mail@tomasholan.eu>
* @copyright (c) 2014 Tomas Holan
* @version 1.0
*/
interface IOptionsControl {
/**
* Setup function for options
*
* @param \Nette\Http\SessionSection $session Session section for cache
* @return \System\Options
*/
public function setup(\Nette\Http\SessionSection $session = NULL);
/**
* Check for options updates
*
* @return void
*/
public function check();
/**
* Commit changes
*
* @return boolean
*/
public function commit();
}
Trida ovladajici knihovnu(Jde v podstate o tovarnicku → OptionsControl.php)
<?php
namespace System;
/**
* Options Control
*
* @author Tomas Holan <mail@tomasholan.eu>
*/
class OptionsControl implements \System\IOptionsControl {
/** @var School\OptionsRepository */
private $repository;
public function __construct(\School\OptionsRepository $repository) {
$this->repository = $repository;
}
/** @var \System\Options */
private $options;
/**
* Setup options
*
* @param \Nette\Http\SessionSection $session
* @return \System\Options
*/
public function setup(\Nette\Http\SessionSection $session = NULL) {
$data = array();
$this->options = \System\Options::factory($this, $session);
if (!isset($session->options)) {
$data = $this->repository->get();
}
$this->attaching($data);
return $this->options->init();
}
/**
* Commit changes
*
* @return boolean
*/
public function commit() {
$data = array();
if ($this->options->getUpdates()) {
foreach ($this->options->getUpdates() as $key => $value) {
$data[] = array(
'key' => $key,
'value' => $value,
);
}
}
$removes = $this->options->getRemoves();
$this->repository->connection->begin();
$set = !empty($data) ? $this->repository->set($data) : TRUE;
$remove = $removes ? $this->repository->remove($removes) : TRUE;
if ($set AND $remove) {
$this->repository->connection->commit();
return TRUE;
}
return FALSE;
}
/**
* Check for options updates
*
* @return void
*/
public function check() {
$last = $this->options->getLast();
$data = $this->repository->get($last);
$this->attaching($data);
}
/**
* Attach all options
*
* @param array $data
* @return void
*/
private function attaching(array $data) {
foreach ($data as $option) {
$this->options->attach($option->key, $option->value);
}
}
}
config.neon
services:
options: System\OptionsControl(@optionsRepository)
Pouziti napr. v presenteru:
$this->options = $this->context->options->setup($this->getSession('options')); // Nastartovani knihovny
$this->options->check(); // Kontrola aktualizaci
$this->options->set('item-count', 45); // Nastavi pocet polozek na 45
$this->options->remove('max-users'); // Uplne smazani 'max-users'
$this->options->commit(); // Commit zmen
$this->options->rollback(); // Vrati zmeny do puvodniho stavu
$this->options->get('item-count') // Vrati '45'
- holantomas
- Člen | 55
Prvni dekuji za odpoved. Ale dalo by se to nejak definovat presneji co se vam nelibi. Preci jenom jsou to v podstate pravidla jak by to melo fungovat/vypadat. Me se stylistika kodu libi a vse funguje, projit celou stranku a kontrolovat to s mym kodem by bylo casove narocne. Samozrejme si stranku prostuduji a priste se chybam vyvaruji.
Dekuji
- MartinitCZ
- Člen | 580
Jde o to, že nepoužíváš stejná pravidla odřákování, mezer … po celý kod. Viz:
set($key, $value) {
// vs
remove($key){
///////////////////////////////
if (array_key_exists($key, $this->options)) {
// vs
if($this->control->commit()){
Tohle zarovnání:
$this->options = $this->session->options;
$this->last = $this->session->last;
Místo AND nebo OR je lepší použít && nebo ||. ;)
Editoval MartinitCZ (10. 7. 2014 11:22)
- holantomas
- Člen | 55
MartinitCZ napsal(a):
Místo AND nebo OR je lepší použít && nebo ||. ;)
Aha ja si vzdy myslel ze je to prave naopak.
Dobre co se tyce stylistiky, opravim. A jinak neco do funknosti nemate?
- David Kudera
- Člen | 455
Na některých místech zbytečně uvádíš celé namespace.
namespace System;
/**
* Options Control
*
* @author Tomas Holan <mail@tomasholan.eu>
*/
class OptionsControl implements \System\IOptionsControl {
}
ale stačí jen
namespace System;
/**
* Options Control
*
* @author Tomas Holan <mail@tomasholan.eu>
*/
class OptionsControl implements IOptionsControl {
}
Pak kdyby jsi chtěl namespace změnit, musel by jsi na spoustě míst. A na
ostatních místech je lepší použít use
místo absolutního
namespace. Dokumentace
Editoval David Kudera (10. 7. 2014 11:49)
- ViPEr*CZ*
- Člen | 817
Na první pohled se mi nelíbí použití context:
$this->options = $this->context->options->setup($this->getSession('options')); // Nastartovani knihovny
Tohle v tom použití:
$this->options->rollback(); // Vrati zmeny do puvodniho stavu
vypadá spíše na setDefault(); ? Po úspěšném commit bych to tak spíše očekával.
Proměnnou
/** @var \System\Options */
private $options;
posunout nad konstruktor a konstruktoru dát phpDoc.
- David Kudera
- Člen | 455
Taky jestli to má být použitelný u více projektů, tak by se hodilo
nevyžadovat nějaký optionsRepository
, který je nejspíše
přímou součástí jednoho projektu v namespace School
. Spíš
myslím, že by byla lepší nějaká „mezitřída“ s pevně daným
rozhraním pro tuhle knihovnu
Editoval David Kudera (10. 7. 2014 11:56)
- holantomas
- Člen | 55
David Kudera napsal(a):
Na některých místech zbytečně uvádíš celé namespace.
Priznam se ze v namespace zatim trochu plavu, ale tohle jsem si mohl uvedomit.
Filip Procházka napsal(a):
Já se přiznám, že jsem moc nepochopil, k čemu je to dobré.
Napriklad potrebuji tisknout vysvedceni, kde je datum posledni vycovaci hodiny prvniho a druheho pololeti, ktere musi byt na vysvedceni uvedeno. Jenze to se kazdy rok meni. Musel bych tedy jit kazdy rok do zdrojaku a upravovat to. A toto datum potrebuji i na vice mistech. Proto jsem se rozhodl pro budouci moznost vyuziti rozhodl napsat neco co mi praci usnadni.
ViPErCZ napsal(a):
Na první pohled se mi nelíbí použití context
Co presne se vam nelibi? Potrebuji vytahnout sluzbu a jinou cestu neznam. A taky upozornuji ze mam Nette 2.0.10.
Dale funkci rollback()
jste spatne pochopil(moje chyba). Ta je
tu stejna jako u MySQL transakci. Pokud pouziji set()
nebo
remove()
a pak z nejakeho duvodu chci tyto zmeny zrusit pouziji
rollback()
jinak pouziji commit()
pro
potvrzeni zmen.
Tedy:
<?php
$this->options->set('neco', 'test');
$this->options->remove('neco2');
if($test){
$this->options->commit();
}else{
$this->options->rollback();
}
?>
Vlastnost private $option
je uklik, prehled jsem
konstruktor.
Editoval holantomas (10. 7. 2014 12:13)
- holantomas
- Člen | 55
David Kudera napsal(a):
Taky jestli to má být použitelný u více projektů, tak by se hodilo nevyžadovat nějaký
optionsRepository
, který je nejspíše přímou součástí jednoho projektu v namespaceSchool
. Spíš myslím, že by byla lepší nějaká „mezitřída“ s pevně daným rozhraním pro tuhle knihovnu
No a k tomu slouzi trida OptionsControl
, ktera implementuje
rozhrani IOptionsControl
. Tedy OptionsControl
je
uzivatelsky definovana mezi-trida, mezi tridou Options
a modelem
aplikace.
- David Kudera
- Člen | 455
holantomas napsal(a):
David Kudera napsal(a):
Taky jestli to má být použitelný u více projektů, tak by se hodilo nevyžadovat nějaký
optionsRepository
, který je nejspíše přímou součástí jednoho projektu v namespaceSchool
. Spíš myslím, že by byla lepší nějaká „mezitřída“ s pevně daným rozhraním pro tuhle knihovnuNo a k tomu slouzi trida
OptionsControl
, ktera implementuje rozhraniIOptionsControl
. TedyOptionsControl
je uzivatelsky definovana mezi-trida, mezi tridouOptions
a modelem aplikace.
Jo už to vidím. Nijak zvlášť jsem to nezkoumal. Možná je to tím, že bych tak nějak čekal, že ta třída Options bude v konstruktoru čekat na OptionsControl (což máš), ale bude zároveň registrovaná jako služba, která se dál používá. A ten OptionsControl si uvnitř sám sebe sám vytvoří Options.
Takhle máš nějakou (tušil jsem, že hlavní) třídu Options, která má v sobě něco, zároveň čeká na OptionsControl, který se dál (např. v presenteru) používá. Takže pro každý projekt to může být vždy klidně i jiná implementace.
No a nějak jsem prostě čekal, že ta třída Options je tou, která se používá zvenku, ale interně si sahá do OptionsControl, který dostane v konstruktoru a který se může měnit projekt od projektu..
Snad jsem to napsal aspoň trochu srozumitelně.. Jednoduše mi to přijde trochu zbytečně zamotanější
Edit: přirovnal bych to třeba k nějakému gridu, který tu je. Ty čekají, že se jim dá nějaký DataSource objekt, který umí pracovat s DB a dává gridu data v jednotné podobě (zjednodušeně). Potom, když chci grid vykreslit a použít, tak mu dám svůj DataSource a vykreslím grid. Ve tvém případě ale vezmu DataSource, ten si sám vytvoří grid uvnitř a nakonec ten DataSource i vykreslím
Editoval David Kudera (10. 7. 2014 12:32)
- holantomas
- Člen | 55
David Kudera napsal(a):
holantomas napsal(a):
David Kudera napsal(a):
Taky jestli to má být použitelný u více projektů, tak by se hodilo nevyžadovat nějaký
optionsRepository
, který je nejspíše přímou součástí jednoho projektu v namespaceSchool
. Spíš myslím, že by byla lepší nějaká „mezitřída“ s pevně daným rozhraním pro tuhle knihovnuNo a k tomu slouzi trida
OptionsControl
, ktera implementuje rozhraniIOptionsControl
. TedyOptionsControl
je uzivatelsky definovana mezi-trida, mezi tridouOptions
a modelem aplikace.Jo už to vidím. Nijak zvlášť jsem to nezkoumal. Možná je to tím, že bych tak nějak čekal, že ta třída Options bude v konstruktoru čekat na OptionsControl (což máš), ale bude zároveň registrovaná jako služba, která se dál používá. A ten OptionsControl si uvnitř sám sebe sám vytvoří Options.
Takhle máš nějakou (tušil jsem, že hlavní) třídu Options, která má v sobě něco, zároveň čeká na OptionsControl, který se dál (např. v presenteru) používá. Takže pro každý projekt to může být vždy klidně i jiná implementace.
No a nějak jsem prostě čekal, že ta třída Options je tou, která se používá zvenku, ale interně si sahá do OptionsControl, který dostane v konstruktoru a který se může měnit projekt od projektu..
Snad jsem to napsal aspoň trochu srozumitelně.. Jednoduše mi to přijde trochu zbytečně zamotanější
Zase jsi pochopil spatne. Jelikoz chci tak nejak pekne dostat repozitar do
OptionsControl
, tak ji spoustim jako sluzbu v neonu. Pak nasledne
pouziji funkci setup()
z tridy OptionsControl
, ktera
vraci instanci/objekt tridy Options
tedy, zvenku se nasledne
pracuje s tridou Options
, ktera si interne vola funkce z
OptionsControl
pro praci s ulozistem, at uz je to DB nebo textak
(tedy podle toho jak si uzivatel napise onu tridu
OptionsControl
).
- David Kudera
- Člen | 455
omg.. jo sorry :-D metody setup i init jsem si měl prohlídnout pořádně než něco napíšu. Nicméně za tím zbytečným zamotáním si teda stojím
- holantomas
- Člen | 55
David Kudera napsal(a):
omg.. jo sorry :-D metody setup i init jsem si měl prohlídnout pořádně než něco napíšu. Nicméně za tím zbytečným zamotáním si teda stojím
No zamotani uz vidim jen v tom ze bych si mel spustit Options
jako sluzbu misto OptionsControl
. Jinak bych rekl ze je to
v poradku. Do Options
si taham instanci
OptionsControl
, kde si nasledne volam jeji funkce pro praci
s DataSource.
- David Kudera
- Člen | 455
Jj přesně tak.. Myslím, že by se ti to mohlo docela zjednodušit a zpřehlednit
- holantomas
- Člen | 55
David Kudera napsal(a):
Jj přesně tak.. Myslím, že by se ti to mohlo docela zjednodušit a zpřehlednit
Takze abych si to zopakoval
- Vytvorit
Options
jako sluzbu a v konstruktoru ji predat instanci repositare (konkretneSchool\OptionsRepository
) - V konstroktoru
Options
si vytvorit objektOptionsControl
a predat mu instanci repositare - A pak uz jen vytvorit v
Options
metodu, ktera zavolaOptionsControl::setup()
Chapu to tedy dobre?
Editoval holantomas (10. 7. 2014 13:32)
- David Kudera
- Člen | 455
Tím to ale nebude přenositelný do jinýho projektu, protože vytvoříš závislost na OptionsRepository z tvého aktuálního projektu.
- Options jako služba a v konstruktoru ji předat instanci OptionsControl, která implementuje IOptionsControl
- Registrovat si OptionsControl taky jako službu a jí předat přes konstruktor OptionsRepository
- Tohle je na tobě
Jo a k jedničce, v konstruktoru Options nepožaduj přímo OptionsControl, ale jen IOptionsControl, aby jsi mohl třeba v jiným projektu předat jinou implementaci
Editoval David Kudera (10. 7. 2014 14:14)
- holantomas
- Člen | 55
David Kudera napsal(a):
Tím to ale nebude přenositelný do jinýho projektu, protože vytvoříš závislost na OptionsRepository z tvého aktuálního projektu.
- Options jako služba a v konstruktoru ji předat instanci OptionsControl, která implementuje IOptionsControl
- Registrovat si OptionsControl taky jako službu a jí předat přes konstruktor OptionsRepository
- Tohle je na tobě
Aha ok
David Kudera napsal(a):
Jo a k jedničce, v konstruktoru Options nepožaduj přímo OptionsControl, ale jen IOptionsControl, aby jsi mohl třeba v jiným projektu předat jinou implementaci
Vsak pozaduji IOptionsControl
:)
- David Kudera
- Člen | 455
holantomas napsal(a):
David Kudera napsal(a):
Tím to ale nebude přenositelný do jinýho projektu, protože vytvoříš závislost na OptionsRepository z tvého aktuálního projektu.
- Options jako služba a v konstruktoru ji předat instanci OptionsControl, která implementuje IOptionsControl
- Registrovat si OptionsControl taky jako službu a jí předat přes konstruktor OptionsRepository
- Tohle je na tobě
Aha ok
David Kudera napsal(a):
Jo a k jedničce, v konstruktoru Options nepožaduj přímo OptionsControl, ale jen IOptionsControl, aby jsi mohl třeba v jiným projektu předat jinou implementaci
Vsak pozaduji
IOptionsControl
:)
Jj já to k té jedničce jen zapomněl napsat, tak pro jistotu ;-)
- holantomas
- Člen | 55
David Kudera napsal(a):
Jj já to k té jedničce jen zapomněl napsat, tak pro jistotu ;-)
Tak dekuji vsem za pomoc a rady.
- ViPEr*CZ*
- Člen | 817
Myslím, že v téhle verzi by už mohlo jít inject* namísto použití
contextu.
Ten rollBack jsem asi blbě pochopil z toho příkladu, omlouvám se… neměl
jsem příliš čas studovat co přesně ta metoda dělá.
Ukliknutí chápu.
holantomas napsal(a):
David Kudera napsal(a):
Na některých místech zbytečně uvádíš celé namespace.
Priznam se ze v namespace zatim trochu plavu, ale tohle jsem si mohl uvedomit.
Filip Procházka napsal(a):
Já se přiznám, že jsem moc nepochopil, k čemu je to dobré.
Napriklad potrebuji tisknout vysvedceni, kde je datum posledni vycovaci hodiny prvniho a druheho pololeti, ktere musi byt na vysvedceni uvedeno. Jenze to se kazdy rok meni. Musel bych tedy jit kazdy rok do zdrojaku a upravovat to. A toto datum potrebuji i na vice mistech. Proto jsem se rozhodl pro budouci moznost vyuziti rozhodl napsat neco co mi praci usnadni.
ViPErCZ napsal(a):
Na první pohled se mi nelíbí použití context
Co presne se vam nelibi? Potrebuji vytahnout sluzbu a jinou cestu neznam. A taky upozornuji ze mam Nette 2.0.10.
Dale funkci
rollback()
jste spatne pochopil(moje chyba). Ta je tu stejna jako u MySQL transakci. Pokud pouzijiset()
neboremove()
a pak z nejakeho duvodu chci tyto zmeny zrusit pouzijirollback()
jinak pouzijicommit()
pro potvrzeni zmen.Tedy:
<?php $this->options->set('neco', 'test'); $this->options->remove('neco2'); if($test){ $this->options->commit(); }else{ $this->options->rollback(); } ?>
Vlastnost
private $option
je uklik, prehled jsem konstruktor.
- holantomas
- Člen | 55
Jeste bych se chtel zeptat, jak do knihovny pres config.neon dostanu session. Tedy udelal jsem to jako pise David Kudera .
A v config.neon mam:
services:
optionsControl: System\OptionsControl(@optionsRepository)
options: System\Options(@optionsControl)
Jenze do System\Options
bych potreboval jeste druhy parametr a
to DI session, protoze kdyz uz to resim takto, tak bych chtel aby se sluzba
nastartovala plne automaticky. Jde to nejak?
- David Kudera
- Člen | 455
holantomas napsal(a):
Jeste bych se chtel zeptat, jak do knihovny pres config.neon dostanu session. Tedy udelal jsem to jako pise David Kudera .
A v config.neon mam:
services: optionsControl: System\OptionsControl(@optionsRepository) options: System\Options(@optionsControl)
Jenze do
System\Options
bych potreboval jeste druhy parametr a to DI session, protoze kdyz uz to resim takto, tak bych chtel aby se sluzba nastartovala plne automaticky. Jde to nejak?
buď si injekneš celou session:
class Options
{
public function __construct(IOptionsControl $optionsControl, Session $session)
{
}
}
services:
Options:
class: System\Options
a nebo si vložíš jen sekci ze session:
class Options
{
public function __construct(SessionSection $sessionSection, IOptionsControl $optionsControl)
{
}
}
services:
Options:
class: System\Options(@session::getSection('options'))
jo a nemusíš uvádět v konfiguraci názvy služeb pro vložení (např. do konstruktoru), nette je vloží samo a ušetříš si psaní
Edit: v 2. příkladu jsem prohodil pořadí argumentů v konstruktoru, aby jsi další služby nemusel uvádět v konfiguraci
Editoval David Kudera (10. 7. 2014 16:55)
- holantomas
- Člen | 55
David Kudera napsal(a):
jo a nemusíš uvádět v konfiguraci názvy služeb pro vložení (např. do konstruktoru), nette je vloží samo a ušetříš si psaní
A to mi rikate az ted? :D
Diky i tak se mi bude hodit znat ten zapis pro inject session.
Editoval holantomas (10. 7. 2014 17:41)
- David Kudera
- Člen | 455
holantomas napsal(a):
David Kudera napsal(a):
jo a nemusíš uvádět v konfiguraci názvy služeb pro vložení (např. do konstruktoru), nette je vloží samo a ušetříš si psaní
A to mi rikate az ted? :D
Diky i tak se mi bude hodit znat ten zapis pro inject session.
Ups.. :-D
Vlastně to jde i ještě víc zkrátit. Názvy služeb bývají taky většinou zbytečný
services:
- System\OptionsControl
- System\Options(@Nette\Http\Session::getSection('options')) # takhle se v neonu přistoupí ke službě i bez zadání jejího názvu
jen si teď nejsem jistý, jestli služby bez názvů jsou až od nette 2.2 nebo ne..
- holantomas
- Člen | 55
David Kudera napsal(a):
holantomas napsal(a):
David Kudera napsal(a):
jo a nemusíš uvádět v konfiguraci názvy služeb pro vložení (např. do konstruktoru), nette je vloží samo a ušetříš si psaní
A to mi rikate az ted? :D
Diky i tak se mi bude hodit znat ten zapis pro inject session.
Ups.. :-D
Vlastně to jde i ještě víc zkrátit. Názvy služeb bývají taky většinou zbytečný
services: - System\OptionsControl - System\Options(@Nette\Http\Session::getSection('options')) # takhle se v neonu přistoupí ke službě i bez zadání jejího názvu
jen si teď nejsem jistý, jestli služby bez názvů jsou až od nette 2.2 nebo ne..
Diky za info. Je nekde nejaky changelog kde je prehledne videt co je v nette noveho?
- ViPEr*CZ*
- Člen | 817
Ještě v anglické části fóra to najdeš: https://forum.nette.org/…cements-news
Služby bez názvů jsou myslím od 2.1.x. Jinak když se definuje služba, tak
není potřeba uvádět parametry s tím zavináčem a je lepší využít tzv.
autowiringu, kdy nette podle typehintu vyhledá danou instanci.
Viz. jak psal David Kucera:
services:
Options:
class: System\Options